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

然后我成功接收到广播并且可以看到日志和 toast 窗口。我以正确的方式接近这个吗?有什么需要我补充的吗?

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 回答
11

我确信这种方式 100% 有效。我仔细测试过。

在 AndroidManifest 中注册您的广播接收器。上面的大多数答案都错过了 "category android: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”之类的内容。尽情享受吧^_^

感谢“tanay khandelwal”(上面已回答)如何获取相机拍摄的新照片的路径^_^

希望对大家有所帮助

于 2014-03-08T03:42:53.310 回答
9

您应该在这里查看: ImageTableObserverPicasaPhotoUploader 他们是如何做到的。

基本上,他们有一个观察者Media.EXTERNAL_CONTENT_URI,它将通知 SD 卡上发生的任何事情,然后在观察者中,他们检查返回的数据是否是照片。

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

至少这样您就不必对目录进行硬编码。

于 2011-09-03T09:29:31.010 回答
7

你好朋友我也试图在捕获事件上实现一些任务,在研究和工作之后,我准备了这个工作正常的代码,所以它可以帮助你

首先为您的事件创建一个接收器,例如 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 Manifest 中,您只需要获取一些权限并使用意图过滤器注册您的接收器,并为图像捕获采取适当的操作也使您的接收器启用 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>
于 2013-08-12T13:29:31.440 回答
0

问题是,您已将带有包的常量名称放入撇号(作为字符串)。实际的字符串常量具有不同的值。

于 2012-12-26T21:27:49.987 回答