20

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

<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);

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

4

5 に答える 5

16

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

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
于 2011-01-03T21:05:50.433 に答える
9

ここでチェックアウトする必要があります: ImageTableObserverとここPicasaPhotoUploader がどのようにそれを行うか。

基本的に、彼らはMedia.EXTERNAL_CONTENT_URISDカードで何が起こったのかを通知するオブザーバーを持っており、オブザーバーでは、返されたデータが写真であるかどうかをチェックします。

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

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

于 2011-09-03T09:29:31.010 に答える
0

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

于 2012-12-26T21:27:49.987 に答える