您好,登錄后才能下訂單哦!
在Android5.0往后的平臺(tái)上,你想通過(guò)單純的調(diào)用File.delete()或著ContentResolver.delete()來(lái)刪除Sdcard上的文件會(huì)刪除失敗。前者提示沒(méi)有權(quán)限,后者僅僅刪除數(shù)據(jù)庫(kù)文件對(duì)應(yīng)的信息,但物理文件還存在,手機(jī)重啟后MediaScanner會(huì)重新將其信息掃描進(jìn)數(shù)據(jù)庫(kù)。
那既然如此,有沒(méi)有什么辦法可以刪除Sdcard上的文件呢?
root?
將apk放在system下?
這些都太小題大做了,下面介紹一個(gè)在非root情況下使用平臺(tái)正規(guī)api刪除sdcard文件的方法。
在Android平臺(tái)中,提供了一個(gè)名為DocumenstProvider的內(nèi)容提供者,當(dāng)然要使用它就必需繼承它。它的作用就是幫助開(kāi)發(fā)者構(gòu)件一棵Documents樹(shù),樹(shù)的根節(jié)點(diǎn)及文件目錄的根結(jié)點(diǎn)。底下的文件或文件夾就是這棵樹(shù)的枝葉。說(shuō)了這么多,我們來(lái)介紹一下今天的主角:ExternalStorageProvider,他是繼承自DocumenstProvider的一個(gè)平臺(tái)類,通過(guò)它我們就能間接的刪除Sdcard上的文件了。
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);startActivityForResult(intent, 42);
首先通過(guò)上面的代碼打開(kāi)系統(tǒng)的DocumentsUI界面,并選擇Sdcard的更目錄,并點(diǎn)擊確認(rèn),如下圖:
接著在onActivityResult中獲取sdcard在ExternalStorageProvider中對(duì)應(yīng)的uri
Uri data = intent.getData();//data:content://com.android.externalstorage.documents/tree/0C3D-8650%3A
其中0C3D-8650%3A為sdcard的唯一標(biāo)示符,也可看作ID,我們這里記作SDCARD_UUID,并且把上面的Uri data記作SDCARD_URI
接下來(lái)獲取讀寫(xiě)權(quán)限:
getContentResolver().takePersistableUriPermission(data,Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
到這里我們已經(jīng)拿到刪除Sdcard文件的權(quán)限了,接下來(lái)就是怎么去刪了。
//SDCARD_URI上面獲得的//SDCARD_UUID也是上面獲得的//filePath為文件在Sdcard下的相對(duì)路徑Uri uri = DocumentsContract.buildDocumentUriUsingTree(SDCARD_URI, SDCARD_UUID + ":" + filePath); DocumentsContract.deleteDocument(mContentResolver, uri);
OK,Sdcard的文件工程刪除。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。