官方的解决方案:https://developer.android.google.cn/training/secure-file-sharing/setup-sharing.html
步骤1:
在AndroidManifest.xml的(包名是AndroidManifest.xml开头package的属性)
<application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
步骤2:在res里面创建xml文件夹然后在里面创建file_paths.xml的文件,内容如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="camera_photos" />
</paths>
</resources>
步骤3:可以再触发事件中调用相机
File file = new File(Environment.getExternalStorageDirectory(), "/temp/" + System.currentTimeMillis() + ".jpg");
imageUri = Uri.fromFile(file);
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
//通过FileProvider创建一个content类型的Uri
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
imageUri = FileProvider.getUriForFile(UpdataActivity.this, "com.shiyun.fgt.fileprovider",
file);
}
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
startActivityForResult(intent, 1);//1识别码
步骤4:在activity中的onActivityResult里面通过是识别码(1)来识别。方法里面就会返回相机的数据。
动态权限的使用第三方库。(简单方便)
依赖:
compile 'com.lovedise:permissiongen:0.0.6'
a.在触发事件里面判断权限有没有
if (ContextCompat.checkSelfPermission(UpdataActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 没有权限,申请权限。
PermissionGen.needPermission(this, 200, Manifest.permission.CAMERA);
} else {
// 有权限了,直接使用相机。
pho();
}
b.在使用的相机的界面的activity里面编写以下代码(复制粘贴即可)
@Override //权限的返回结果
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
//权限获取成功的调用方法
@PermissionSuccess(requestCode = 200)
public void openCamera() {
pho();
//Toast.makeText(this, "Contact permission is granted", Toast.LENGTH_SHORT).show();
}
//权限获取失败的调用方法
@PermissionFail(requestCode = 200)
public void failOpenCamera() {
//Toast.makeText(this, "Camera permission is not granted", Toast.LENGTH_SHORT).show();
Toast.makeText(this, "相机权限开启失败", Toast.LENGTH_SHORT).show();
}