Android 10以降でレガシー外部ストレージアクセスが無効になっている場合にプログラムでテストする


12

Android 10以降で実行されているアプリがスコープストレージアクセスを使用する必要があるかどうか、つまり通常のファイルアクセス、つまり「レガシー外部ストレージ」が無効になっている場合に通知する単純なAPI呼び出しはありますか?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?それが何を意味するのか説明できますか?どの機能を考えていますか?たとえば、N用に提供されたストレージボリュームとストレージマネージャーは、Qですでに非推奨になっていることを知っています
。– blackapps

システムによってアプリに割り当てられたサンドボックスを超えた通常のJavaファイルアクセス、またはC / C ++ JNIコードfopen( "filename.ext"、mode);などを意味します。ファイルパスがシステムによって割り当てられたアプリディレクトリを超えている場合、機能しません(アクセスが拒否されます)。まあ、マニフェストでandroid:requestLegacyExternalStorage = "true"を使用すれば、Android 10でも動作しますが、これは一時的な解決策であり、来年完全に無効になる可能性があります。続きを読む例:androidcentral.com/what-scoped-storage-android-q
gregko

その記事でも、スコープ付きストレージがどうなるかは明確ではありません。
blackapps

@blackappsは、多分この記事では、より良い、それを説明する:developer.android.com/training/data-storage/files/...
gregko

OK。アプリのプライベートディレクトリへのアクセスのみを制限します。
blackapps

回答:


8

次の2つの方法を使用できますandroid.os.Environment

  • isExternalStorageLegacy(File path)

    指定されたパスにある共有/外部ストレージメディアが、アプリが所有していないファイルを含むレガシービューであるかどうかを返します。

  • isExternalStorageLegacy()

    プライマリ共有/外部ストレージメディアが、アプリが所有していないファイルを含むレガシービューであるかどうかを返します。

requestLegacyExternalStorageアプリが最初にインストールされたときに基づいてアプリがレガシー状態を継承する可能性があるため、この値はアプリのマニフェストでリクエストされた値とは異なる場合があります。

レガシー以外のアプリは、を介して他のアプリに属する​​メディアを引き続き検出して読み取ることができますMediaStore

レガシーストレージにアクセスできることに気付いた場合、個人的には、スコープストレージにデータを移行し、代わりに使用することをお勧めします。これは、レガシーストレージが警告なしに機能しなくなる可能性があるためです。


1
ありがとう、@ Zaffy、これはまさに私が探していた答えです。完全に機能し、「ストレージアクセス」を要求する必要はありません。
gregko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.