在安卓中拍照会遇到的一些坑
1.拍照时候的权限问题
2.相册选择照片的文件路径问题(7.0之后)
3.去往拍照后,activity可能被回收,需要进行数据保存
4.uri与文件路径的转换(7.0)
一,自从6.0以后,就不行了,需要给它增加权限才可以调用。
实现的方法很简单就是在需要调用到以上授权的时候判断一下。如果没有授权就弹出MaterialDialog提示用户进行授权。
在这里我使用的第三方框架EasyPermissions
二,在7.0之后使用获取地址
FileProvider.getUriForFile(Context context,String authority,File file).
在同一个应用中可以使用Uri.fromFile(newFile()),在不用的应用中需要使用FileProvider.getUriForFile(Context context,String authority,File file)
.
第一步:在manifest清单文件中注册provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.jph.takephoto.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
心得:exported:要求必须为false,为true则会报安全异常。grantUriPermissions:true,表示授予 URI 临时访问权限。
第二步:指定共享的目录
为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
<>xml version="1.0" encoding="utf-8">
<resources>
<path>
<external-path path="" name="camera_photos"/>
</paths>
</resources>
●代表的根目录: Context.getFilesDir()
●代表的根目录: Environment.getExternalStorageDirectory()
●代表的根目录: getCacheDir()
心得:上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为path="pictures",那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
三.activity进入拍照,拍照后返回 activity,有时activity会被销毁,然后重新创建activity(原因:相机比较占用内存,后台的activity被kill了),activity页面的数据丢失。
onSaveInstanceState(Bundle outState)方法里面保存数据 ,
onRestoreInstanceState(Bundle savedInstanceState)恢复数据,
四.根据回调中获取到的uri去转换成文件路径,getPath(Activity context,Uri imageUri)
百度一下就有很多这个方法
网友评论