首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SD 卡保存圖片權限:需在 Manifest 聲明 WRITE_EXTERNAL_STORAGE

     編輯:程式設計綜合問答

錯誤現象

調用 `FileOutputStream` 寫入 `/sdcard/...` 拋出 `FileNotFoundException` 或 `IOException`,Toast 顯示權限錯誤。

解決:Manifest 添加權限

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application ...> ... </application>
</manifest>

Android 6.0+ (Marshmallow) 動態權限

僅聲明不夠,**運行時必須請求用戶授權**:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_CODE_WRITE_STORAGE);
} else {
    saveImage(); // 已授權,直接保存
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CODE_WRITE_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        saveImage();
    } else {
        Toast.makeText(this, "需要存儲權限", Toast.LENGTH_SHORT).show();
    }
}

Android 10 (Q) 分區存儲

  • 應用**無需權限**即可讀寫 **自有目錄**(`getExternalFilesDir()`、`getExternalCacheDir()`)。
  • 訪問公共目錄(DCIM、Pictures、Download)需 **MediaStore** 插入或 **SAF** (Storage Access Framework) 讓用戶選擇目錄。
  • 直接寫入 `/sdcard/xxx.png` 在 Android 10+ 會失敗。

最佳實踐

// 保存到應用私有外部目錄(無需權限,卸載自動刪除)
File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "qr11.png");
try (FileOutputStream out = new FileOutputStream(file)) {
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved