只启动系统相机(排除第三方相机)

只启动系统相机(排除第三方相机)

需求

我们都知道启动相机可以通过如下代码实现

    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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值