Android 指定调用已安装的某个“相机”App

Posted bluestorm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 指定调用已安装的某个“相机”App相关的知识,希望对你有一定的参考价值。

在做项目时,有这样一个需求:如果我的手机中安装了四个相机软件,那么,在调用系统相机的时候,这四个相机软件都会被列出来,但是其中的两个在拍照完后并不能将拍得的照片返回给我,因此,能不能指定开启一个我已知的能返回照片的相机App?

整个解决过程如下:

参考资料:http://my.oschina.net/armsky/blog/54692

 

运行参考资料中所示代码时,遇到两个问题:

  (一)、“相机”App同一时间被打开两次;意即我需要按两次“返回”才能退出被打开的“相机”App。

  (二)、用“相机”App拍完照后不能得到其返回值。事实上,如果用Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)来调用“相机”App是会得到拍到的照片的。

因此,在参考资料文中所示代码的基础上做了修改,解决了上述两个问题。具体的代码如下所示:

        PackageInfo pi = null;  
        try {
            //获得相机包名信息
            pi = getPackageManager().getPackageInfo("com.motorola.CameraF", 0);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        //获得当前应用程序的包管理器
        PackageManager pm = TestCallBackExampleActivity.this.getPackageManager(); 

        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        resolveIntent.setPackage(pi.packageName);
        List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);
        ResolveInfo ri = apps.iterator().next();
        if (ri != null ) {
            String packageName = ri.activityInfo.packageName;
            String className = ri.activityInfo.name;

            // 此处将Intent的Action设置为捕获照片
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Intent intent = new Intent(Intent.ACTION_MAIN);  // 相机主界面
            // 设置期望被打开的App包名和类名
            ComponentName cn = new ComponentName(packageName, className);
            
            intent.setComponent(cn);
            startActivityForResult(intent, 1);
        }

以上是关于Android 指定调用已安装的某个“相机”App的主要内容,如果未能解决你的问题,请参考以下文章

android固定位置拍照,Android调用系统相机拍照并保存到指定位置

你需要知道的Android拍照适配方案

Android 手把手带你玩转自己定义相机

android怎么调用系统服务

Android项目实战 | 从零开始写app(14)实现图片发布模块 | 必知必会之调用系统相机拍照相册一一解决android7 打开相机闪退奔溃问题

Android App 自定义相机