只启动系统相机(排除第三方相机)
需求
我们都知道启动相机可以通过如下代码实现
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 指定调用相机拍照后照片的储存路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
context.startActivityForResult(intent, REQUEST_CAMERA_CODE);
但是通过这种方式实现的话,如果Android 系统中安装了其他第三方拍照软件,那么会弹出对话框让用户选择一个拍照软件。我们如何实现调用相机的时候只启动系统里面的相机呢?
实现
通过过滤的方式我们可以实现该功能,我们可以先拿到所有符合该条件Action的应用信息,然后通过那个应用是系统应用,如果是系统应用同时满足MediaStore.ACTION_IMAGE_CAPTURE,那么该App就是我们系统里的相机应用。代码如下:
public class CameraUtil {
/**
* 启动系统相机
* @param activity
*/
public static void launchSystemCamera(Activity activity, File file, int requestCode) {
try{
//获取相机包名
Intent infoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
List<ResolveInfo> infos = activity.getPackageManager().queryIntentActivities(infoIntent, 0);
if(infos != null && infos.size() > 0) {
for(ResolveInfo info:infos) {
int flags = info.activityInfo.applicationInfo.flags;
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) { //系统相机
String packageName=info.activityInfo.packageName;
String className=info.activityInfo.name;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
ComponentName cn=new ComponentName(packageName, className);
intent.setComponent(cn);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
activity.startActivityForResult(intent,requestCode);
return;
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
思考
其实该方法可以推广到所有APP,例如我们只启动系统相册或者系统浏览器都可以通过该方法去过滤掉第三方的APP。