小编典典

广播接收器将不会接收摄像头事件

javascript java

我正在尝试开发一个可检测用户何时拍照的应用程序。我设置了广播接收器类,并通过以下方式将其注册到清单文件中:

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

然后我成功接收到广播,可以看到日志和吐司窗口​​。我是否采用正确的方法?有什么需要补充的吗?


阅读 390

收藏
2020-09-09

共2个答案

小编典典

我解决了这个问题,但是使用了另一种方法。我没有使用广播接收器,而是在相机保存到的单独文件夹中设置了文件观察器。它不像其他方法那样实用,但是仍然可以正常工作。这是我的设置方法:

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
2020-09-09
小编典典

我确定这种方式可以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();



}

之后,将您的项目部署到Emulator(我使用genymotion),因为您的BroadCastReceiver在没有GUI的情况下可以工作,所以当然没有任何反应。让您打开相机应用程序,然后单击捕获按钮。如果一切正常,您将获得诸如“新照片另存为:storage / emulated / 0 / DCIM / Camera / IMG_20140308.jpg”之类的敬酒内容。让我们享受^ _ ^

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

希望对大家有帮助

2020-09-09