13

我的應用程序使用DownloadManager將文件下載到設備的Music文件夾的子目錄中。Android 6.0 - 應用程序卸載時將刪除外部存儲文件

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
... 
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/MyStuff/song.mp3"); 
request.setDestinationUri(Uri.fromFile(file)); 

我已經注意到,當應用程序被運行棉花糖的設備卸載文件被刪除(這不是發生在舊的操作系統版本)。 你有什麼想法嗎?

由於

+0

我可以重現此行爲。我對他們這樣做並不感到震驚,但這確實感覺像是迴歸。 – CommonsWare

+2

請注意,Android 5.1(在Nexus 4上測試)的行爲相同,但不會與Android 4.1(在Galaxy Nexus上測試)相同,因此更改發生在該範圍內。這對於Android 6.0來說並不是很嚴格。基於仿真器測試,它看起來像是Android 5.0中的變化 - 4.4保持下載,5.0不變。 – CommonsWare

+0

這是否僅適用於下載的文件,或者應用程序放置在其中一個公用文件夾中的所有文件?如果僅用於下載的文件,那麼快速複製將緩解這種情況,是的? – 323go

回答

5

這是通過一個內部類稱爲DownloadReceiver和定義在com.android.providers.downloadspackage manifest

<receiver android:name=".DownloadReceiver" android:exported="false"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     <action android:name="android.intent.action.UID_REMOVED" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_MOUNTED" /> 
     <data android:scheme="file" /> 
    </intent-filter> 
</receiver> 

完成這裏android.intent.action.UID_REMOVED動作引人注目。它引入了棒棒糖觸發handleUidRemoved()表演

resolver.delete(ALL_DOWNLOADS_CONTENT_URI, Constants.UID + "=" + uid, null); 
+0

這個意圖似乎是指用戶(UID)被刪除,而不是應用程序(刪除用戶後刪除用戶的下載是有意義的。) https://developer.android.com/reference/ android/content/Intent.html#ACTION_UID_REMOVED – FaultException

+2

@FaultException它沒有連接到真實的用戶。它指向分配給應用程序的Linux系統用戶標識。 https://developer.android.com/guide/components/fundamentals.html – tynn

+0

我明白了。我的錯。 – FaultException

相關問題