Zarządzanie wszystkimi plikami na urządzeniu pamięci masowej

Większość aplikacji, które wymagają dostępu do pamięci współdzielonej, postępuj zgodnie ze sprawdzonymi metodami dotyczącymi udostępniania plików multimedialnych i udostępniania plików innych niż multimedialne. Niektóre aplikacje mają jednak podstawowy przypadek użycia, który wymaga szerokiego dostępu do plików na urządzeniu, ale nie może uzyskać do nich efektywnego dostępu zgodnie ze sprawdzonymi metodami dotyczącymi przechowywania danych, które zapewniają ochronę prywatności. W takich sytuacjach Android zapewnia specjalny dostęp aplikacji o nazwie dostęp do wszystkich plików.

Na przykład podstawowy przypadek użycia aplikacji antywirusowej może wymagać regularnego skanowania wielu plików w różnych katalogach. Jeśli to skanowanie wymaga wielokrotnych interakcji użytkownika przy wybieraniu katalogów za pomocą selektora plików, pogarsza to komfort użytkowników. Inne zastosowania – takie jak aplikacje do zarządzania plikami, aplikacje do tworzenia kopii zapasowych i przywracania kopii zapasowych oraz aplikacje do zarządzania dokumentami – wymagają podobnych uwag.

Prośba o dostęp do wszystkich plików

Aplikacja może poprosić użytkownika o dostęp do wszystkich plików, wykonując te czynności:

  1. Zadeklaruj uprawnienie MANAGE_EXTERNAL_STORAGE w pliku manifestu.
  2. Użyj opcji ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION, aby skierować użytkowników na stronę ustawień systemu, na której będą mogli włączyć tę opcję w przypadku Twojej aplikacji: Zezwól na dostęp do zarządzania wszystkimi plikami.

Aby sprawdzić, czy aplikacja otrzymała uprawnienie MANAGE_EXTERNAL_STORAGE, wywołaj Environment.isExternalStorageManager().

Operacje dozwolone przez MANAGE_EXTERNAL_STORAGE

Uprawnienie MANAGE_EXTERNAL_STORAGE zapewnia:

  • Uprawnienia do zapisu i odczytu wszystkich plików w pamięci współdzielonej.

  • Dostęp do zawartości tabeli MediaStore.Files.

  • Dostęp do katalogu głównego dysku USB on-the-go (OTG) i karty SD.

  • Dostęp z możliwością zapisu do wszystkich katalogów pamięci wewnętrznej⁠ oprócz /Android/data/, /sdcard/Android i większości podkatalogów /sdcard/Android. Te uprawnienia do zapisu obejmują dostęp do bezpośredniej ścieżki pliku.

    Aplikacje, którym przyznano to uprawnienie, nadal nie mają dostępu do katalogów aplikacji należących do innych aplikacji, ponieważ te katalogi są widoczne w wolumie na dane jako podkatalogi Android/data/.

Aplikacja z uprawnieniami MANAGE_EXTERNAL_STORAGE może uzyskiwać dostęp do tych dodatkowych plików i katalogów za pomocą interfejsu API MediaStore lub bezpośrednich ścieżek plików. Podczas korzystania z platformy Storage Access Framework możesz uzyskać dostęp do pliku lub katalogu tylko wtedy, gdy możesz to zrobić bez uprawnienia MANAGE_EXTERNAL_STORAGE.

Wywoływanie aktywności związanej z zarządzaniem miejscem na dane w innej aplikacji

Na Androidzie 12 (poziom interfejsu API 31) i nowszych aplikacje, które mają zarówno uprawnienie MANAGE_EXTERNAL_STORAGE, jak i uprawnienia QUERY_ALL_PACKAGES (np. aplikacje do zarządzania plikami), mogą używać elementu getManageSpaceActivityIntent() do odsyłania użytkowników do działania niestandardowego zarządzania pokojem w innej aplikacji.

Metoda getManageSpaceActivityIntent() przyjmuje nazwę pakietu oraz kod żądania i zwraca jeden z tych rezultatów:

  • PendingIntent, jeśli aplikacja o określonej nazwie pakietu ma zdefiniowaną niestandardową aktywność „zarządzanie pokojem”. Aplikacja do zarządzania plikami, która wywołała metodę getManageSpaceActivityIntent(), może następnie wywołać zwróconą intencję odsyłania użytkowników do niestandardowej aktywności.
  • null, jeśli aplikacja o określonej nazwie pakietu nie określa aktywności „zarządzania pokojem”.

Włącz MANAGE_EXTERNAL_STORAGE na potrzeby testowania

Aby sprawdzić, jak uprawnienie MANAGE_EXTERNAL_STORAGE wpływa na Twoją aplikację, możesz włączyć je do testowania. Aby to zrobić, uruchom to polecenie na komputerze, który jest połączony z urządzeniem testowym:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Powiadomienie dotyczące Google Play

Ta sekcja zawiera powiadomienie dla deweloperów, którzy publikują aplikacje w Google Play.

Aby ograniczyć szeroki dostęp do pamięci współdzielonej, Sklep Google Play zaktualizowaliśmy zasady, które oceniają aplikacje kierowane na Androida 11 (poziom interfejsu API 30) lub nowszego i żądają dostępu do wszystkich plików za pomocą uprawnienia MANAGE_EXTERNAL_STORAGE. Ta zasada obowiązuje od maja 2021 r.

Gdy aplikacja jest kierowana na Androida 11 lub nowszego i deklaruje uprawnienie MANAGE_EXTERNAL_STORAGE, Android Studio wyświetla ostrzeżenie dotyczące lintowania widoczne na ilustracji 1. To ostrzeżenie przypomina, że w Sklepie Google Play obowiązują zasady, które ograniczają wykorzystanie tego uprawnienia.

Rysunek 1. Ostrzeżenie lint w Android Studio, które przypomina deweloperom o zasadach Google Play dotyczących uprawnienia MANAGE_EXTERNAL_STORAGE.

Poproś o uprawnienie MANAGE_EXTERNAL_STORAGE tylko wtedy, gdy aplikacja nie może efektywnie korzystać z interfejsów API bardziej chroniących prywatność, takich jak Storage Access Framework lub Media Store API. Aplikacja może korzystać z tych uprawnień zgodnie z zasadami ich dozwolonego użycia i być bezpośrednio powiązana z podstawowymi funkcjami aplikacji. Jeśli aplikacja ma zastosowania podobne do tych wymienionych poniżej, prawdopodobnie będzie mogła prosić o uprawnienie MANAGE_EXTERNAL_STORAGE:

  • Menedżery plików
  • Aplikacje do tworzenia i przywracania kopii zapasowych
  • Aplikacje antywirusowe
  • Aplikacje do zarządzania dokumentami
  • Wyszukiwanie plików na urządzeniu
  • Szyfrowanie dysków i plików
  • Migracja danych między urządzeniami