Dostęp do pamięci zewnętrznej w Android API 29
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
W systemie Android 10 Environment.getExternalStorageDirectory()i Environment.getExternalStoragePublicDirectory()zwróci ścieżki pamięci, ale ścieżki nie są odczytywalne ani zapisywalne.
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.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ć zAdvanced 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, wSettings.ACTION_APPLICATION_DETAILS_SETTINGSktórym może on zmienić ustawienia. Zabawne jest to, że Environment.isExternalStorageLegacy () również zwraca wtedy wartość true.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 dlaSettings.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.