首先Android6.0之后都是需要动态申请权限的,注意在AndroidManifest.xml中也是和以前一样需要些权限的;
前段时间在做上传头像的时候,拍照再对图片进行裁剪的时候遇到的Android8.0的手机会失败,上网查找里一下原来是Android8.0以后的权限又加了限制条件。我总结了一下:
首先要在res的文件夹下建立一个xml的文件夹,再建立一个provider_paths.xml,如图所示:
provider_path.xm的内容如下:
xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external" path="."/> paths>
然后在AndroidManifest.xml中配置信息:
<provider
android:name="android.support.v4.content.FileProvider" android:authorities="包名" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> provider>再点击拍照的时候判断一下
File file = new File(Environment .getExternalStorageDirectory(), "image.jpg");
if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
tempUri =FileProvider.getUriForFile(context, "包名", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
}else{
tempUri = Uri.fromFile(file); }
动态申请权限
if (ContextCompat.checkSelfPermission(context,Manifest.permission.CAMERA)!= PackageManager. PERMISSION_GRANTED) { ActivityCompat. requestPermissions( this, new String[]{Manifest.permission. CAMERA },
@Override public void onRequestPermissionsResult
(int requestCode, String[] permissions, int[] grantResults){ if (requestCode == 1000) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //同意申请权限 } else { // 用户拒绝申请权限 Toast.makeText(context,"请同意调起相机权限", Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }