คำถามดีๆมากมายมาดูกัน :)
คุณใช้มันอย่างไร?
นี่คือบทช่วยสอนที่ยอดเยี่ยมสำหรับการโต้ตอบกับ Storage Access Framework ใน KitKat:
https://developer.android.com/guide/topics/providers/document-provider.html#client
การโต้ตอบกับ API ใหม่ใน Lollipop นั้นคล้ายกันมาก ในการแจ้งให้ผู้ใช้เลือกแผนผังไดเร็กทอรีคุณสามารถเริ่มต้นเจตนาดังนี้:
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();
}
}
Uri ที่ส่งคืนDocumentFile.getUri()
มีความยืดหยุ่นเพียงพอที่จะใช้กับ API แพลตฟอร์มที่แตกต่างกัน ตัวอย่างเช่นคุณสามารถแบ่งปันโดยใช้Intent.setData()
กับIntent.FLAG_GRANT_READ_URI_PERMISSION
ไฟล์.
หากคุณต้องการเข้าถึง Uri นั้นจากโค้ดเนทีฟคุณสามารถเรียกContentResolver.openFileDescriptor()
ใช้แล้วใช้ParcelFileDescriptor.getFd()
หรือdetachFd()
รับจำนวนเต็มตัวอธิบายไฟล์ POSIX แบบดั้งเดิม
คุณจะตรวจสอบได้อย่างไรว่าคุณสามารถเข้าถึงไฟล์ / โฟลเดอร์ได้หรือไม่?
ตามค่าเริ่มต้น Uris ที่ส่งคืนผ่าน Intent Storage Access Frameworks จะไม่คงอยู่ในระหว่างการรีบูต แพลตฟอร์ม "เสนอ" ความสามารถในการคงสิทธิ์ แต่คุณยังต้อง "รับ" การอนุญาตหากคุณต้องการ ในตัวอย่างของเราด้านบนคุณจะเรียก:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
คุณสามารถทราบได้ตลอดเวลาว่าแอปของคุณมีสิทธิ์เข้าถึงอะไรบ้างผ่านContentResolver.getPersistedUriPermissions()
API ถ้าคุณไม่จำเป็นต้องเข้าถึงไปยังยืนกราน Uri ContentResolver.releasePersistableUriPermission()
คุณสามารถปล่อยมันด้วย
มีให้ใน KitKat หรือไม่
ไม่เราไม่สามารถเพิ่มฟังก์ชันการทำงานใหม่ย้อนหลังให้กับแพลตฟอร์มเวอร์ชันเก่าได้
ฉันสามารถดูว่าแอปใดบ้างที่สามารถเข้าถึงไฟล์ / โฟลเดอร์ได้
ขณะนี้ยังไม่มี UI ที่แสดงสิ่งนี้ แต่คุณสามารถดูรายละเอียดได้ในส่วน "สิทธิ์ Uri ที่ได้รับ" ของadb shell dumpsys activity providers
เอาต์พุต
จะเกิดอะไรขึ้นหากติดตั้งแอปสำหรับผู้ใช้หลายคนในอุปกรณ์เดียวกัน
การให้สิทธิ์ Uri แยกตามผู้ใช้แต่ละคนเช่นเดียวกับฟังก์ชันแพลตฟอร์มผู้ใช้หลายคนอื่น ๆ นั่นคือแอปเดียวกันที่ทำงานภายใต้ผู้ใช้สองคนที่แตกต่างกันไม่มีการให้สิทธิ์ Uri ที่ทับซ้อนกันหรือใช้ร่วมกัน
สามารถเพิกถอนสิทธิ์ได้หรือไม่
DocumentProvider ที่สำรองไว้สามารถเพิกถอนสิทธิ์ได้ตลอดเวลาเช่นเมื่อเอกสารบนคลาวด์ถูกลบ วิธีที่พบบ่อยที่สุดในการค้นหาสิทธิ์ที่ถูกเพิกถอนเหล่านี้คือเมื่อพวกเขาหายไปจากที่ContentResolver.getPersistedUriPermissions()
กล่าวมาข้างต้น
สิทธิ์จะถูกเพิกถอนเมื่อใดก็ตามที่มีการล้างข้อมูลแอปสำหรับแอปใดก็ตามที่เกี่ยวข้องกับการให้สิทธิ์
การขออนุญาตจะทำงานซ้ำในโฟลเดอร์ที่เลือกหรือไม่
ใช่ACTION_OPEN_DOCUMENT_TREE
เจตนาช่วยให้คุณสามารถเข้าถึงไฟล์และไดเร็กทอรีทั้งที่มีอยู่และที่สร้างขึ้นใหม่
อนุญาตให้เลือกหลายรายการหรือไม่
ใช่การเลือกหลายรายการได้รับการสนับสนุนตั้งแต่ KitKat และคุณสามารถอนุญาตได้โดยการตั้งค่าEXTRA_ALLOW_MULTIPLE
เมื่อเริ่มACTION_OPEN_DOCUMENT
จุดประสงค์ของคุณ คุณสามารถใช้Intent.setType()
หรือEXTRA_MIME_TYPES
จำกัด ประเภทไฟล์ที่สามารถเลือกได้:
http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
มีวิธีในโปรแกรมจำลองเพื่อลองใช้ API ใหม่หรือไม่?
ใช่อุปกรณ์จัดเก็บข้อมูลหลักที่ใช้ร่วมกันควรปรากฏในเครื่องมือเลือกแม้ในโปรแกรมจำลอง ถ้า app ของคุณใช้เฉพาะการจัดเก็บข้อมูลการเข้าถึงกรอบสำหรับการเข้าถึงที่จัดเก็บข้อมูลที่ใช้ร่วมกันคุณไม่จำเป็นต้องมีREAD/WRITE_EXTERNAL_STORAGE
สิทธิ์ที่ทุกคนและสามารถลบออกหรือใช้android:maxSdkVersion
คุณลักษณะเพียงขอให้พวกเขาบนแพลตฟอร์มรุ่นเก่า
จะเกิดอะไรขึ้นเมื่อผู้ใช้แทนที่การ์ด SD ด้วยการ์ดอื่น
เมื่อมีส่วนเกี่ยวข้องกับสื่อทางกายภาพ UUID (เช่นหมายเลขประจำเครื่อง FAT) ของสื่อที่อยู่เบื้องหลังจะถูกเบิร์นลงใน Uri ที่ส่งคืนเสมอ ระบบใช้สิ่งนี้เพื่อเชื่อมต่อคุณกับสื่อที่ผู้ใช้เลือกไว้ในตอนแรกแม้ว่าผู้ใช้จะสลับสื่อระหว่างช่องหลายช่อง
หากผู้ใช้สลับการ์ดใบที่สองคุณจะต้องแจ้งให้เข้าถึงการ์ดใหม่ เนื่องจากระบบจำการให้สิทธิ์ตาม UUID คุณจะยังคงได้รับสิทธิ์การเข้าถึงการ์ดเดิมก่อนหน้านี้หากผู้ใช้ใส่เข้าไปใหม่ในภายหลัง
http://en.wikipedia.org/wiki/Volume_serial_number