广播接收机将不会收到相机事件

我试图制作一个应用程序,检测用户何时拍照。 我设置了一个广播接收器类,并通过以下方式在清单文件中注册它:

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

不pipe我尝试做什么,节目都不会收到广播。 这是我的接收器类:

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

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

Solutions Collecting From Web of "广播接收机将不会收到相机事件"

我解决了这个问题,但通过使用不同的方法。 我没有使用广播接收机,而是在相机保存到的单独文件夹上设置了一个fileobserver。 这不像其他方式那么实际,但它仍然正常工作。 以下是我如何设置它:

 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 

我肯定这种方式工作100%。 我仔细testing。

在AndroidManifest中注册您的广播接收器。 上面的大部分答案都是“类别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> 

最后,你创build一个名为“CameraReciver.java”的类从BroadcastReceiver扩展,这是我的代码:

 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的情况下工作。 让你打开相机的应用程序,然后点击捕捉button。 如果一切正常,你会得到像“新照片被保存为:storage / emulated / 0 / DCIM / Camera / IMG_20140308.jpg”的内容。 让享受^ _ ^

感谢“tanay khandelwal”(以上回答)如何获得由相机^ _ ^拍摄的新照片的path

我的英文语法不是很好,也许在某个地方是错的,但我想你可以理解我的意思(^_^)。 希望能帮助大家

你应该看看这里: ImageTableObserver和这里的PicasaPhotoUploader他们是怎么做到的。

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

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

至less这样,你不必硬编码目录。

你好朋友我也试图执行捕捉事件的一些任务,并在学习和工作后,我准备这个代码工作正常,所以它可以帮助你

首先为你的事件创build一个接收器,说出CameraEventReciver,然后你可以实现你的代码,我也给你新的图像的path,所以它会对你的代码更有用

  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你只需要一些权限,并注册你的接收器意向filter和适当的动作图像捕获也使您的接收机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> 

问题是,你已经把包的常量名放在撇号中(作为string)。 实际的string常量具有不同的值。