web-dev-qa-db-ja.com

放送受信機はカメライベントを受信しません

ユーザーが写真を撮ったことを検出するアプリを作ろうとしています。ブロードキャストレシーバークラスを設定し、次の方法でマニフェストファイルに登録しました。

<receiver Android:name="photoReceiver" >
  <intent-filter>
    <action Android:name="com.Android.camera.NEW_PICTURE"/>
      <data Android:mimeType="image/*"/>
 </intent-filter>
</receiver>

私が何をしようとしても、番組は放送を受信しません。これが私のレシーバークラスです:

public class photoReceiver extends BroadcastReceiver {
  private static final String TAG = "photoReceiver";

@Override
public void onReceive(Context context, Intent intent) {
    CharSequence text = "caught it";
    int duration = Toast.LENGTH_LONG;
    Log.d(TAG, "Received new photo");

    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
 }
}

マニフェストとアクティビティでmimeType行を削除すると、を使用して独自のブロードキャストを送信します。

Intent intent = new Intent("com.Android.camera.NEW_PICTURE");
sendBroadcast(intent);

その後、ブロードキャストを正常に受信し、ログとトーストウィンドウを表示できます。私はこれに正しい方法でアプローチしていますか?追加する必要があるものはありますか?

20
John

私はこれを解決しましたが、別の方法を使用しました。ブロードキャストレシーバーを使用する代わりに、カメラが保存された別のフォルダーにファイルオブザーバーを設定しました。他の方法ほど実用的ではありませんが、それでも問題なく動作します。設定方法は次のとおりです。

FileObserver observer = new FileObserver(Android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/100MEDIA") { // set up a file observer to watch this directory on sd card
            @Override
        public void onEvent(int event, String file) {
            if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched
                Log.d(TAG, "File created [" + Android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/100MEDIA/" + file + "]");
                fileSaved = "New photo Saved: " + file;
            }
        }
    };
    observer.startWatching(); // start the observer
15
John

私はこの方法が100%機能すると確信しています。私は注意深くテストしました。

ブロードキャストレシーバーをAndroidManifestに登録します。上記の回答のほとんどは「categoryAndroid:name = "Android.intent.category.DEFAULT」を見逃しています。BroadcastReceiverはこれなしでは起動できません

  <receiver
    Android:name=".CameraReciver"
    Android:enabled="true" >
        <intent-filter>
            <action Android:name="com.Android.camera.NEW_PICTURE" />
            <action Android:name="Android.hardware.action.NEW_PICTURE" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <data Android:mimeType="image/*" />

        </intent-filter>
    </receiver>

そして最後に、BroadcastReceiverから拡張された「CameraReciver.Java」という名前のクラスを作成します。これが私のコードです。

public class CameraReciver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Log.i("INFO", "Enter BroadcastReceiver");



Cursor cursor = context.getContentResolver().query(intent.getData(),
                null, null, null, null);
        cursor.moveToFirst();
        String image_path = cursor.getString(cursor.getColumnIndex("_data"));
        Toast.makeText(context, "New Photo is Saved as : " + image_path, 1000)
                .show();



}

その後、プロジェクトをエミュレーターにデプロイします(私はgenymotionを使用します)。もちろん、BroadCastReceiverはGUIなしで動作するため、何も起こりませんでした。カメラアプリを開いて、キャプチャボタンをクリックします。すべて問題がなければ、「新しい写真は次のように保存されます:storage/emulated/0/DCIM/Camera /IMG_20140308.jpg」のようなコンテンツで乾杯します。楽しみましょう^ _ ^

カメラで撮影した新しい写真のパスを取得する方法を教えてくれた「tanaykhandelwal」(上記の回答)に感謝します^ _ ^

私の英文法はあまり良くなく、どこか間違っているかもしれませんが、私が何を意味するのか理解できると思います(^ _ ^)。みんなを助けたい

11
VO DUC HUY

ここでチェックアウトする必要があります: ImageTableObserver そしてここ PicasaPhotoUploader 彼らがそれを行う方法。

基本的に、SDカードで何が起こったかを通知するMedia.EXTERNAL_CONTENT_URIのオブザーバーがあり、オブザーバーで、返されたデータが写真であるかどうかを確認します。

camera = new ImageTableObserver(new Handler(), this, queue);
getContentResolver().registerContentObserver(Media.EXTERNAL_CONTENT_URI, true, camera);

少なくともこの方法では、ディレクトリをハードコーディングする必要はありません。

9
Mortimer

こんにちは友人私もキャプチャイベントでいくつかのタスクを実装しようとしていました、そしてそれを研究して取り組んだ後、私はあなたを助けるかもしれないのでうまくいくこのコードを準備しました

まず、CameraEventReciverなどのイベントのレシーバーを作成します。コードを実装できるという点で、新しい画像のパスも提供するので、コードにとってより便利になります。

    public class CameraEventReciver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Cursor cursor = context.getContentResolver().query(intent.getData(),      null,null, null, null);
    cursor.moveToFirst();
    String image_path = cursor.getString(cursor.getColumnIndex("_data"));
    Toast.makeText(context, "New Photo is Saved as : -" + image_path, 1000).show();
      }
    }

そしてAndroidマニフェストでは、いくつかの権限を取得し、受信者をインテントフィルタに登録するだけで、画像キャプチャの適切なアクションによって受信者もAndroid有効になります

  <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission Android:name="Android.permission.CAMERA" />

   <receiver
        Android:name="com.Android.application.CameraEventReciver"
        Android:enabled="true" >
        <intent-filter>
            <action Android:name="com.Android.camera.NEW_PICTURE" />
            <data Android:mimeType="image/*" />
        </intent-filter>
    </receiver>
7

問題は、パッケージ付きの定数名を(文字列として)アポストロフィに入れたことです。実際の文字列定数の値は異なります。

0
ViliusK