背景

之前开发的一个android软件中调用了相机功能,有用户反映照相后点击确定按钮后无法返回的问题。

问题重现:

最后经过自测,在小米2和三星一款手机上重现了这个问题,在其他手机上未发现该问题。

问题解决:

出现该问题时,调用的代码如下:

public void shoot(View view) {

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {

file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),

new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())+ ".jpg");

startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(

MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)),REQUEST_CODE_SHOOT);

} else {

Util.showToast(this, R.string.sdcard_missing);

}

}

修改为以下,代码运行正常:

public void shoot(View view) {

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {

File dir = new File(Environment.getExternalStorageDirectory() + "/ycz/pictures");

if(!dir.exists()){

dir.mkdir();

}

file = new File(dir, new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())+ ".jpg");

startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(

MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)),REQUEST_CODE_SHOOT);

} else {

Util.showToast(this, R.string.sdcard_missing);

}

}

问题分析:

用系统默认的图片保存目录做为照片保存路径无法返回,而将照片保存的文件路径修改为自定义路径则返回正常,是由于一些手机禁止了系统公共的默认路径的访问。所以为了兼容所有的手机,推荐将要保存的文件保存到自定义的文件夹下。

更多内容:

Android之MIUI系统BUG:调用拍照后不返回当前activity

正 文:

在实际应用过程中,由于需要插入图片,所以要支持利用摄像头拍照和从图库中的相册选择图片的功能。从图库选图没有任何问题,但是拍照的时候,在小米的miui系统下就出现了其他机型没有出现的bug。

最近在做一个Android下的所见即所得的编辑器,思路是利用内置浏览器webview的html5属性contenteditable来实现,如:

请输入内容。

我们先来看代码,先写调用camera的代码:

camera_picname="camera.jpg"; //照片名称

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname))); startActivityForResult(intent, 10);

注意,这里我们使用了startActivityForResult,表明需要返回结果。

然后需要重写当前activity的 onActivityResult 方法:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 10 && resultCode == Activity.RESULT_OK) { String imgpath = new File(Environment.getExternalStorageDirectory()+defaultdir, camera_picname).getAbsolutePath();

try {

Thread.sleep(500); //延时毫秒 等待 WebView.loadUrl 异步执行完毕

} catch (InterruptedException e) {

e.printStackTrace();

}

mWebView.loadUrl("javascript:window.appendcon('"+imgpath+"');");

} }

另外,为了防止在调用相机的时候,当前activity被系统kill(比如内存不够时,系统会自动销毁非可见的处于onPause或onStop状态的activity),我们需要 覆写 onSaveInstanceState方法,保存当前activity的状态变量值。

@Override

public void onSaveInstanceState(Bundle savedInstanceState){

savedInstanceState.putString("msg_con", htmlsource);

savedInstanceState.putString("msg_camera_picname", camera_picname);

super.onSaveInstanceState(savedInstanceState); //实现父类方法 放在最后 防止拍照后无法返回当前activity

}

然后在 onCreate(Bundle savedInstanceState) 方法里,判断savedInstanceState是否为null,不是null则读取上次保存的临时变量值。

上面的整个流程在模拟器里和其他型号的android真机设备里都没有问题,唯独红米的手机有问题!出现这个问题的手机型号是红米1S电信版,MIUI版本是: MIUI-JHCCNBF37.0,集成的Android版本是4.3 JLS36C;而这种情况在模拟器里或其他手机上没有发生。

具体问题:

点击拍照按钮,跳转到拍照界面时,由于拍照程序是比较消耗系统资源的,一般这个时候,系统大多会调用onSaveInstanceState方法让app保存界面状态值。

小米miui系统大多数时候也是正常调用 onSaveInstanceState 方法,当系统调用这个方法的时候,整个拍照流程,包括拍照后返回调用拍照的这个activity时,都是正常的。

但是,有些时候小米手机并没有调用 onSaveInstanceState 方法,这个时候,拍照后直接退出了调用他的这个activity(该activity覆写了onActivityResult方法),也就不会执行 onActivityResult方法。程序没有任何其他异常。

飘易的猜测是:由于红米miui深度定制了android系统,并且红米是整个小米系里最低端的入门机,在硬件性能上缩减严重。大白话就是修改了过多的模块而又没有考虑周全产生的bug。当系统调用拍照程序时,系统认为当前的内存还够用,activity不会被销毁,所以没有执行 onSaveInstanceState方法。但是拍照程序真正启用后,系统发现内存不够用了,即将OOM,就销毁了处于onPause或onStop的activity。这个销毁系统不会通知你,系统偷偷地干了这件事。

正常的情况下,即使系统销毁了这个activity,在拍照返回到这个activity的时候,系统会重新生成被销毁的这个activity,重走 onCreate 等方法。

然而小米的miui系统在这里就有了bug!小米miui认为某个activity不会销毁,所以直接忽略了由于意外,系统需要重新创建这个activity的可能性。因此直接导致了返回到了前前activity,而不是前activity。

