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
……>
這樣可以暫時關閉分區存儲功能,但是在以後的版本中將會被廢棄,如果有時間還是儘早做適配。