android 第三方相册,调用系统相机、相册、剪裁图片并上传(常用于上传头像,兼容Android7.0)...

由于在Android 7.0 采用了StrictMode API政策禁,其中有一条限制就是对目录访问的限制。

这项变更意味着我们无法通过File API访问手机存储上的数据,也就是说,给其他应用传递 file:// URI 类型的Uri,可能会导致接受者无法访问该路径,并且会会触发 FileUriExposedException异常。

StrictMode API政策禁中的应用间共享文件就是对上述限制的应对方法,它指明了我们在在应用间共享文件可以发送 content:// URI类型的Uri,并授予 URI 临时访问权限,即使用FileProvider

接下来,我们使用FileProvider实现调用系统相机、相册、剪裁图片的功能兼容Android 7.0

第一步:FileProvider相关准备工作

在AndroidManifest.xml中增加provider节点,如下:

android:name="android.support.v4.content.FileProvider"

android:authorities="com.hansion.chosehead"

android:grantUriPermissions="true"

android:exported="false">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/filepaths" />

其中:

android:authorities 表示授权列表,填写你的应用包名,当有多个授权时,用分号隔开

android:exported 表示该内容提供器(ContentProvider)是否能被第三方程序组件使用,必须为false,否则会报异常:ava.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.SecurityException: Provider must not be exported

android:grantUriPermissions="true" 表示授予 URI 临时访问权限

android:resource 属性指向我们自及创建的xml文件的路径,文件名随便起

接下来,我们需要在资源(res)目录下创建一个xml目录,并建立一个以上面名字为文件名的xml文件,内容如下:

其中:

external-path 代表根目录为: Environment.getExternalStorageDirectory() ,也可以写其他的,如:

files-path 代表根目录为:Context.getFilesDir()

cache-path 代表根目录为:getCacheDir()

其path属性的值代表路径后层级名称,为空则代表就是根目录,假如为“pictures”,就代表对应根目录下的pictures目录

第二步:使用FileProvider

在这之前,我们需要在AndroidManifest.xml中增加必要的读写权限:

1. 通过相机获取图片

在通过Intent跳转系统相机前,我们需要对版本进行判断,如果在Android7.0以上,使用FileProvider获取Uri,代码如下:

/**

* 从相机获取图片

*/

private void getPicFromCamera() {

//用于保存调用相机拍照后所生成的文件

tempFile = new File(Environment.getExternalStorageDirectory().getPath(), System.currentTimeMillis() + ".jpg");

//跳转到调用系统相机

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//判断版本

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //如果在Android7.0以上,使用FileProvider获取Uri

intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

Uri contentUri = FileProvider.getUriForFile(MainActivity.this, "com.hansion.chosehead", tempFile);

intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);

} else { //否则使用Uri.fromFile(file)方法获取Uri

intent.putE

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值