Android API 29'da harici depolamaya erişim

Sep 11 2020

Bazı temizleme araçları elde etmeye çalışıyorum. Giderek daha fazla üretici bazı "güvenlik nedenlerinden" ötürü köklendirme cihazlarını yasakladı, kilit açma talebinde bulunulmaması yasaktır.

API 28'den sonra, Bu kod hata verecektir:


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

Elbette, bunu kullanabilirim:

android:requestLegacyExternalStorage="true"

Ama gelecekte öleceğine inanıyorum.

Peki, SDCard'ı yönetmenin zarif bir yolu var mı?

Yanıtlar

4 blackapps Sep 11 2020 at 07:10

Android 10'da Environment.getExternalStorageDirectory()ve Environment.getExternalStoragePublicDirectory()depolama yollarını döndürür, ancak yollar okunabilir veya yazılabilir değildir.

  1. Android 10 android:requestLegacyExternalStorage="true"için, manifest dosyasındaki uygulama etiketine eklerseniz Environment.getExternalStorageDirectory () ve Environment.getExternalStoragePublicDirectory () tarafından sağlanan yolları kullanmaya devam edebilirsiniz . Çalışma zamanında uygulamanız Environment.isExternalStorageLegacy(), isteğin yerine getirilip getirilmediğini kontrol etmek için arayabilir .

  2. Başka bir (bilinmeyen) olasılık (yalnızca Android 10 için) <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />manifest dosyasına eklemektir . Kullanıcı, uygulamanın gelişmiş ayarlarına gitmeli ve buradan etkinleştirmelidir Advanced settings Install unknown apps | Allow from this source. Bunun güzel yanı, kullanıcının erişim haklarını değiştirebilmesidir. Settings.ACTION_APPLICATION_DETAILS_SETTINGSAyarları değiştirebileceği bir niyet uygularsanız, kullanıcı için bunu kolaylaştırabilirsiniz . Komik bir şey, Environment.isExternalStorageLegacy () 'nin de true döndürmesidir.

  3. Android 11 için derleme, her iki seçenek de bir Android 11 cihazında çalışmaz. (Ancak Android 10 cihazlar için çalışmaya devam ediyorlar). Environment.getExternalStorageDirectory () ve Environment.getExternalStoragePublicDirectory () yolları şunlardır usable again in read mode and very often in write mode too. Ve bu harika, çünkü Dosya sınıfını kullanarak İndir veya Resimler veya DCIM / Kamera gibi dizinlerin içeriğini tekrar listeleyebilirsiniz. Ancak <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />manifest dosyasına eklemek ve bir niyet Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONuygulamak, uygulamanıza çıkarılabilir mikro sd kartta bile tüm dosyalar için okuma / yazma erişimi sağlayacaktır. (Son olarak, kendi uygulamanızı kullanarak kendi mikro SD kartınızı kendi Android cihazınızda okuyamama / yazamama google yasağını kaldırabilirsiniz). Environment.isExternalStorageManager()iznin açık / kapalı olup olmadığını kontrol etmek için kullanılabilir. Uygulamanızı oyun mağazasına yüklemeyi denemediğiniz sürece sorun yok.