Joh*_*ohn 20 android android-manifest android-camera android-camera-intent
我正在尝试创建一个可以检测用户何时拍照的应用.我设置了一个广播接收器类,并通过以下方式将其注册在清单文件中:
<receiver android:name="photoReceiver" >
<intent-filter>
<action android:name="com.android.camera.NEW_PICTURE"/>
<data android:mimeType="image/*"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
无论我尝试做什么,该程序都不会收到广播.这是我的接收器类:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除清单和我的活动中的mimeType行,我会发送自己的广播
Intent intent = new Intent("com.android.camera.NEW_PICTURE");
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
然后我成功收到广播,可以看到日志和吐司窗口.我是以正确的方式接近这个吗?我需要添加什么东西吗?
Joh*_*ohn 15
我通过使用不同的方法解决了这个问题.我没有使用广播接收器,而是在相机保存到的单独文件夹上设置文件浏览器.它不像其他方式那样实用,但它仍然可以正常工作.这是我如何设置它:
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
Run Code Online (Sandbox Code Playgroud)
小智 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>
Run Code Online (Sandbox Code Playgroud)
最后,您创建了一个名为"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();
}
Run Code Online (Sandbox Code Playgroud)
之后,将您的项目部署到Emulator(我使用genymotion),当然没有任何事情发生,因为您的BroadCastReceiver在没有GUI的情况下工作.让你打开相机应用程序,然后单击捕获按钮.如果一切正常,您将获得一个内容,如"新照片保存为:存储/模拟/ 0/DCIM /相机/ IMG_20140308.jpg".让我们享受^ _ ^
感谢"tanay khandelwal"(上面回答)如何获取相机拍摄的新照片的路径^ _ ^
我的英语语法不是很好,也许在某处错了,但我想你能理解我的意思(^ _^).希望能帮助大家
你应该看看这里: ImageTableObserver和这里的PicasaPhotoUploader 他们是如何做到的.
基本上,他们有一个观察者Media.EXTERNAL_CONTENT_URI将通知SD卡上发生的任何事情,然后在观察者中,他们检查返回的数据是否是照片.
camera = new ImageTableObserver(new Handler(), this, queue);
getContentResolver().registerContentObserver(Media.EXTERNAL_CONTENT_URI, true, camera);
Run Code Online (Sandbox Code Playgroud)
至少这种方式你不必硬编码目录.
小智 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();
}
}
Run Code Online (Sandbox Code Playgroud)
在Android Manifest中,您只需要获取一些权限并使用intent 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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20325 次 |
| 最近记录: |