AndroidQ新增的分区存储
- Android Q文件存储机制修改成了沙盒模式,和IOS神似
- 应用只能访问自己沙盒下的文件和公共媒体文件
- 对于Android Q以下,还是使用老的文件存储方式
权限变更
Android Q 更改了应用对设备外部存储设备中的文件(如:/sdcard )的访问方式。继续使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,只不过当拥有这些权限的时候,你只能访问媒体文件,无法访问其他文件。
所以在适配Android Q 拍照问题必须使用沙盒模式来存储拍照文件:
/**
* 跳转到照相机
*/
private void gotoCamera() {
Log.d("evan", "*****************打开相机********************");
// 获取图片沙盒文件夹
File dPictures = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//图片名称
String mFileName = "IMG_" + System.currentTimeMillis() + ".jpg";
//图片路径
String mFilePath = dPictures.getAbsolutePath()+"/"+mFileName;
//创建拍照存储的图片文件
// tempFile = new File(FileUtil.checkDirPath(Environment.getExternalStorageDirectory().getPath() + "/image/"), System.currentTimeMillis() + ".jpg");
tempFile = new File(mFilePath);
//跳转到调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//设置7.0中共享文件,分享路径定义在xml/file_paths.xml
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
} else {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
}
startActivityForResult(intent, REQUEST_CAPTURE);
}
最后再发一个一行代码解决的方法:
在AndroidManifest.xml的application中添加一行:
<application
……
android:requestLegacyExternalStorage="true
……>
这样可以暂时关闭分区存储功能,但是在以后的版本中将会被废弃,如果有时间还是尽早做适配。