安卓排除美颜相机等第三方相机直接调用系统相机处理方法
2016-03-03 08:32
429 查看
做项目时遇到客户一个另类需求——“拍照必须使用系统相机”,当手机装有第三方相机时,
调用new Intent(MediaStore.ACTION_IMAGE_CAPTURE);会弹出相机选择界面,
但是客户是不允许用户用第三方相机的,因为第三方相机有的可以直接进行选择照片操作,
但是客户要求照片必须是当前拍摄的。
上面是遇到的问题,寻找解决方案,发现Intent可以通过setPackage设置包名来指定
要打开的应用,安卓原生系统中照相机的包名是com.android.camera,通过测试在三
星等几个使用原生系统的手机中可以避免选择第三方相机直接调用了系统相机,但是在
魅族、小米等手机中仍然弹出相机选择界面,通过查看这几款手机自带相机的apk发现,
它们的包名并不是com.android.camera,试着将包名改为魅族小米的包名测试通过,
可以直接指定系统相机;
虽然找到了原因,但是我们总不能每款手机都做一个适配来指定包名吧。还好安卓
允许我们获取手机中安装的所有apk的信息。我的解决方案是遍历手机中所有安装的软件,
判断软件的名称为"相机,照相机,照相,拍照,摄像,Camera,camera"等关键字,
系统相机无非都是这样命名的。以下是代码:
调用new Intent(MediaStore.ACTION_IMAGE_CAPTURE);会弹出相机选择界面,
但是客户是不允许用户用第三方相机的,因为第三方相机有的可以直接进行选择照片操作,
但是客户要求照片必须是当前拍摄的。
上面是遇到的问题,寻找解决方案,发现Intent可以通过setPackage设置包名来指定
要打开的应用,安卓原生系统中照相机的包名是com.android.camera,通过测试在三
星等几个使用原生系统的手机中可以避免选择第三方相机直接调用了系统相机,但是在
魅族、小米等手机中仍然弹出相机选择界面,通过查看这几款手机自带相机的apk发现,
它们的包名并不是com.android.camera,试着将包名改为魅族小米的包名测试通过,
可以直接指定系统相机;
虽然找到了原因,但是我们总不能每款手机都做一个适配来指定包名吧。还好安卓
允许我们获取手机中安装的所有apk的信息。我的解决方案是遍历手机中所有安装的软件,
判断软件的名称为"相机,照相机,照相,拍照,摄像,Camera,camera"等关键字,
系统相机无非都是这样命名的。以下是代码:
/** * 照相功能 * imgPath指定照片存储路径 */ public void cameraMethod(Activity activity, int RESULT_CAPTURE_IMAGE, String imgPath) { try { Intent imageCaptureIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); File out = new File(imgPath); Uri uri = Uri.fromFile(out); try {// 尽可能调用系统相机 String cameraPackageName = getCameraPhoneAppInfos(myActivity); if (cameraPackageName == null) { cameraPackageName = "com.android.camera"; } final Intent intent_camera = activity.getPackageManager() .getLaunchIntentForPackage(cameraPackageName); if (intent_camera != null) { imageCaptureIntent.setPackage(cameraPackageName); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); activity.startActivityForResult(imageCaptureIntent, RESULT_CAPTURE_IMAGE); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 对使用系统拍照的处理 public String getCameraPhoneAppInfos(Activity context) { try { String strCamera = ""; List<PackageInfo> packages = context.getPackageManager() .getInstalledPackages(0); for (int i = 0; i < packages.size(); i++) { try { PackageInfo packageInfo = packages.get(i); String strLabel = packageInfo.applicationInfo.loadLabel( context.getPackageManager()).toString(); // 一般手机系统中拍照软件的名字 if ("相机,照相机,照相,拍照,摄像,Camera,camera".contains(strLabel)) { strCamera = packageInfo.packageName; if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { break; } } } catch (Exception e) { e.printStackTrace(); } } if (strCamera != null) { return strCamera; } } catch (Exception e) { e.printStackTrace(); } return null; }
相关文章推荐
- Data scientist's tool笔记
- 原子操作和线程的并发执行
- USC CSCI 585 Specialization Hierarchy
- 图解:如何在LINUX中安装VM-Tools
- SQL读书笔记(五)
- CAS原理与协议
- TreSet的有序唯一性
- stl.find_if用法总结
- 我的软件工程课目标
- 2016春季学习(1)——递推
- poj1149 最大流好题 难在建图 好题
- 一个基于node与mysql的打卡小应用
- SQL读书笔记(四)
- asp.net mvc4使用log4.net 日志功能
- 2016.3.3
- 目标
- SpringMVC源码解析 - HandlerMethod
- bzoj 1901: Zju2112 Dynamic Rankings
- TLD视觉跟踪算法
- 求组合数模板