Testuj programowo, jeśli w Androidzie 10+ dostęp do starszej pamięci zewnętrznej jest wyłączony

12

Czy istnieje proste wywołanie interfejsu API, które powiedziałoby mi, czy aplikacja działająca na Androidzie 10 lub nowszym musi korzystać z dostępu do Scoped Storage, czyli jeśli normalny dostęp do plików, czyli „Legacy Storage Storage” jest wyłączony? Pamiętaj, że nawet jeśli aplikacja w AndroidManifest.xml, sekcja zadeklarowała:

  android:requestLegacyExternalStorage="true"

dostęp do pliku może nadal zostać zablokowany z powodu zmian zasad Google w przyszłości, więc testowanie tej wartości jest bezużyteczne. Jedyny sposób, jaki znalazłem, to przetestowanie, czy katalog główny pamięci zewnętrznej jest czytelny, ale w tym celu aplikacja musi najpierw poprosić o pozwolenie na przechowywanie, które jest bezużyteczne w przypadku jakichkolwiek innych rzeczy, jeśli starsza pamięć jest wyłączona.

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

Myślę, że kiedyś widziałem nowy interfejs API do wykrywania tego, ale nie mogę już znaleźć tego artykułu ...

gregko
źródło
an app running on Android 10 or later must use Scoped Storage access? Czy możesz wyjaśnić, co masz na myśli? Jakie masz na myśli funkcje? Wiem, że na przykład woluminy pamięci i Menedżer pamięci, które zostały przyniesione dla N, są już przestarzałe dla Q.
blackapps
Mam na myśli regularny dostęp do plików Java poza piaskownicą przypisaną do aplikacji przez system lub np. W kodzie JNI C / C ++ fopen (tryb „nazwa_pliku.ext”, tryb); nie będzie działać (odmowa dostępu), jeśli ścieżka do pliku jest poza katalogiem aplikacji przypisanym przez system. Cóż, teraz będzie działać na Androidzie 10, jeśli używasz Androida: requestLegacyExternalStorage = "true" w manifeście, ale jest to rozwiązanie tymczasowe i może zostać całkowicie wyłączone w przyszłym roku. Czytaj więcej np. Androidcentral.com/what-scoped-storage-android-q
gregko
Nawet w tym artykule nie jest jasne, jaki byłby zakres przechowywania.
blackapps
@blackapps, może ten artykuł wyjaśnia to lepiej: developer.android.com/training/data-storage/files/…
gregko
Ok. Ograniczony dostęp tylko do prywatnych katalogów aplikacji.
blackapps,

Odpowiedzi:

8

Możesz użyć tych dwóch metod z android.os.Environment:

  • isExternalStorageLegacy(File path)

    Zwraca, czy współużytkowany / zewnętrzny nośnik pamięci w podanej ścieżce jest starszym widokiem, który zawiera pliki nie będące własnością aplikacji.

  • isExternalStorageLegacy()

    Zwraca, czy podstawowy współużytkowany / zewnętrzny nośnik pamięci jest starszym widokiem, który zawiera pliki nie będące własnością aplikacji.

Ta wartość może różnić się od wartości wymaganej przez requestLegacyExternalStoragemanifest aplikacji, ponieważ aplikacja może odziedziczyć swój starszy stan na podstawie pierwszej instalacji.

Nie-starsze aplikacje mogą dalej odkrywać i czytać multimedia należące do innych aplikacji za pośrednictwem MediaStore.

Jeśli odkryjesz, że masz dostęp do starszej pamięci masowej, osobiście uważam, że lepiej jest po prostu migrować dane do pamięci masowej o określonym zasięgu i korzystać z niej zamiast tego, ponieważ starsza pamięć masowa może przestać działać bez ostrzeżenia.

Zaffy
źródło
1
Dziękuję, Zaffy, właśnie takiej odpowiedzi szukałem. Działa idealnie i nie trzeba pytać o „Dostęp do pamięci”.
gregko,