Tes secara terprogram jika di Android 10+ akses penyimpanan eksternal lama dinonaktifkan

12

Apakah ada panggilan API sederhana yang akan memberi tahu saya jika aplikasi yang berjalan di Android 10 atau lebih baru harus menggunakan akses Scoped Storage, yaitu, jika akses file normal, alias "Legacy External Storage" dinonaktifkan? Perhatikan bahwa meskipun aplikasi di AndroidManifest.xml, bagian menyatakan:

  android:requestLegacyExternalStorage="true"

akses file mungkin masih ditolak karena perubahan kebijakan Google di masa mendatang, jadi menguji nilai ini tidak berguna. Satu-satunya cara yang saya temukan adalah untuk menguji apakah direktori root penyimpanan eksternal dapat dibaca, tetapi untuk itu, aplikasi harus terlebih dahulu meminta izin Penyimpanan, yang tidak berguna untuk hal lain, jika penyimpanan lama dinonaktifkan.

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

Saya pikir saya pernah melihat API baru untuk mendeteksi ini, tetapi tidak dapat menemukan artikel itu lagi ...

gregko
sumber
an app running on Android 10 or later must use Scoped Storage access? Bisakah Anda menjelaskan apa yang Anda maksud dengan itu? Fuction apa yang Anda pikirkan? Saya tahu bahwa misalnya Volume Penyimpanan dan Manajer Penyimpanan yang dibawa untuk N sudah tidak digunakan lagi untuk Q.
blackapps
Maksud saya akses Java File biasa di luar kotak pasir yang ditugaskan untuk aplikasi oleh sistem, atau misalnya dalam C / C ++ JNI kode fopen ("filename.ext", mode); tidak akan berfungsi (akses ditolak) jika jalur file berada di luar direktori aplikasi yang ditetapkan oleh sistem. Nah, itu akan berfungsi pada Android 10 sekarang, jika Anda menggunakan android: requestLegacyExternalStorage = "true" di manifes, tetapi ini adalah solusi sementara dan mungkin dinonaktifkan sepenuhnya tahun depan. Baca lebih lanjut misalnya androidcentral.com/what-scoped-storage-android-q
gregko
Bahkan dalam artikel itu tidak jelas penyimpanan scoped apa.
blackapps
@blackapps, mungkin artikel ini menjelaskannya dengan lebih baik: developer.android.com/training/data-storage/files/…
gregko
Baik. Akses terbatas ke direktori aplikasi pribadi saja.
blackapps

Jawaban:

8

Anda dapat menggunakan dua metode ini dari android.os.Environment:

  • isExternalStorageLegacy(File path)

    Mengembalikan apakah media penyimpanan bersama / eksternal pada jalur yang diberikan adalah tampilan lawas yang mencakup file yang tidak dimiliki oleh aplikasi.

  • isExternalStorageLegacy()

    Mengembalikan apakah media penyimpanan bersama / eksternal utama adalah tampilan lawas yang mencakup file yang tidak dimiliki oleh aplikasi.

Nilai ini mungkin berbeda dari nilai yang diminta oleh requestLegacyExternalStoragemanifes aplikasi, karena aplikasi mungkin mewarisi status lawasnya berdasarkan pada saat pertama kali dipasang.

Aplikasi non-lawas dapat terus menemukan dan membaca media milik aplikasi lain melalui MediaStore.

Jika Anda menemukan bahwa Anda memiliki akses ke penyimpanan lawas, secara pribadi saya pikir lebih baik memigrasi data ke penyimpanan scoped dan menggunakannya karena penyimpanan lawas mungkin berhenti bekerja tanpa peringatan.

Zaffy
sumber
1
Terima kasih, @Zaffy, inilah jawaban yang sebenarnya saya cari. Ini berfungsi dengan baik, dan tidak perlu meminta "Akses penyimpanan".
gregko