android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?
很多好的問(wèn)題,讓我們深入。:)
你如何使用它?
這是一個(gè)偉大的教程與KitKat中的存儲(chǔ)訪問(wèn)框架交互:
在Lollipop中與新的API交互非常相似。要提示用戶選擇目錄樹(shù),您可以啟動(dòng)這樣的意圖:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
然后在您的onActivityResult()中,您可以將用戶選擇的Uri傳遞給新的DocumentFile輔助類。這里有一個(gè)快速示例,列出了挑選的目錄中的文件,然后創(chuàng)建一個(gè)新文件:
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// List all existing files inside picked directory
for (DocumentFile file : pickedDir.listFiles()) {
Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
}
// Create a new file and write into it
DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
OutputStream out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
}
}
DocumentFile.getUri()返回的Uri足夠靈活,可以與不同的平臺(tái)API一起使用。例如,您可以使用Intent.setData()與Intent.FLAG_GRANT_READ_URI_PERMISSION共享它。
如果要從本機(jī)代碼訪問(wèn)Uri,可以調(diào)用ContentResolver.openFileDescriptor(),然后使用ParcelFileDescriptor.getFd()或detachFd()獲取傳統(tǒng)的POSIX文件描述符整數(shù)。
如何檢查是否可以訪問(wèn)文件/文件夾?
默認(rèn)情況下,通過(guò)存儲(chǔ)訪問(wèn)框架返回的Uris意圖不會(huì)在重新啟動(dòng)后持久化。平臺(tái)“提供”持久化權(quán)限的能力,但是您仍然需要“獲取”權(quán)限,如果你想要的。在上面的示例中,您可以調(diào)用:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
您可以隨時(shí)通過(guò)ContentResolver.getPersistedUriPermissions()API找出您的應(yīng)用可以訪問(wèn)的持久授權(quán)。如果您不再需要訪問(wèn)持久化Uri,則可以使用ContentResolver.releasePersistableUriPermission()釋放它。
這是在KitKat嗎?
不,我們不能追溯地向平臺(tái)的舊版本添加新功能。
我可以看到哪些應(yīng)用程序有權(quán)訪問(wèn)文件/文件夾?
目前沒(méi)有顯示此內(nèi)容的UI,但您可以在adb shell dumpsys活動(dòng)提供程序輸出的“Granted Uri Permissions”部分中找到詳細(xì)信息。
如果在同一設(shè)備上為多個(gè)用戶安裝了應(yīng)用,會(huì)發(fā)生什么情況?
Uri權(quán)限授予在每個(gè)用戶的基礎(chǔ)上隔離,就像所有其他多用戶平臺(tái)功能一樣。也就是說(shuō),在兩個(gè)不同用戶下運(yùn)行的同一個(gè)應(yīng)用程序沒(méi)有重疊或共享Uri權(quán)限授予。
權(quán)限可以撤銷嗎?
支持DocumentProvider可以隨時(shí)撤銷權(quán)限,例如刪除基于云的文檔時(shí)。發(fā)現(xiàn)這些撤消的權(quán)限的最常見(jiàn)方法是當(dāng)它們從上面提到的ContentResolver.getPersistedUriPermissions()中消失時(shí)。
當(dāng)針對(duì)授權(quán)中涉及的任一應(yīng)用程序清除應(yīng)用數(shù)據(jù)時(shí),也會(huì)撤銷權(quán)限。
將要求在所選文件夾上遞歸授權(quán)工作嗎?
是的,ACTION_OPEN_DOCUMENT_TREE意圖讓您遞歸訪問(wèn)現(xiàn)有和新創(chuàng)建的文件和目錄。
這是否允許多重選擇?
是的,自KitKat以來(lái)支持多重選擇,并且您可以在啟動(dòng)ACTION_OPEN_DOCUMENT意圖時(shí)通過(guò)設(shè)置EXTRA_ALLOW_MULTIPLE來(lái)允許它。您可以使用Intent.setType()或EXTRA_MIME_TYPES縮小可以選擇的文件類型:
有沒(méi)有辦法在模擬器上嘗試新的API?
是的,主共享存儲(chǔ)設(shè)備應(yīng)該出現(xiàn)在選擇器中,甚至在模擬器上。如果您的應(yīng)用程序只使用存儲(chǔ)訪問(wèn)框架訪問(wèn)共享存儲(chǔ),您不再需要READ / WRITE_EXTERNAL_STORAGE權(quán)限,可以刪除它們,或使用android:maxSdkVersion功能僅在較舊的平臺(tái)版本上請(qǐng)求它們。
當(dāng)用戶用另一個(gè)SD卡替換SD卡時(shí)會(huì)發(fā)生什么?
當(dāng)涉及物理介質(zhì)時(shí),底層媒體的UUID(例如FAT序列號(hào))總是被燒錄到返回的Uri中。系統(tǒng)使用它將您連接到用戶最初選擇的媒體,即使用戶在多個(gè)插槽之間交換媒體。
如果用戶在第二張卡中交換,您需要提示您訪問(wèn)新卡。由于系統(tǒng)會(huì)記住基于每個(gè)UUID的授予,如果用戶以后重新插入,您將繼續(xù)先前授予對(duì)原始卡的訪問(wèn)權(quán)限。
總結(jié)
以上是生活随笔為你收集整理的android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 校验html输入值为电话号码,js验证输
- 下一篇: 自定义日历控android,Androi