Android调用系统相机的那些坑

Android实现拍照获取图片,有两种方案,第一就是调用系统相机拍照,然后获取拍照后的图片,实现比较简单,同时功能也比较简单;第二就是自定义相机,实现复杂,但是功能强大。这里讨论的是第一种实现方案。
虽然第一种方案比较简单,但是如果第一次用也会有一些磕磕绊绊,这里把我遇到的问题记录总结一些:

1、调用系统相机拍照后,系统报错DeadObjectException;
解决办法:在AndroidManifest的application里添加
android:hardwareAccelerated=”false”

后来加上这句以后发现还是不好使,有的时候还是会报这个错误,后来在stack-overflow上看到这样说的,
This means that your service had already stopped - either killed from the OS, or stopped from your application.
通过打印日志发现service里确实调用了onUnBind方法,What??为什么unbind?我没有进行这个操作啊?
stackoverflow地址:
http://stackoverflow.com/questions/1573557/how-to-fix-android-os-deadobjectexception-android-x
后来想是不是我的Activity被系统收回了?在Activity的onDestory和onStop里打印日志,发现没有走destroy,但是走了stop,而我的BasicActivity的onstop里进行了unbind操作。这下豁然开朗了。把onStop的unbind操作转移到onDestroy里即可。(话说本来service的解绑也应该在onDestroy里进行吧)
这里因为自己的一个疏忽,调试了好久才解决。 大家引以为戒,对于Activity生命周期不熟的同学可以移步到这个博文
2、拍照完毕后返回的intent里数据格式不一致
一部分手机在返回的intent里可以直接通过getData()的方式来获取图片路径;
但是,有时候我们会发现用相机拍摄获取照片的时候,得到的 uri 是 null 的,这是因为android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,可能有的相机能够通过
inten.getData()获取到uri,然后再根据uri获取数据的路径,在封装成bitmap,但有时候有的相机获取到的是null的,这时候我们该怎么办呢?
其实这时候我们就应该从bundle中获取数据,通过 (Bitmap) bundle.get("data")获取到相机图片的bitmap数据。
为了能够同时适应上述两种情况,我们这时候就应该在获取图片时做判断了。我们可以在响应的时候做一个判断:

if (uri == null){
   Bitmap bmp = (Bitmap)data.getExtras().get("data");
   //保存bitmap到文件
}

后面的过程就需要通过bitmap转化成相应的图片文件了。不过得到最终的图片是被压缩了的。
如果想得到不被压缩的图片,可以在启动相机的时候指定输出文件的路径,代码如下:

Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
photoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(
        newPhoto
    ));
photoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

startActivityForResult(photoIntent,TAKE_PHOTO_REQUEST_CODE);

但是这样也有一个问题,接着看下面。

3、指定拍照的路径,返回的intent为null
如上面所说,指定拍照的路径后,在onActivityResult(int requestCode, int resultCode, Intent data)代码中得到的data总为null?
于是我查看了Android系统框架Camera应用程序,找到了关于系统照相机如何处理返回值data问题!
默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!现在想想,这种设计还是很合理的!
因为你既然指定了图片路径,那么你就已经知道这个图片的具体存在了!不需要系统在给你返回路径了!

4、指定拍照的路径,图片没有保存甚至应用莫名重启
遇到这种情况是因为你设置的图片所在文件夹不存在,通常这种情况下系统会自动创建文件夹,但是有的手机不会自动创建,所以你在指定文件路径之前,一定要自己把文件夹建好!

5、照片存在了,但是名字不对
这种情况主要是你的照片名字存在空格等其它特殊字符,去除就可以了。

以上问题就是我在调用系统相机拍照的时候遇到的问题,记录下来以供参考!
感谢博文:
http://blog.csdn.net/wk1063645973/article/details/50036085
http://blog.csdn.net/zimo2013/article/details/16916279
http://www.cnblogs.com/kobe8/p/4031226.html

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值