Wiele dobrych pytań, zagłębmy się. :)
Jak tego używasz?
Oto świetny samouczek dotyczący interakcji z platformą dostępu do magazynu w KitKat:
https://developer.android.com/guide/topics/providers/document-provider.html#client
Interakcja z nowymi interfejsami API w Lollipop jest bardzo podobna. Aby zachęcić użytkownika do wybrania drzewa katalogów, możesz uruchomić następującą intencję:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
Następnie w swojej onActivityResult () możesz przekazać wybrany przez użytkownika Uri do nowej klasy pomocnika DocumentFile. Oto krótki przykład, który wyświetla listę plików w wybranym katalogu, a następnie tworzy nowy plik:
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();
}
}
Zwracany identyfikator Uri DocumentFile.getUri()
jest wystarczająco elastyczny, aby można go było używać z różnymi interfejsami API platformy. Na przykład możesz udostępnić go za Intent.setData()
pomocą Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Jeśli chcesz uzyskać dostęp do tego Uri z kodu natywnego, możesz wywołać, ContentResolver.openFileDescriptor()
a następnie użyć ParcelFileDescriptor.getFd()
lub, detachFd()
aby uzyskać tradycyjną liczbę całkowitą deskryptora pliku POSIX.
Jak sprawdzić, czy masz dostęp do plików / folderów?
Domyślnie Uris zwrócone przez intencje Storage Access Framework nie są utrwalane po ponownym uruchomieniu. Platforma „oferuje” możliwość utrwalenia pozwolenia, ale nadal musisz „odebrać” pozwolenie, jeśli chcesz. W naszym przykładzie powyżej zadzwoniłbyś:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Zawsze możesz dowiedzieć się, do czego utrzymywana aplikacja ma dostęp za pośrednictwem ContentResolver.getPersistedUriPermissions()
interfejsu API. Jeśli nie potrzebujesz już dostępu do utrwalonego Uri, możesz go zwolnić za pomocą ContentResolver.releasePersistableUriPermission()
.
Czy to jest dostępne na KitKat?
Nie, nie możemy wstecznie dodawać nowych funkcji do starszych wersji platformy.
Czy mogę zobaczyć, które aplikacje mają dostęp do plików / folderów?
Obecnie nie ma interfejsu użytkownika, który to pokazuje, ale szczegóły można znaleźć w sekcji „Udzielone uprawnienia Uri” danych adb shell dumpsys activity providers
wyjściowych.
Co się stanie, jeśli aplikacja zostanie zainstalowana dla wielu użytkowników na tym samym urządzeniu?
Przyznania uprawnień Uri są izolowane dla poszczególnych użytkowników, podobnie jak wszystkie inne funkcje platformy dla wielu użytkowników. Oznacza to, że ta sama aplikacja działająca w ramach dwóch różnych użytkowników nie ma nakładających się ani współdzielonych uprawnień Uri.
Czy uprawnienia można cofnąć?
Wspierający DocumentProvider może odwołać uprawnienia w dowolnym momencie, na przykład w przypadku usunięcia dokumentu w chmurze. Najczęstszym sposobem na wykrycie tych odwołanych uprawnień jest ich zniknięcie z ContentResolver.getPersistedUriPermissions()
wymienionych powyżej.
Uprawnienia są również odwoływane za każdym razem, gdy dane aplikacji są czyszczone dla dowolnej aplikacji uczestniczącej w przyznaniu.
Czy pytanie o pozwolenie działałoby rekurencyjnie w wybranym folderze?
Tak, ACTION_OPEN_DOCUMENT_TREE
intencja zapewnia rekurencyjny dostęp zarówno do istniejących, jak i nowo utworzonych plików i katalogów.
Czy to pozwala na wielokrotny wybór?
Tak, wielokrotny wybór jest obsługiwany od KitKat i możesz na to zezwolić, ustawiając je EXTRA_ALLOW_MULTIPLE
podczas rozpoczynania ACTION_OPEN_DOCUMENT
zamiaru. Możesz użyć Intent.setType()
lub, EXTRA_MIME_TYPES
aby zawęzić typy plików, które można wybrać:
http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
Czy istnieje sposób na emulator, aby wypróbować nowy interfejs API?
Tak, podstawowe współdzielone urządzenie magazynujące powinno pojawić się w selektorze, nawet w emulatorze. Jeśli tylko Twoja aplikacja korzysta z dostępu do pamięci ram dostępu do pamięci współdzielonej, które nie są już potrzebne READ/WRITE_EXTERNAL_STORAGE
uprawnienia na wszystkich i można je usunąć lub skorzystać z android:maxSdkVersion
funkcji, aby tylko zwrócić je w starszych wersjach platformy.
Co się stanie, gdy użytkownik wymieni kartę SD na inną?
W przypadku nośnika fizycznego identyfikator UUID (taki jak numer seryjny FAT) nośnika podstawowego jest zawsze zapisywany w zwracanym identyfikatorze Uri. System wykorzystuje to, aby połączyć Cię z nośnikiem wybranym przez użytkownika, nawet jeśli użytkownik zamienia nośnik między wieloma gniazdami.
Jeśli użytkownik wymieni drugą kartę, musisz poprosić o dostęp do nowej karty. Ponieważ system zapamiętuje przyznane granty na podstawie identyfikatora UUID, nadal będziesz mieć wcześniej przyznany dostęp do oryginalnej karty, jeśli użytkownik włoży ją ponownie później.
http://en.wikipedia.org/wiki/Volume_serial_number