android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?
很多好的問題,讓我們深入。:)
你如何使用它?
這是一個偉大的教程與KitKat中的存儲訪問框架交互:
在Lollipop中與新的API交互非常相似。要提示用戶選擇目錄樹,您可以啟動這樣的意圖:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
然后在您的onActivityResult()中,您可以將用戶選擇的Uri傳遞給新的DocumentFile輔助類。這里有一個快速示例,列出了挑選的目錄中的文件,然后創建一個新文件:
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足夠靈活,可以與不同的平臺API一起使用。例如,您可以使用Intent.setData()與Intent.FLAG_GRANT_READ_URI_PERMISSION共享它。
如果要從本機代碼訪問Uri,可以調用ContentResolver.openFileDescriptor(),然后使用ParcelFileDescriptor.getFd()或detachFd()獲取傳統的POSIX文件描述符整數。
如何檢查是否可以訪問文件/文件夾?
默認情況下,通過存儲訪問框架返回的Uris意圖不會在重新啟動后持久化。平臺“提供”持久化權限的能力,但是您仍然需要“獲取”權限,如果你想要的。在上面的示例中,您可以調用:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
您可以隨時通過ContentResolver.getPersistedUriPermissions()API找出您的應用可以訪問的持久授權。如果您不再需要訪問持久化Uri,則可以使用ContentResolver.releasePersistableUriPermission()釋放它。
這是在KitKat嗎?
不,我們不能追溯地向平臺的舊版本添加新功能。
我可以看到哪些應用程序有權訪問文件/文件夾?
目前沒有顯示此內容的UI,但您可以在adb shell dumpsys活動提供程序輸出的“Granted Uri Permissions”部分中找到詳細信息。
如果在同一設備上為多個用戶安裝了應用,會發生什么情況?
Uri權限授予在每個用戶的基礎上隔離,就像所有其他多用戶平臺功能一樣。也就是說,在兩個不同用戶下運行的同一個應用程序沒有重疊或共享Uri權限授予。
權限可以撤銷嗎?
支持DocumentProvider可以隨時撤銷權限,例如刪除基于云的文檔時。發現這些撤消的權限的最常見方法是當它們從上面提到的ContentResolver.getPersistedUriPermissions()中消失時。
當針對授權中涉及的任一應用程序清除應用數據時,也會撤銷權限。
將要求在所選文件夾上遞歸授權工作嗎?
是的,ACTION_OPEN_DOCUMENT_TREE意圖讓您遞歸訪問現有和新創建的文件和目錄。
這是否允許多重選擇?
是的,自KitKat以來支持多重選擇,并且您可以在啟動ACTION_OPEN_DOCUMENT意圖時通過設置EXTRA_ALLOW_MULTIPLE來允許它。您可以使用Intent.setType()或EXTRA_MIME_TYPES縮小可以選擇的文件類型:
有沒有辦法在模擬器上嘗試新的API?
是的,主共享存儲設備應該出現在選擇器中,甚至在模擬器上。如果您的應用程序只使用存儲訪問框架訪問共享存儲,您不再需要READ / WRITE_EXTERNAL_STORAGE權限,可以刪除它們,或使用android:maxSdkVersion功能僅在較舊的平臺版本上請求它們。
當用戶用另一個SD卡替換SD卡時會發生什么?
當涉及物理介質時,底層媒體的UUID(例如FAT序列號)總是被燒錄到返回的Uri中。系統使用它將您連接到用戶最初選擇的媒體,即使用戶在多個插槽之間交換媒體。
如果用戶在第二張卡中交換,您需要提示您訪問新卡。由于系統會記住基于每個UUID的授予,如果用戶以后重新插入,您將繼續先前授予對原始卡的訪問權限。
總結
以上是生活随笔為你收集整理的android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 校验html输入值为电话号码,js验证输
- 下一篇: 自定义日历控android,Androi