Android API29で外部ストレージにアクセスする

Sep 11 2020

私はいくつかのクリーンアップツールを実現しようとしています。ますます多くのメーカーが何らかの「セキュリティ上の理由」のためにデバイスのルート化を禁止しており、ロック解除を要求しないことは禁止されています。

API 28の後、このコードはエラーになります:


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

確かに、私はこれを使用できます:

android:requestLegacyExternalStorage="true"

しかし、私はそれが将来殺されると信じています。

だから、SDカードを管理するためのエレガントな方法はありますか?

回答

4 blackapps Sep 11 2020 at 07:10

Android 10ではEnvironment.getExternalStorageDirectory()、Environment.getExternalStoragePublicDirectory()ストレージパスを返しますが、パスは読み取りまたは書き込みができません。

  1. Android 10の場合android:requestLegacyExternalStorage="true"、マニフェストファイルのアプリケーションタグに追加すると、Environment.getExternalStorageDirectory()およびEnvironment.getExternalStoragePublicDirectory()によって提供されるパスを引き続き使用できます。実行時に、アプリEnvironment.isExternalStorageLegacy()はリクエストが行われたかどうかを確認するために呼び出すことができます。

  2. もう1つの(不明な)可能性(Android 10のみ)は<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />、マニフェストファイルに追加する ことです。ユーザーはアプリの詳細設定に移動し、から有効にする必要がありAdvanced settings Install unknown apps | Allow from this sourceます。これの良いところは、ユーザーがアクセス権を切り替えることができることです。ユーザーSettings.ACTION_APPLICATION_DETAILS_SETTINGSが設定を変更できる場所のインテントを実装すると、ユーザーが簡単に 設定できるようになります。面白いことに、Environment.isExternalStorageLegacy()もtrueを返します。

  3. Android 11用にコンパイルすると、両方のオプションがAndroid11デバイスでは機能しません。(ただし、Android 10デバイスでも引き続き機能します)。Environment.getExternalStorageDirectory()とEnvironment.getExternalStoragePublicDirectory()のパスはusable again in read mode and very often in write mode tooです。また、Fileクラスを使用して、Download、Pictures、DCIM / Cameraなどのディレクトリの内容を簡単に一覧表示できるので、これはすばらしいことです。ただし<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />、マニフェストファイルに追加してインテントを実装すると Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION、リムーバブルmicro sdカード上でも、アプリにすべてのファイルの読み取り/書き込みアクセスが許可されます。(最後に、あなたはあなた自身のアプリを使ってあなた自身のAndroidデバイスであなた自身のマイクロSDカードを読み書きすることができないグーグル禁止を取り除くことができます)。 Environment.isExternalStorageManager()権限がオン/オフかどうかを確認するために使用できます。アプリをPlayストアにアップロードしようとしない限り、問題はありません。