問題タブ [scoped-storage]
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 - API レベル 30 でスコープ ストレージを使用すると、一部のオーディオ ファイルにアクセスできないのはなぜですか?
すべてのOPUS
オーディオ ファイルを取得する次のコードがあり、1 つのディレクトリを除くすべてのファイルでうまく機能しますWhatsApp Voice Notes
。下のオーディオファイルWhatsApp Audio
は正常に取得されますが。内部のファイルにアクセスするために不足している制限/許可はありますWhatsApp Voice Notes
か?
android:requestLegacyExternalStorage="true"
PS: Android 10 以前では、マニフェスト以下を使用しuri
てlistFiles
すべてのファイルにアクセスできますfile
。
android - Android 11 のメディアストアをスコープ ストレージで更新するにはどうすればよいですか?
MediaStore.createWriteRequest() を使用して uri 許可を要求し、ユーザー許可を要求しても、曲のタイトル、アルバム、アーティストなどのオーディオ ファイルの MediaStore 列を更新できません。ContentResolver.update を実行すると、 noOfRowsUpdate は 1 になりますが、変更は適用されません。
(Google イシュー トラッカーで同じ問題を提起しました - https://issuetracker.google.com/issues/173134422 )
android - Android 11: DocumentFile findFile() が遅すぎる
今回の Google のストレージ ポリシーの更新により、ファイルの保存方法を変更する必要がありました。
まず、私のアプリケーションは以前にプロジェクト フォルダーを /sdcard/ に保存しました。しかし、このポリシーにより、File を使用したアクセスが不可能になり、いくつかの方法を試しました。
アプリ固有のファイルスペースに保存することも考えましたが、アプリの削除時にプロジェクトフォルダを削除するべきではないため、使用できません。
1.メディアストアの使用
まずはMediaStoreを使ってみました。RELATIVE_PATHを使ってフォルダにファイルを入れることはできたのですが、ファイルの管理が非常に難しく、プロジェクトフォルダ内のファイルもメディア(写真、動画、音楽)とは関係のないファイルです。
2.DocumentFile の使用
別の方法を見つけました。Intent の ACTION_OPEN_DOCUMENT_TREE を使用して、ユーザーからプロジェクト フォルダーのアクセス権とツリー uri を取得し、それを使用して DocumentFile を作成することで、ファイルにアクセスできました。
最初はこれがとても良い方法だと思いましたが、すぐに遅いことがわかりました。
特に、findFile() メソッドの場合、1 つのファイルをスキャンするのに 1 秒近くかかります。私のプロジェクトフォルダには数十個のファイルがあり、これは商品化できませんでした。
より良い方法はありますか?DocumentContracts を試してみてくださいという投稿がいくつかありましたが、ファイルの一覧を取得したり、存在を確認したりする機能はないようです。
以下は私の現在のコードです: まず、ツリーの uri をリクエストします:
次に、ツリー uri を取得します。
特に、このように findFile を使用すると非常に遅くなります。
android - android:requestLegacyExternalStorage="true" が Android 10 で機能しない理由 - API 29
プロジェクト compileSdkVersion を 28 から 29 に移行し、マニフェストに android:requestLegacyExternalStorage="true" を追加しましたが、SDK 28 のようにダウンロードやファイルを開くなどのファイル操作が機能しません
グラドルファイル
マニフェスト ファイル
ファイルダウンロードコード
- パスは、内部ストレージ「/myapp/study materials/」内のフォルダの場所である必要があります
- url は、サーバーからのファイルの場所の URL である必要があります
ファイルを開く
- パスは、内部ストレージ「/myapp/study materials/」内のフォルダの場所である必要があります
- タイトルはファイル名にする必要があります
ファイルの存在チェック
- パスは、内部ストレージ「/myapp/study materials/」内のフォルダの場所である必要があります
- タイトルはファイル名にする必要があります
SDK 29 への更新中に動作しないコードをすべて追加しました。サーバーからファイルをダウンロードして、内部ストレージのアプリ固有のフォルダーに保存したいのですが、ダウンロードする前に、ファイルが既にダウンロードされているかどうかも確認する必要があります。それ。すでにダウンロードされている場合は、そのファイルを開く必要があります