Тестуйте програмно, якщо в ОС Android 10+ вимкнено доступ до застарілого зовнішнього сховища


12

Чи є простий виклик API, який підкаже мені, чи повинен додаток, що працює на Android 10 або пізнішої версії, скористається доступом до масштабного зберігання, тобто якщо нормальний доступ до файлів, наприклад "Legacy External Storage" відключений? Зауважте, що навіть якщо додаток в AndroidManifest.xml, в розділі оголошено:

  android:requestLegacyExternalStorage="true"

доступ до файлів все ще може бути заборонений через зміни політики Google у майбутньому, тому тестувати це значення марно. Єдиний спосіб, який я знайшов, - це перевірити, чи читається зовнішня коренева директорія зберігання, але для цього додаток повинен спочатку попросити дозвіл на зберігання, який не корисний ні для чого іншого, якщо застаріле зберігання вимкнено.

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.
}

Я думаю, що я колись бачив новий API для виявлення цього, але більше не можу знайти цю статтю ...


an app running on Android 10 or later must use Scoped Storage access? Чи можете ви пояснити, що ви маєте на увазі під цим? Які fuctions ви маєте на увазі? Я знаю, що, наприклад, обсяги зберігання та диспетчер пам’яті, які були передані для N, уже застаріли для Q.
blackapps

Я маю на увазі регулярний доступ до Java-файлів за межами пісочниці, присвоєної програмі системою, або, наприклад, у F / C ++ JNI-коді fopen ("filename.ext", режим); не працюватиме (доступ заборонено), якщо шлях файлу знаходиться за каталогом додатків, призначеним системою. Ну, він буде працювати на Android 10 зараз, якщо ви використовуєте android: requestLegacyExternalStorage = "true" в маніфесті, але це тимчасове рішення і його можливо буде повністю відключено наступного року. Детальніше, наприклад, androidcentral.com/what-scoped-storage-android-q
gregko

Навіть у цій статті незрозуміло, яким буде об'єм зберігання даних.
blackapps

@blackapps, можливо, ця стаття пояснює це краще: developer.android.com/training/data-storage/files/…
gregko

Добре. Обмежений доступ лише до приватних каталогів додатків.
blackapps

Відповіді:


8

Ви можете використовувати ці два методи з android.os.Environment:

  • isExternalStorageLegacy(File path)

    Повертає, чи є спільний / зовнішній носій пам’яті на вказаному шляху - це застаріле подання, яке включає файли, які не належать додатку.

  • isExternalStorageLegacy()

    Повертає, чи є основним спільним / зовнішнім носієм пам’яті спадковий перегляд, який включає файли, які не належать додатку.

Це значення може відрізнятися від значення, яке вимагає requestLegacyExternalStorageв маніфесті програми, оскільки додаток може успадкувати його застарілий стан на основі, коли він був встановлений вперше.

Нестарілі програми можуть продовжувати відкривати та читати засоби масової інформації, що належать іншим програмам, через MediaStore.

Якщо ви виявите, що у вас є доступ до застарілого сховища, особисто я вважаю, що краще просто перенести дані на обсяг пам’яті та використовувати їх замість цього, оскільки застаріле зберігання може припинити роботу без попередження.


1
Дякую, @Zaffy, саме таку відповідь я шукав. Він працює чудово, і не потрібно просити «Доступ до пам’яті».
gregko
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.