問題タブ [storage-access-framework]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android: UID が無効なため、再インストール後にアプリケーションが外部ストレージにアクセスできない
アンインストールして再インストールすると、アプリケーションは外部ストレージのアプリケーション フォルダ ( ) に書き込めなく<sdcard>/Android/data/<applicationpackage>/files
なり、MediaStore プロバイダと連携できなくなり、Storage Access Framework を使用して SD カードの他のファイルにアクセスできなくなります。この問題はランダムに発生しますが、非常に一般的であり、多くのデバイスで簡単に再現できます。
SD カードを搭載した多くの Android 5.x デバイスで再生できます: LG G3 VS985 4G (5.1.1)、LG G Pad V500 (5.0.2)、Alcatel Idol 3、Nvidia SHIELD Tablet K1 (5.1.1)、Verizon SM-G900V (5.0)、およびその他の LG、Alcatel、Asus デバイス...
再現する手順:
- アプリケーションをインストール
<sdcard>/Android/data/<applicationpackage>/files
SD カードのアプリケーションフォルダ ( ) にいくつかのファイルを作成します。このフォルダの UID は、たとえば 10206 です。アプリケーションの UID も 10206 です。SD カードへのアクセスは正常に機能します。Storage Access Framework 経由でアプリケーション フォルダーにアクセスしたり、他のフォルダーにアクセスしたりできます- アプリケーションのアンインストール - SD カードのアプリケーション フォルダが正しく削除されます。
- アプリケーションの再インストール (再インストールの前に完全にアンインストールする必要があります。アプリケーションを更新することにより、アプリケーションを再現することはできません。)
次の 3 つのケースのいずれかが発生する可能性があります。
ケース A) バグなし: アプリケーションの UID がたとえば 10207 に増加し、SD カードのアプリケーション フォルダの UID が同じ - 10207 で、すべて正常に動作します。アプリケーション フォルダーにアクセスしたり、ストレージ アクセス フレームワークを介して他のフォルダーにアクセスしたりできます。
ケース B) バグ: SD カードのアプリとアプリケーション フォルダーの両方の UID は増加せず、10206 のままですが、内部 (システム内) でこのアプリケーション パッケージの UID は明らかに既に異なっています。これにより、次の例外が発生します。
手順 3. と 4. を繰り返した後、ケース C) が常に発生します。ほとんどの場合、ケース C) はケース B) なしですぐに発生し、手順 3. a 4. を繰り返します。
ケース C) バグ: アプリの UID は 10207 などに増加しますが、アプリケーション フォルダー ( <sdcard>/Android/data/<applicationpackage>/files
) の UID は 10206 のままで、アプリケーションからアクセスできません。これにより、次の例外が発生します。
それ以上のアンインストールと再インストールは役に立ちません。アプリケーションフォルダのUIDは10206のまま!アプリのUIDは、再インストールするたびに(正しく)変更されます。唯一の回避策は、デバイスの再起動です。再起動後、アプリケーション UID に従って、アプリケーション フォルダの UID が更新されます。その後、次のアンインストールまですべて正常に動作します。そのため、ユーザーにデバイスの再起動を強制する必要があります。
ノート:
- 次の方法でアプリケーション UID を取得します。
android.os.Process.myUid()
- 次の方法でアプリケーション フォルダの UID を取得します。
Os.stat("<sdcard>/Android/data/<applicationpackage>/files").st_uid
私はかなり長い間この問題に直面しており、今ではそれが何らかの形で異なる UID に関連していると確信しています。うまく修正または回避する方法がわかりません。
android - 5.0 以降の DocumentFile.fromFile
私のテストでは、SAF からルートへのアクセス許可を持っていても、5.0 以降では書き込み ( 、 など) で作成DocumentFile
されたものがfromFile
失敗することがわかりました。createFile
createDirectory
これは予想される動作ですか?
5.0未満の互換性のみを目的としている場合fromFile
、ドキュメントでそれが明確にされていればよかったのにと思います。
java - Android - StorageAccessFramework からの Uri を宛先とするダウンロード マネージャーの問題
ファイルをダウンロードするためにアプリ DownloadManager で使用しています。私はこの方法を使用しています:
Request.setDestinationUri()
外部ストレージからのファイルの宛先Uriとして設定すると、問題なく動作します。しかし、SAF からの宛先 Uri として設定した場合:
しかし、私はこの例外を受け取ります
java.lang.IllegalArgumentException: Not a file URI: content://com.android.externalstorage.documents/tree/D224-A5C1%3Abadu%2Fsd/document/D224-A5C1%3Abadu%2Fsd%2Ff6%2F27%2F85%2Ff4f8d950-d0b7-11e5-9c3c-4b49c28527f6
DownloadManager はファイルを SD カードにダウンロードできますか? この問題を解決する方法を知っていますか?