我正在尝试开发一个可检测用户何时拍照的应用程序。我设置了广播接收器类,并通过以下方式将其注册到清单文件中:
<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);
然后我成功接收到广播,可以看到日志和吐司窗口。我是否采用正确的方法?有什么需要补充的吗?
我解决了这个问题,但是使用了另一种方法。我没有使用广播接收器,而是在相机保存到的单独文件夹中设置了文件观察器。它不像其他方法那样实用,但是仍然可以正常工作。这是我的设置方法:
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%工作。我仔细测试了。
在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”(上面回答)如何获取相机拍摄的新照片的路径^ _ ^
希望对大家有帮助