Dostęp do pamięci zewnętrznej w Android API 29

Sep 11 2020

Próbuję zdobyć narzędzia do sprzątania. Coraz więcej producentów zakazuje rootowania urządzeń z jakiegoś „powodu bezpieczeństwa”, zabrania się NIE prosić o odblokowanie.

Po API 28 ten kod spowoduje błąd:


ActivityCompat.requestPermissions(this, new String[]{
  Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1); // Request permission or not, Will got same result

File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null

Jasne, mogę tego użyć:

android:requestLegacyExternalStorage="true"

Ale wierzę, że w przyszłości zostanie zabity.

Więc, jakikolwiek elegancki sposób zarządzania SDCard?

Odpowiedzi

4 blackapps Sep 11 2020 at 07:10

W systemie Android 10 Environment.getExternalStorageDirectory()i Environment.getExternalStoragePublicDirectory()zwróci ścieżki pamięci, ale ścieżki nie są odczytywalne ani zapisywalne.

  1. W przypadku systemu Android 10 możesz nadal używać ścieżek udostępnionych przez Environment.getExternalStorageDirectory () i Environment.getExternalStoragePublicDirectory (), jeśli dodasz android:requestLegacyExternalStorage="true"do tagu aplikacji w pliku manifestu. W czasie wykonywania aplikacja może dzwonić, Environment.isExternalStorageLegacy()aby sprawdzić, czy żądanie zostało wykonane.

  2. Inną (nieznaną) możliwością (tylko dla Androida 10) jest dodanie <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />do pliku manifestu. Użytkownik musi przejść do zaawansowanych ustawień aplikacji i włączyć z Advanced settings Install unknown apps | Allow from this source. Fajną rzeczą jest to, że użytkownik może zmieniać prawa dostępu. Możesz ułatwić użytkownikowi, jeśli zaimplementujesz zamiar, w Settings.ACTION_APPLICATION_DETAILS_SETTINGSktórym może on zmienić ustawienia. Zabawne jest to, że Environment.isExternalStorageLegacy () również zwraca wtedy wartość true.

  3. Kompilacja dla Androida 11 obie opcje nie działają na urządzeniu z Androidem 11. (Ale nadal działają na urządzeniach z Androidem 10). Ścieżki Environment.getExternalStorageDirectory () i Environment.getExternalStoragePublicDirectory () to usable again in read mode and very often in write mode too. I to jest świetne, ponieważ można po prostu wyświetlić ponownie zawartość katalogów, takich jak Download lub Pictures lub DCIM / Camera, używając klasy File. Ale dodanie <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />do pliku manifestu i zaimplementowanie zamiaru dla Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONda twojej aplikacji dostęp do odczytu / zapisu dla wszystkich plików, nawet na wymiennej karcie micro sd. (Wreszcie możesz usunąć blokadę Google, która uniemożliwia odczyt / zapis własnej karty micro SD na własnym urządzeniu z Androidem przy użyciu własnej aplikacji). Environment.isExternalStorageManager()można użyć do sprawdzenia, czy zezwolenie jest włączone / wyłączone. Tak długo, jak nie próbujesz przesłać swojej aplikacji do sklepu Play, wszystko jest w porządku.