Marshmallow中的存儲權限錯誤在Lollipop中,下載功能在我的應用程序中運行良好,但是當我升級到Marshmallow時,我的應用程序崩潰并在我嘗試從互聯網下載到SD卡時出現此錯誤:Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE它抱怨這行代碼:DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);manager.enqueue(request);我在應用程序外的清單中擁有權限:<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WAKE_LOCK" />我清理并重建了項目,但它仍然崩潰。
4 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
您應該使用以下方法檢查用戶是否已授予外部存儲權限:
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Log.v(TAG,"Permission is granted"); //File write logic here return true;}
如果沒有,您需要讓用戶授予您的應用權限:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
當然這些僅適用于棉花糖設備,因此您需要檢查您的應用是否在Marshmallow上運行:
if (Build.VERSION.SDK_INT >= 23) { //do your check here }
還要確保您的活動實施 OnRequestPermissionResult
整個權限如下所示:
public boolean isStoragePermissionGranted() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Log.v(TAG,"Permission is granted"); return true; } else { Log.v(TAG,"Permission is revoked"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); return false; } } else { //permission is automatically granted on sdk<23 upon installation Log.v(TAG,"Permission is granted"); return true; }}
權限結果回調:
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]); //resume tasks needing this permission }}

紅顏莎娜
TA貢獻1842條經驗 獲得超13個贊
除非有明確要求在外部存儲上寫入,否則您始終可以選擇將文件保存在app目錄中。在我的情況下,我不得不保存文件,浪費了2至3天后,我發現我是否更改了存儲路徑
Environment.getExternalStorageDirectory()
至
getApplicationContext().getFilesDir().getPath() //which returns the internal app files directory path
它在所有設備上都像魅力一樣。這是因為要在外部存儲上寫入,您需要額外的權限,但在內部應用程序目錄中編寫很簡單。
添加回答
舉報
0/150
提交
取消