Android 10+ sürümünde eski harici depolama erişimi devre dışı bırakılmışsa programlı olarak test edin


12

Android 10 veya sonraki bir sürümde çalışan bir uygulamanın Kapsamlı Depolama erişimi kullanması gerekip gerekmediğini, yani normal dosya erişimi olan "Eski Harici Depolama" devre dışı bırakıldığını söyleyen basit bir API çağrısı var mı? AndroidManifest.xml dosyasındaki uygulama bile bildirildi:

  android:requestLegacyExternalStorage="true"

gelecekte Google politika değişiklikleri nedeniyle dosya erişimi hala reddedilebilir, bu nedenle bu değerin test edilmesi işe yaramaz. Bulduğum tek yol, harici depolama kökü dizininin okunabilir olup olmadığını sınamaktır, ancak bunun için uygulamanın önce eski depolama devre dışı bırakılmışsa başka bir şey için işe yaramayan Depolama izni istemesi gerekir.

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

Sanırım bir zamanlar bunu tespit etmek için yeni bir API gördüm, ancak artık bu makaleyi bulamıyorum ...


an app running on Android 10 or later must use Scoped Storage access? Bununla ne demek istediğini açıklayabilir misin? Aklınızda hangi işlevler var? Örneğin N için getirilen Depolama Birimleri ve Depolama Yöneticisi'nin Q için zaten kullanımdan kaldırıldığını
biliyorum

Sistem tarafından uygulamaya atanan sanal alanın ötesinde düzenli Java Dosya erişimi veya örneğin C / C ++ JNI kod fopen ("dosyaadı.ext", mod); dosya yolu sistem tarafından atanan uygulama dizininin ötesindeyse (erişim reddedildi) çalışmaz. Manifest'te android kullanıyorsanız, şu an Android 10'da çalışacak: manifest'te requestLegacyExternalStorage = "true", ancak geçici bir çözüm ve gelecek yıl tamamen devre dışı bırakılabilir. Daha fazla bilgi için örneğin androidcentral.com/what-scoped-storage-android-q
gregko

Bu makalede bile, kapsamlı depolama alanının ne olacağı açık değildir.
blackapps

@blackapps, belki bu makale daha iyi açıklamaktadır: developer.android.com/training/data-storage/files/…
gregko

Tamam. Yalnızca uygulamaların özel dizinlerine sınırlı erişim.
blackapps

Yanıtlar:


8

Bu iki yöntemi şu yöntemlerden kullanabilirsiniz android.os.Environment:

  • isExternalStorageLegacy(File path)

    Belirli bir yoldaki paylaşılan / harici depolama ortamının, uygulamaya ait olmayan dosyaları içeren eski bir görünüm olup olmadığını döndürür.

  • isExternalStorageLegacy()

    Birincil paylaşılan / harici depolama ortamının, uygulamaya ait olmayan dosyaları içeren eski bir görünüm olup olmadığını döndürür.

Bu değer tarafından talep edilen değerden farklı olabilir requestLegacyExternalStorage , uygulamanın ilk kurulumuna bağlı olarak eski durumunu devralabileceğinden, uygulamanın bildiriminde olabilir.

Eski olmayan uygulamalar, üzerinden diğer uygulamalara ait medyayı bulmaya ve okumaya devam edebilir MediaStore.

Eski depolamaya erişiminiz olduğunu fark ederseniz, kişisel olarak verileri yalnızca depolanan depolama alanına taşımak ve eski depolama biriminin uyarı vermeden çalışmayı durdurabileceğinden daha iyi olduğunu düşünüyorum.


1
Teşekkürler, @Zaffy, tam olarak aradığım cevap bu. Mükemmel çalışıyor ve "Depolama erişimi" istemenize gerek yok.
gregko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.