当小米miui系统明确地认为这个activity可能会被销毁时,执行 onSaveInstanceState 方法的时候,上面的这个bug不存在,系统在拍照完成后可以正常返回到前面的activity里并执行里面的 onActivityResult 方法。

目前,此bug没修复。上面的是飘易个人浅见,欢迎高手评论。

顺带说一下,红米手机的另外的bug:

一、有的时候在用手机浏览器访问网页或返回的时候,整个页面没有显示完全,网页上的部分元素显示不全、断层,必须手动刷新当前页,才能显示全部页面。

二、在打开APP时,点击按钮返回时,比如拍照返回时,界面上的有些控件是黑色的,必须手指滑过这些控件,才能去掉黑色。

android小米手机拍照功能,小米手机 调用相机拍照后无法返回问题相关推荐

  1. 前端调用手机拍照功能失败,调用相机没反应

    开发过程中需要再ios app的WKwebview里面嵌入前端页面,这时候前端页面可能有需要打开手机相机拍照或者打开手机相册功能,有时候是点击没反应,有时候是点击后能够打开相机或相册,然后拍完照片确定 ...

  2. 三星、LG等部分手机调用相机拍照的模糊问题和拍照选取相册图片旋转问题

    项目场景: 调用系统相机拍照.选择相册照片 问题描述: 部分手机(例如:三星.LG)调用系统相机拍照会模糊和旋转问题,选择的照片也会旋转问题 调用代码: Intent intent = new Int ...

  3. Android开发之调用相机拍照与本地图库选择图片

    引用链接 Android开发之调用相机拍照与本地图库选择图片 Android调用相机实现拍照功能 部分截图 引言 小项目有一个访问相册的需求,在网上查找得到两位大神博客指点,但博客发布时间过旧,难免因 ...

  4. android intent拍照,Android通过Intent方式调用相机拍照取得图片

    Android通过Intent方式调用相机拍照取得图片 AndroidManifest.XML 权限设置: XML布局设置: 代码: public classMainActivityextendsAp ...

  5. Android中拍照完就给图片加水印,Android调用相机拍照并添加水印

    最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...

  6. android 调用相机拍照。适配到 Android 10

    Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者   提 Bug 标签: android ...

  7. Android调用相机拍照并添加水印

    最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考.文件操作及权限做了适配,支持androidN及以上版本,放心使用. ...

  8. android调用相机拍照返回的照片大小太小,变得模糊

    1.使用相机拍照默认情况下调用相机的方式: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForRe ...

  9. Android调用相机拍照高清原图(兼容7.0)

    在安卓更新7.0的版本后,要调用相机拍照获取原图则需要先把拍摄后的内容保存到目录,然后再借助provider调出来显示,相比以前可以说十分繁琐,但为了摆脱马赛克画质的困扰,为了更好的用户体验,还是硬着 ...

  10. Android 调用相机拍照并保存

    不知不觉已经两年多已经没有写文章了,转眼间大学都要毕业了,也是有些唏嘘,今后会定期发表些文章,应该会以Android为主,也会夹杂其他领域的一些文章. 话不多说,今天做了一个小demo,就是调用相机拍 ...

最新文章

  1. 软件框架设计的艺术----读书总结
  2. SpringBoot开发最佳实践
  3. Eclipse在Ubuntu8.04桌面系统下安装和弹出空白对话框
  4. mybatis源码刨析总结
  5. Exchange Server 2007迁移Exchange Server 2010 (16)--- OWA重定向
  6. 2016-12-31:最后一天:回顾
  7. fruncm server sql 无法生成 线程_MSSQLSERVER启动不了,报SQL Server 无法生成 FRunCM 线程...
  8. React基础语法学习
  9. 计算机网络之数据链路层:19、总结
  10. 华为手机助手安卓版_91手机助手安卓版
  11. 【PAT甲】1006 Sign In and Sign Out (25分)循环模拟
  12. 工作流 节点子线程_节点JS体系结构–单线程事件循环
  13. 【大数据部落】混合IBCF协同过滤推荐算法推荐引擎的探索1
  14. MATLAB 读取表格 | readmatrix函数
  15. tongweb自动部署_将web应用迁到TongWeb
  16. IBM P系列小型机HMC默认IP地址
  17. XMind初使用【常规操作快捷键】
  18. 固态硬盘量产工具_FORESEE G500发布,江波龙国产固态硬盘再发声
  19. 莫比乌斯反演 平衡规划 双端栈 双端队列 等价类等
  20. CTF密码学解题思路

热门文章

  1. python实例02,__str__只能返回字符串
  2. nodejs设置镜像源
  3. 一个字等于多少个字节?
  4. 剑盾神秘礼物正在维护服务器,宝可梦剑盾神秘礼物获取途径一览
  5. mapreduce求平均值
  6. 3DMAX零基础图文教程学习
  7. 使用通达信一次性获取沪深300成分股
  8. php什么是耦合关系,什么是耦合
  9. 关于赚钱的 6 个重要认知,多数人都不知道
  10. 人工智能标记语言AIML聊天机器人:产生、种类、应用、实例、AIML概述、知识库、公司、业界(20k字经典收藏版)