做项目时遇到客户一个另类需求——“拍照必须使用系统相机”,当手机装有第三方相机时,

调用new Intent(MediaStore.ACTION_IMAGE_CAPTURE);会弹出相机选择界面,

但是客户是不允许用户用第三方相机的,因为第三方相机有的可以直接进行选择照片操作,

但是客户要求照片必须是当前拍摄的。

上面是遇到的问题,寻找解决方案,发现Intent可以通过setPackage设置包名来指定

要打开的应用,安卓原生系统中照相机的包名是com.Android.camera,通过测试在三

星等几个使用原生系统的手机中可以避免选择第三方相机直接调用了系统相机,但是在

魅族、小米等手机中仍然弹出相机选择界面,通过查看这几款手机自带相机的apk发现,

它们的包名并不是com.android.camera,试着将包名改为魅族小米的包名测试通过,

可以直接指定系统相机;

虽然找到了原因,但是我们总不能每款手机都做一个适配来指定包名吧。还好安卓

允许我们获取手机中安装的所有apk的信息。我的解决方案是遍历手机中所有安装的软件,

判断软件的名称为"相机,照相机,照相,拍照,摄像,Camera,camera"等关键字,

系统相机无非都是这样命名的。以下是代码:

[java] view plain copy
  1. /**
  2. * 照相功能
  3. * imgPath指定照片存储路径
  4. */
  5. public void cameraMethod(Activity activity, int RESULT_CAPTURE_IMAGE,
  6. String imgPath) {
  7. try {
  8. Intent imageCaptureIntent = new Intent(
  9. MediaStore.ACTION_IMAGE_CAPTURE);
  10. File out = new File(imgPath);
  11. Uri uri = Uri.fromFile(out);
  12. try {// 尽可能调用系统相机
  13. String cameraPackageName = getCameraPhoneAppInfos(myActivity);
  14. if (cameraPackageName == null) {
  15. cameraPackageName = "com.android.camera";
  16. }
  17. final Intent intent_camera = activity.getPackageManager()
  18. .getLaunchIntentForPackage(cameraPackageName);
  19. if (intent_camera != null) {
  20. imageCaptureIntent.setPackage(cameraPackageName);
  21. }
  22. } catch (Exception e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  27. imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  28. activity.startActivityForResult(imageCaptureIntent,
  29. RESULT_CAPTURE_IMAGE);
  30. } catch (Exception e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }
  34. }
  35. // 对使用系统拍照的处理
  36. public String getCameraPhoneAppInfos(Activity context) {
  37. try {
  38. String strCamera = "";
  39. List<PackageInfo> packages = context.getPackageManager()
  40. .getInstalledPackages(0);
  41. for (int i = 0; i < packages.size(); i++) {
  42. try {
  43. PackageInfo packageInfo = packages.get(i);
  44. String strLabel = packageInfo.applicationInfo.loadLabel(
  45. context.getPackageManager()).toString();
  46. // 一般手机系统中拍照软件的名字
  47. if ("相机,照相机,照相,拍照,摄像,Camera,camera".contains(strLabel)) {
  48. strCamera = packageInfo.packageName;
  49. if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
  50. break;
  51. }
  52. }
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. if (strCamera != null) {
  58. return strCamera;
  59. }
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. }
  63. return null;
  64. }

排除美颜相机等第三方相机直接调用系统相机处理方法相关推荐

  1. Android手机调用系统相机拍照、裁剪以及获取Url上传图片

    前言 最近一个人在公司搞独立开发,遇到问题只能自己解决,虽然过程比较坎坷,但是收获还是颇多的,一个人也是要坚强滴,最近弄用户的头像遇到了一些小问题,虽然上一款应用有头像上传,但是发现了其中的一些小问题 ...

  2. 完美调用系统相机拍照,获取图片进行压缩并本地保存

    在android开发中,调用相机的功能的频幕可谓相当之高,尤其在当前社交应用五花八门的情况下,相机的功能被开发的相当丰富,如美颜相机,美拍,微拍和最早的360相机等,可是制造多少"美女&qu ...

  3. IOS开发调用系统相机和打开闪光灯

    IOS开发调用系统相机和打开闪光灯      今天给大家分享一下如何调用iphone的拍照功能和打开闪光灯,有些代码我也不太理解,很多是在网上借鉴其他人的.IOS有两种的拍照和视频的方式:1.直接使用 ...

  4. 调用系统相机和相册,并且裁剪成圆形图片(解决6.0,7.0,8.0版本问题)

    之前写过一篇博客,那篇博客对7.0手机裁剪图片的问题没有进行解决,现在对之前的那篇博客进行补充,解决了Android6.0,7.0,8.0版本问题,不仅可以调用相册,相机,还可以将图片保存到本地,并且 ...

  5. Android调用系统相机和相册(更换微信头像)

    最近做了调用系统相机和相册,在其他博客中看到还有对图像进行剪切,大家都知道,我们在玩微信的时候,头像更换是方形图片,接下来我们就对这种情况具体进行描述: 必要的权限: <uses-permiss ...

  6. Android学习之调用系统相机实现拍照功能

    一.今天,来介绍如何调用系统自带的相机进行拍照,主要有以下2种实现的方式: 1.Camera应用程序包含了一个意图过滤器,即intent filter,它使得开发人员能够提供与Camera应用程序同等 ...

  7. 关于Android 4.4(华为)调用系统相机问题

    最近使用测试机(华为,4.4系统)调用系统相机进行拍照时,点击拍照完成,手机又反回了拍照页面,此时应该setResult上一个页面,但是上一个页面的onActivityResult没有被调用,大概有些 ...

  8. 安卓调用系统相机拍照并且显示在ImageView上

    并没有什么技术难点,只是在保存到sdCard的时候有一点小细节需要注意,所以写了这篇文章.代码很简单,就不解释什么了,直接贴上源码. public class TakePhotoActivity ex ...

  9. Android调用系统相机拍照并保存到指定位置

    Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto)void onclick() {Intent intent = new Intent(MediaSt ...

  10. 调用系统相机和相册出现闪退报错No Activity found to handle Intent

    调用系统相机和相册出现闪退报错No Activity found to handle Intent : 在开发安卓项目的时候遇到了一个问题,当手机调用系统相机和相册的时候会出现闪退的现象,根据报错常常 ...

最新文章

  1. 资料验证的asp.net程序
  2. 谷歌大神为你解释Kubernetes, 微服务和容器化
  3. 如何更好地利用“二八定律”提升SEO优化效果?
  4. 机器学习理论入门:第二章 经典监督学习算法-决策树
  5. docker安装教程(windows和linux[centos8])
  6. 在表空间有足够free space的情况下出现ORA-1652
  7. 知乎上已获千赞,持续更新中
  8. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境
  9. hdu1176 免费馅饼 动态规划 二维数组实现
  10. python软件中文翻译_python 写一个桌面版的翻译软件
  11. 如何将一个完整项目推到码云_怎么将本地项目放到码云(gitee)上面?图文详解
  12. php---header函数的示例代码
  13. 分布式消息规范 OpenMessaging 1.0.0-preview 发布 1
  14. 《MATLAB智能算法30个案例》:第5章 基于遗传算法的LQR控制器优化设计
  15. HBase【付诸实践 01】hbase shell 常用命令详解(表操作+数据增删改查+2种查询操作)(hbase-2.4.5 单机版standalone模式)
  16. win8/win8.1提示在关闭了用户控制的情况下 无法打开这个应用
  17. Jieba分词的准确率提升:使用paddle模式进行分词(使用百度飞桨深度学习模型进行分词)
  18. oracle utl_http.request,通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求
  19. 11 从零实现线性回归
  20. Android学习方向

热门文章

  1. JavaScript个人学习心得
  2. 做人不能太“广州有线”了
  3. vuex存储什么数据_Redis除了存储数据以外还能做什么?
  4. Linux系统之基础扫盲教程大全
  5. 全国大学生数学建模竞赛——2017A题(学习笔记)
  6. 这篇文章感触很深,就作为第一篇吧
  7. linux驱动——内核通知链(探究i2c-dev.c 中的bus_register_notifier函数所得)
  8. bzoj 4987 Tree - dp
  9. 谷歌发布智能绘画工具AutoDraw,只要有这个,谁都可以画画。
  10. 曲终人散,我亦是行人。