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

Android 刪除 SD 卡檔案失效的常見原因與排查步驟

     編輯:程式設計綜合問答

典型失效代碼

File dir = new File(Environment.getExternalStorageDirectory() + "/MyApp/MyFolder");
if (dir.isDirectory()) {
    File file = new File(card.imagePath); // 疑似路徑錯誤
    file.delete();
}

核心排查清單

  1. 路徑是否正確
    • card.imagePath 是絕對路徑?是否包含在 dir 之下?
    • 建議打印完整路徑對比:Log.d("DELETE", "Target: " + file.getAbsolutePath() + " Exists: " + file.exists())。
  2. 權限聲明
    • Android 9 及以下:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    • Android 10 (API 29)+:針對應用專屬目錄(getExternalFilesDir())無需權限;訪問共享目錄需 MANAGE_EXTERNAL_STORAGE(特殊權限,審核嚴格)或使用 MediaStore API。
  3. 檔案是否被佔用
    • 若檔案正被 MediaPlayer、ImageView 或其他進程讀取,刪除會失敗。需先釋放資源。
  4. 返回值判斷
    • file.delete() 返回 boolean,務必檢查:if (!file.delete()) Log.e("DELETE", "Failed: " + file.getAbsolutePath())。

現代最佳實踐(Android 10+)

// 使用 MediaStore 刪除共享媒體檔案(需用戶授權)
ContentResolver resolver = getContentResolver();
Uri collection = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
String selection = MediaStore.MediaColumns.RELATIVE_PATH + "=?";
String[] selectionArgs = new String[]{"MyApp/MyFolder/"};
int deletedRows = resolver.delete(collection, selection, selectionArgs);
Log.d("DELETE", "Deleted rows: " + deletedRows);

此方式無需 WRITE_EXTERNAL_STORAGE,符合分區儲存規範。

應用專屬目錄刪除(無需權限,隨應用卸載自動清理)

File file = new File(getExternalFilesDir("MyFolder"), "image.jpg");
boolean success = file.delete();
// 或批量刪除
File dir = getExternalFilesDir("MyFolder");
if (dir != null) {
    for (File f : dir.listFiles()) f.delete();
}

總結

刪除失敗 90% 因路徑錯誤或權限不足。優先使用應用專屬目錄(getExternalFilesDir())簡化權限管理;必須操作共享目錄時,Android 10+ 必須遷移至 MediaStore API,舊版本確保 Manifest 權限與動態申請雙重保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved