問題タブ [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 - キットカット ストレージ アクセス フレームワークを使用した後に Google ドライブ ファイル コンテンツ URI を開く
Android 4.4 用の Storage Access Framework を使用し、ファイル ピッカーを開いています。
Googleドライブからファイルを選択する場合を除いて、すべてが機能します。入力ストリームとして開く方法しかわかりませんが、Java Fileオブジェクトを取得したいと思います。
返されるコンテンツ URI は次のようになります: content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279
類似しているが、ファイル名、ファイルサイズ、および内容を取得できる実用的な解決策がない他の質問:
- URI から実際のパスを取得、Android KitKat の新しいストレージ アクセス フレームワーク
- KitKat の Android ギャラリーは、Intent.ACTION_GET_CONTENT に対して異なる Uri を返します。
また、Paul Burke の FileChooser ( https://github.com/iPaulPro/aFileChooser ) も調べましたが、これは問題のリストで最も一般的な質問です。
そのコンテンツ uri からファイルを取得するにはどうすればよいですか?
私の現在の回避策は、入力ストリームから一時ファイルを書き出すことです。
ありがとう!
android - Kitkat の規則と SD カードの制限を処理するにはどうすればよいですか?
バックグラウンド
Kitkat (API 19) 以降、Google は SD カード (より正確には、2 番目の外部ストレージ) にアクセスするためのいくつかの制限と API を追加しました。
サードパーティのアプリは、root 権限を持っているか、システム アプリでない限り、自分のフォルダー以外の SD カードに書き込むことができなくなりました。
Google は、「ファイル ピッカー」と呼ばれる SD カード上のファイルを管理できる組み込みのシステム アプリを追加しました。これには、ユーザーが実行できるいくつかの操作があります。
新しい API は「Storage Access Framework」と呼ばれます。詳細については、こちらを参照してください。
問題
以前は常に可能だった特定の操作を処理する方法に関する情報はあまりありません。確かに、それらはすべての外部ストレージ操作に使用されていましたが、Google がこのタイプのストレージを扱ったのはごく最近のことです。
また、新しい「ファイル ピッカー」で実行できることと実行できないことについて、十分な情報が見つかりませんでした。
フレームワークは他のアプリに属するファイルの操作をサポートしているようですが、一部のファイルはユーザーによって (たとえば PC から) コピーされたものであり、それらがどのように処理されるかはわかりません。
質問
新しい API で次の操作を処理するにはどうすればよいですか?
新しいツールを開いて、ユーザーがファイルを手動で操作できる特定のパスを表示する意図はありますか?
Kitkat から始めて、ツールは常に存在すると仮定できますか? そうでない場合はどうすればよいですか?代替手段はありますか?
SDカードへの書き込みのこの制限を「修正」したユーザーのために(たとえば、このツールを使用して)、フルアクセスが許可されているかどうかを識別する公式の方法はありますか? もちろん、どこかにランダムなファイルを作成して削除しようとするだけではありません...
新しい API で使用できるインテントは何ですか? 私が見つけたすべてのインテントは、他のアプリがサポートしている場合に備えて、他のアプリのファイルの処理に関連していますが、ファイルへのパスを処理するものは見つかりません。
java - SAF コンテンツ URI からのファイル名の抽出
こんにちは、私の仲間のスタックオーバーフローです。
共有インテントを処理するアクティビティを実装したアプリケーションを作成しています。これまでのところ問題なく動作していますが、テスト中に Quickoffice (Android 4.4、KitKat) で問題が発生しました。これは、ファイル名を取得できない URI を返すためです。Dropbox などの他のアプリとの共有も試しましたが、そこで動作します。
Qickoffice アプリから取得した正確な URI:
これは私が最初に使用したコードです:
次のエラーを受け取った場所:
いくつかの調査の結果、Android 4.4 Kitkat では異なるデータを管理する SAF (Storage Access Framework) が導入されていることがわかったので、https://developer.android.com/guide/topics/providers/document-provider.htmlから次のコードを試しました。名前を取得するには:
しかし、エラー コードも表示されます。
Quickoffice から取得した URI から名前を取得する方法を誰かが知っていれば、とても感謝しています。
android - Google ドライブで Storage Access FrameWork を使用して既存のファイルを上書きすることは可能ですか?
Google ドライブにテキスト ファイルを作成するために、ACTION_CREATE_DOCUMENT インテントで Android の Storage Access Framework を使用しています。正常に動作します。
しかし、たとえば「new.txt」という名前のファイルを保存し、5 分後に「new.txt」という名前の別のファイル (内容が異なる) を保存すると、同じ名前の 2 つのファイルが (同じドライブ ディレクトリに) 存在します。 .
その名前(および同じ MIME タイプ)の既存のファイルがあるかどうかを検出し、ACTION_CREATE_DOCUMENT インテントを使用して新しいコンテンツで上書きすることは何とか可能ですか?
ACTION_OPEN_DOCUMENT インテントでユーザーにファイルを選択してほしくありません。実際に前のファイルがない場合 (つまり、初回アップロード)、ユーザーは変更するファイルを選択できないからです。
SDカードにローカルに保存するのではなく、Googleドライブに保存するだけで済みます。Google Drive API を使用できることはわかっていますが、Storage Access Framework を使用してこれに対する簡単な解決策があればよいでしょうか?
android-intent - Android OPEN_DOCUMENT_TREE インテント ルートの場所
Android 5.0 (API レベル 21) で導入されたDirectory Selection APIを使用して、ユーザーがファイルを保存するディレクトリを選択できるようにします。
ディレクトリを選択するには、次のコードのように ACTION_OPEN_DOCUMENT_TREE インテントを作成して送信します。
次のポップアップが表示されます。
ただし、ユーザーに ACTION_OPEN_DOCUMENT インテントを使用してファイルを選択させると:
次に、次のポップアップが表示されます。
Android 5.0.1 Nexus Tab 10 でテストしています。ACTION_OPEN_DOCUMENT_TREE と ACTION_OPEN_DOCUMENT を使用してルートの場所が異なるのはなぜですか? サブツリーの選択をサポートするのは、Internal Storage Document Provider インスタンスのみでしょうか?
また、ユーザーが ACTION_OPEN_DOCUMENT_TREE を使用して Google ドライブ ディレクトリを選択できるようにしたいと考えています。
ACTION_OPEN_DOCUMENT_TREE と ACTION_OPEN_DOCUMENT の両方のリファレンスは次のように述べています。
呼び出されると、システムはデバイスにインストールされているさまざまな DocumentsProvider インスタンスを表示し、ユーザーがそれらをナビゲートできるようにします。
事前にどうもありがとうございました
android - Lollipop で Google ドライブからファイルパスを取得する (MediaStore.MediaColumns.DATA == null)
ユーザーが Google ドライブの [ファイルを送信] ボタンをクリックしてアプリを選択したとき。そのファイルのファイルパスを取得し、ユーザーが別の場所にアップロードできるようにしたいと考えています。
キットカットの電話については、これらの同様の SO 投稿を確認します: Get real path from URI, Android KitKat new storage access framework
Android - lollipop で URI をファイル パスに変換する
ただし、その解決策は Lollipop デバイスでは機能しないようです。
ContentResolver でクエリを実行すると、MediaStore.MediaColumns.DATA が null を返すことが問題のようです。
https://code.google.com/p/android/issues/detail?id=63651
生のファイルシステム パスを取得しようとする代わりに、 ContentResolver.openFileDescriptor() を使用する必要があります。「_data」列は CATEGORY_OPENABLE コントラクトの一部ではないため、ドライブはそれを返す必要はありません。
CommonsWare によるこのブログ投稿を読みましたが、「ContentResolverで Uri を直接使用してみる」ことを提案していますが、これは理解できません。ContentResolvers で URI を直接使用するにはどうすればよいですか?
ただし、これらのタイプの URI にどのようにアプローチするのが最善かについては、まだ明確ではありません。
私が見つけた最善の解決策は、openFileDescriptor を呼び出してから、ファイル ストリームを新しいファイルにコピーし、その新しいファイル パスをアップロード アクティビティに渡すことです。
ここでの唯一の問題は、そのファイルのファイル名を失うことです。これは、ドライブから filePath を取得するためだけに少し複雑に思えます。これを行うより良い方法はありますか?
ありがとう。
編集:したがって、通常のクエリを使用してファイル名を取得できます。次に、それを getDriveAbsolutePath() メソッドに渡すことができます。これで、私が望むものにかなり近づくことができます。唯一の問題は、ファイル拡張子が見つからないことです。私が行ったすべての検索では、ファイルパスを使用して拡張子を取得することをお勧めしますが、これは openFileDescriptor() では実行できません。何か助けはありますか?
しかし、これがこれを行う「正しい」方法であると完全に確信しているわけではありませんか?