問題タブ [documentfile]
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 5.0 (Lollipop) 向けに提供された新しい SD カード アクセス API の使用方法
バックグラウンド
Android 4.4 (KitKat) では、Google は SD カードへのアクセスをかなり制限しました。
Android Lollipop (5.0) の時点で、開発者は新しい API を使用して、特定のフォルダーへのアクセスを許可するかどうかをユーザーに確認するよう求めることができます。これについては、この Google グループの投稿に記載されています。
問題
この投稿では、次の 2 つの Web サイトにアクセスするように指示されています。
これは内部の例のように見えますが (後で API デモで表示される可能性があります)、何が起こっているのかを理解するのは非常に困難です。
これは新しい API の公式ドキュメントですが、使用方法について十分な詳細が説明されていません。
これがあなたに言うことです:
ドキュメントのサブツリー全体へのフル アクセスが本当に必要な場合は、まず ACTION_OPEN_DOCUMENT_TREE を起動して、ユーザーがディレクトリを選択できるようにします。次に、結果の getData() を fromTreeUri(Context, Uri) に渡して、ユーザーが選択したツリーの操作を開始します。
DocumentFile インスタンスのツリーをナビゲートするときに、いつでも getUri() を使用して、そのオブジェクトの基になるドキュメントを表す Uri を取得し、openInputStream(Uri) などで使用できます。
KITKAT 以前を実行しているデバイスでコードを簡素化するには、DocumentsProvider の動作をエミュレートする fromFile(File) を使用できます。
質問
新しい API についていくつか質問があります。
- 本当にどうやって使うの?
- 投稿によると、OS は、アプリにファイル/フォルダーへのアクセス許可が与えられたことを記憶します。ファイル/フォルダにアクセスできるかどうかを確認するにはどうすればよいですか? アクセスできるファイル/フォルダのリストを返す関数はありますか?
- Kitkat でこの問題をどのように処理しますか? サポート ライブラリの一部ですか。
- どのアプリがどのファイル/フォルダーにアクセスできるかを示す OS の設定画面はありますか?
- 複数のユーザーが同じデバイスにアプリをインストールするとどうなりますか?
- この新しい API に関する他のドキュメントやチュートリアルはありますか?
- 権限を取り消すことはできますか? もしそうなら、アプリに送信されているインテントはありますか?
- 許可を求めることは、選択したフォルダーに対して再帰的に機能しますか?
- アクセス許可を使用すると、ユーザーの選択によって複数選択の機会をユーザーに与えることもできますか? または、アプリは許可するファイル/フォルダーを具体的にインテントに伝える必要がありますか?
- エミュレータで新しい API を試す方法はありますか? つまり、SD カード パーティションがありますが、プライマリ外部ストレージとして機能するため、(単純なアクセス許可を使用して) すべてのアクセスが既に与えられています。
- ユーザーが SD カードを別のものに交換するとどうなりますか?
android - Android Storage Access Framework とダイレクト ファイル アクセスを併用する
外部 SD カードを含むファイル システムを広範囲に使用するアプリがあります。
現在、ファイル API を使用してファイルの作成/削除/一覧表示を行っていますが、新しい Android Storage Access Framework を使用したいと考えています。
問題は、インストール ベースのほぼ 60% がまだ JB 以下にあり、新しいIntent.ACTION_OPEN_DOCUMENT_TREEが必要なことです。それを実装する方法がよくわかりません。
MyFile のようなアプリで使用する一般的なインターフェイスを作成し、プラットフォームのバージョンに応じて適切な API を使用することを考えましたが、それを行うライブラリが既に存在しない限り、多すぎます。
他の人は何をしていますか?この状況をどのように管理していますか?
android - Android 5.0 用の新しい SD カード アクセス API を使用して Last Modified File 属性を設定するにはどうすればよいですか?
バックグラウンド:
使用: ACTION_OPEN_DOCUMENT_TREE + DocumentFile
詳細: Android 5.0 (Lollipop) 向けに提供された新しい SD カード アクセス API の使用方法
私は質問したい:
ファイルの属性を変更する方法が見つかりません。ありますか?
特に、ファイル クラス メソッドのように、Last Modified 属性を変更する必要があります。
次の場所に代替が見つかりませんでした:
https://developer.android.com/reference/android/support/v4/provider/DocumentFile.html
または、DocumentsContract などの関連クラスの 1 つに...
新しい API のドキュメントはほとんど役に立たず、API 関数の実行速度は非常に遅く、新しい API のコードの書き直しは非常に厄介な作業です。大変なことを言って申し訳ありませんが、Kitkat の「EACCESS (許可が拒否されました) 機能」は私の人生の数年を犠牲にします。解決策の代わりにこれを手に入れます。
編集:
クラスでもsetLastModified(...)メソッドが機能しないようですjava.io.File
(Android バージョン 4.4 以降 - 少なくとも):
https://code.google.com/p/android/issues/detail?id=18624
たとえば、アーカイバ アプリケーションを使用していて、ファイルがアーカイブから抽出された時刻ではなく、実際の最終更新時刻が必要な場合は、申し訳ありません。多くの同期ツールが使い物にならなくなります...
編集2:
Android 5.1 (エミュレータ):setLastModified(long time)
メソッドはまだ機能しません。
編集3:
Android 6.0 (エミュレータ):setLastModified(long time)
メソッドはまだ機能しません。
android - Lollipop で Android Storage Access フレームワークを使用してファイルを一覧表示する際のバグ
バックグラウンド
ファイルの同期に SD カードを多用するアプリがいくつかあります。Kitkat での外部 SD カード アクセスの破損は依然として大きな問題ですが、Lollipop で利用できる新しい API を使用してこれを解決しようとしています。
SD カードへのアクセス許可を正常に要求して保持し、アクセス許可アクティビティから返されたルート Uri にファイルを一覧表示できます。
これがどのように行われるかについての詳細は、こちらを参照してください: how-to-use-the-new-sd-card-access-api-presented-for-lollipop
その後、ユーザーは任意のフォルダー/サブフォルダーを選択して同期することができ、フォルダー ドキュメント Uri を文字列としてデータベースに保存します。
問題
後で、アプリが再起動された後、ファイルの同期が開始される可能性があります。次に、サブフォルダー内のファイルを一覧表示しようとします (覚えておいてください、私には適切なアクセス許可が付与されており、この永続性が機能し、すべての子へのアクセスも許可されます)。
次に、保存された文字列から DocumentFile の新しいインスタンスを作成し、ファイルを一覧表示しようとします。
問題は、listFiles が常に付与されたルート Uri の子を返し、DocumentFile.fromTreeUri メソッドで指定した実際の Uri の子を返さないことです。
DocumentFileのソース コードを調べたところ、そこにバグがあるようです。具体的には、Uri をさらに変更する必要はありません。
DocumentsContractApi21.prepareTreeUri のソースを見ると、Uri が再構築されていることがわかります。
そしてそれが呼び出すメソッド:
getTreeDocumentId によって検出されたドキュメント ID は、メソッドが呼び出される Uri に関係なく、常にルート Uri ID に対応します。これにより、提供されたフレームワーク メソッドを使用してサブ フォルダーの子を一覧表示することができなくなります。
解決
fromTreeUri メソッドを修正して、ルート ドキュメントの Uri ID を常に使用しないようにしてください。
次の醜いハックを実行すると、問題が修正されますが、これは避けたいと思います。
android-5.0-lollipop - Lollipop 用に提供された API を使用して、SD カード上のファイルにランダム アクセスする方法は?
私のアプリケーションは Java クラスRandomAccessFileを使用して、 SeekableByteChannelインターフェイスを実現することにより、SD カード上のファイルにランダムにバイトを読み書きします。ここで、新しい Lollipop API を使用して Android 5.0 用に書き直す必要があります。
私は読む唯一の方法を見つけました:
そして書く:
新しい API のファイルから/へ。
チャネルをランダムな位置に設定し、その位置にバイトを読み書きできるようにしたいと考えています。新しいSDK 21でそれを行うことは可能ですか? 新しいSDKは、この方法でチャネルを取得することを意味しますか:
または他のアプローチ?
java - DocumentFile RandomAccessFile
RandomAccessFile
特定のから を取得する方法はありますDocumentFile
か?
経由で InputStream を取得できることを知っていますgetUri
しかし、私はRandomAccessFile
ご協力いただきありがとうございます、
イェンス
android - Android Lollipop で SD カードにファイルを保存する
Android 5 では、SD カードを操作するための新しい API が導入されています。SC カードのディレクトリにファイルを書き込みたい場合は、そこにアクセスする必要があります。私の知る限り、次の方法で実行できます。
その後:
このコードはフォルダー ピッカーを起動します。フォルダーが選択されると、Uri によるフォルダーに対するアクセス許可が必要になります。
しかし、パスによって正確なディレクトリのアクセス許可を取得することは可能ですか? フォルダ ピッカーを使用せずに。私は、アクセスしたいディレクトリを知っていることを意味し、ユーザーを混乱させるため、フォルダ ピッカーを起動したくありません。
DocumentFile
ユーザーの操作なしで開くには?
android - 新しい Lollipop API を使用して、すべての SD カードにアクセスするにはどうすればよいですか?
バックグラウンド
Lollipop 以降、アプリは実際の SD カードにアクセスできるようになりました (Kitkat ではアクセスできず、以前のバージョンでは正式にサポートされていませんでしたが)。
問題
SD カードをサポートする Lollipop デバイスを目にすることは非常にまれになっており、エミュレーターには SD カード サポートをエミュレートする機能が実際には備わっていないため (または、エミュレートしている?)、それをテストするのにかなりの時間がかかりました。 .
とにかく、通常の File クラスを使用して SD カードにアクセスする代わりに (アクセス許可を取得したら)、 DocumentFile を使用して Uris を使用する必要があるようです。
Uris をパスに、またはその逆に変換する方法が見つからないため、通常のパスへのアクセスが制限されます (さらに、非常に面倒です)。また、現在のSDカードにアクセスできるかどうかを確認する方法がわからないため、ユーザーに読み取り/書き込みの許可をいつ求めるべきかわかりません。
私が試したこと
現在、これは私がすべてのSDカードへのパスを取得する方法です:
これは、到達できる Uris を確認する方法です。
これは、SD カードにアクセスする方法です。
質問
現在の SD カードにアクセスできるかどうかを確認することはできますか?
DocumentFile uris と実際のパスを変換する公式の方法はありますか? 私はこの答えを見つけましたが、私の場合はクラッシュし、ハックのように見えます。
特定のパスについてユーザーに許可を求めることはできますか? たぶん、「はい/いいえを受け入れますか?」というダイアログだけを表示することさえありますか?
許可が与えられたら、DocumentFile API の代わりに通常の File API を使用することは可能ですか?
ファイル/ファイルパスが与えられた場合、それにアクセスするための許可を要求するだけで(そしてそれが以前に与えられているかどうかを確認して)、またはそのルートパスを要求することは可能ですか?
エミュレータにSDカードを持たせることは可能ですか? 現在、「SDカード」と記載されていますが、プライマリ外部ストレージとして機能しており、新しいAPIを試して使用するために、セカンダリ外部ストレージを使用してテストしたいと考えています。
これらの質問のいくつかについては、一方が他方に答えるのに大いに役立つと思います。
android - DocumentFile API を使用してファイルに対して基本的な操作を実行する方法は?
バックグラウンド
API 21 (Lollipop) 以降、アプリは実際の SD カードを変更するための特別な「アクセス許可」を取得できます。これは、私が書いた以前の投稿 (こことここ) に示されています。
問題
ファイルを削除することも作成することもできますが、他の基本的なファイル操作を実行する方法が見つかりません。
- 読み取り、書き込み、InputStream および OutputStream を使用
- ファイルを移動します。
- ファイルだけでなくフォルダを作成する
- ファイルの名前を変更する
- ファイル情報を取得する (最近の更新など)
- 他のアプリを介してファイルを共有/開く。
- 私が忘れていたかもしれない他の操作。
質問
これらの機能を取得するにはどうすればよいですか? たとえば、基本的な読み取りと書き込みを実行することは確かに可能です...