問題タブ [android-fileprovider]
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 - サポート FileProvider を使用して他のアプリとコンテンツを共有するにはどうすればよいですか?
Android サポート ライブラリのFileProviderを使用して、内部ファイルを外部アプリケーションと正しく共有する (OPEN ではない) 方法を探しています。
ドキュメントの例に従って、
次のように、ShareCompat を使用してファイルを他のアプリと共有します。
FLAG_GRANT_READ_URI_PERMISSIONdata
はインテントの で指定された Uri の許可のみを付与し、EXTRA_STREAM
エクストラの値 (によって設定されたものsetStream
) を付与しないため、機能しません。
プロバイダーを に設定android:exported
してセキュリティを侵害しようとしましたが、それ自体がエクスポートされているかどうかを内部的にチェックし、エクスポートされている場合は例外をスローします。true
FileProvider
android - FileProvider の Hello World
この質問にはいくつかのサブ質問が含まれていました。この質問から始めて、これらをフォークしています。この質問を削除して、最終的にクリーンアップします。
次のプログラムは、理論上、hello-world テキスト ファイルを共有します。コードは実行されますが、Dropbox または Gmail への共有 (具体的な例を 2 つだけ示します) は失敗します。
res/values/strings.xml に値を追加する以外に、Eclipse が作成send_to
するジェネリックに対して行った唯一の他の変更は、AndroidManifest.xml に次のタグを追加することです。Hello, World
<provider>
...そして res/xml/my_paths.xml に以下を追加します
私の主な質問は最初の質問ですが、このトピックについて話している間に、質問 2 から 4 についての議論も興味深いでしょう。
- 上記のプログラムが失敗するのはなぜですか?
- custom が必要な場合は
ContentProvider
そのクラスを拡張する必要がありますが、 だけが必要な場合はFileProvider
、派生なしでそのクラスを使用できますか? - このコードでは、 を 1
filename
回と で 2 回使用する必要がopenFileOutput
ありましたnew File()
。この重複を回避する方法はありますか (同じファイルが参照されていることを保証します)? - が呼び出された直後にファイルを削除しても安全です
startActivity(..)
か、それともファイルがアップロード/共有されたことを知るのを待つコールバックを考案する必要がありますか? (実際のファイルは、共有/アップロードに時間がかかる場合があります。)
編集
コードは正常に実行され、送信先のアプリのリストが表示されます。
Dropbox を選択すると、問題なく場所を選択できます。Dropbox は、「Dropbox にアップロードしています」という通知に続いて「アップロードに失敗しました: my_file.txt」という通知を送信します。
Gmailを選択すると、受信者を入力でき、ファイルが添付されているように見えますが、「メッセージを送信しています..」の後に「添付ファイルを送信できませんでした」と表示されます。
android - FileProvider を使用してキャッシュされた画像を共有する
Universal Image Loaderを使用してインターネットから写真をダウンロードし、それらを data/data/com.myapp/cache にキャッシュして ImageViews に表示するアプリがあります。
また、アプリに共有 (WhatsApp、Facebook、Instagram、Dropbox など) を追加したかったので、次のコードを使用してみました。
photoUri は、他のアプリが読み取る権限を持たないキャッシュ フォルダー内の uri でした。
だから私はgoogled/stackoverflowedし、 FileProviderを使用する必要があることがわかりました。
マニフェストで FileProvider を次のように構成しました (ここに書かれているように):
そして file_paths.xml:
次に、ボタン onClickListener のアクティビティで次のコードを使用します。
ただし、アプリによっては奇妙な例外が発生します。このような:
または、次のようなログが表示されます。
そしてもちろん、アプリ自体がエラーで乾杯します (ファイルを開いたりダウンロードしたりできません)。
私はたくさん試し、グーグルで調べ、スタックオーバーフローしたので、今ここに投稿しています。私はそれを正しくやっていると思います、多分何か小さなことが間違っているだけです...
どんな助けでも大歓迎です!
android - 他のアプリへのフレックスネイティブ拡張内で共有内部ファイルを使用することが可能 (例: FileProvider を使用)
Adobe Flex アプリケーションの一部として、フレックス コードから生成されたファイルを使用して添付ファイル付きの電子メールを送信できるようにするための Android ネイティブ拡張機能を作成しています。ただし、機密データが含まれている可能性があるため、ファイルを誰でも読み取り可能にしたくありません。したがって、アプリの内部ストレージ領域/キャッシュ内からファイルを送信したいと考えています。インテントを使用して他のアプリ (Gmail など) と通信し、メールを送信しています。
いくつかの調査を行った後、FileProvidersの機能がまさに私が望んでいることを実行する必要があることを発見しました。ただし、静的メソッドFileProvider.getUriForFile()は、ネイティブ拡張をサイレントに失敗/クラッシュさせます。ネイティブ拡張機能は停止し、エラーや LogCat からの出力なしで null を返します。
文字列を解析して Uri を手動で作成すると、Gmail はメールにファイルを添付できないと不平を言い、メールは添付ファイルなしで送信されます。
FREObject call() のコード:
マニフェスト ファイル:
my_paths.xml で:
LogCat 出力:
file:// Uri を使用して外部ストレージからファイルを送信しようとすると、添付ファイルは完全に機能します。ただし、前述のように、添付ファイルには機密データが含まれている可能性があるため、外部ストレージの使用は避けたいと考えています。
私が見ていると信じているのは、FileProviders がネイティブ拡張機能内で機能しないということです。ContentProvider も使用してみましたが、Constructor メソッドも onCreate メソッドも呼び出されませんでした。
ContentProvider マニフェスト:
マイコンテンツプロバイダー:
何か間違ったことをしているのですか、それとも ContentProviders / FileProviders が flex ネイティブ拡張内でサポートされていないだけですか? または、内部ストレージにあるファイルを電子メールに添付するための他のソリューションはありますか。SO と Google で検索しても、特に FileProvider.getUriForFile() に関して、同様の経験をした人は他にいません。ヘルプ/コメントをいただければ幸いです。
テキストの壁で申し訳ありません。これまでに試したこと、および何が機能し、何が機能しないかをすべて記録したかったのです。
tldr; ContentProviders / File Providers はフレックス ネイティブ拡張機能で動作しますか? 内部ファイルを電子メールの添付ファイルとして送信する他の方法はありますか?
mediastore - FileProvider または MediaStore と画像を共有する
私は次の問題をしなければなりません。インテント チューザーを使用して、できるだけ多くのアプリに画像を共有したいと考えています。それを達成するには、2 つのオプションがあります。
に画像を保存します
MediaStore
。ただし、それは、ユーザーが許可しなくても、その画像がギャラリーに表示されることを意味します。または、 を使用して画像を共有し
FileProvider
ます。ただし、FileProvider
一部のアプリを使用すると機能せず、次の例外がスローされます。
java.lang.IllegalStateException: CursorWindow から行 0、列 0 を読み取ることができませんでした。Cursor からデータにアクセスする前に、Cursor が正しく初期化されていることを確認してください。android.database.CursorWindow.nativeGetLong(Native Method) で android.database.CursorWindow.getLong(CursorWindow.java:507) で android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75) で android.database.CursorWrapper.getLong (CursorWrapper.java:106) ehz.a (PG:175) で duj.a (PG:540) com.google.android.apps.photos.phone.SendContentActivity.onClick(PG:177) で com.android .internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) で android.os.Handler.dispatchMessage(Handler.java:102) で android.os.
オプションを使用すると、ギャラリーから画像を非表示にして、他のすべてのアプリと画像を共有できるため、作業FileProvider
は私にとって完璧です..nomedia
誰かがこれを解決できましたか?他のすべてのアプリからアクセスできる画像を共有する別のオプションはありますか?
ありがとう
android - IllegalArgumentException: FileProvider.getUriForFile で xxx を含む構成ルートが見つかりませんでした
ファイルの共有に関するAndroid チュートリアルに従おうとしています。私はこのように設定しましたFileProvider
:
メインのマニフェスト xml:
res/xml/filpaths.xml ファイル:
そして、私のコードでは、次のことを試みています:
requestFile は、ファイルの適切な作業パスでインスタンス化されます。そのファイルのパスは、getExternalFilesDir(Environment.DIRECTORY_PICTURES)
返されるものから正確に始まります。すべてが適合しているように見えるため、何がエラーを発生させるのか理解できません。前もって感謝します。
android - FileProvider とファイルを共有するときの grantUriPermission での SecurityException
2つのアプリケーションがあります。FileProvider を使用して、アプリケーション A からアプリケーション B にファイルを共有しようとしています。アプリケーション A は、アプリケーション B の ContentProvider で insert メソッドを呼び出して、レコードを挿入します。挿入されたデータには、アプリ A から共有したいファイルへの Uri が含まれています。アプリ B の ContentProvider は、アプリ A から共有ファイルを読み取ろうとします。ファイルを共有するためにインテントを使用していないため、Context.grantUriPermission
アプリ A を呼び出して、読み取り (場合によっては書き込み) を許可します。
ただし、この行を実行すると、次のようになります (罪のない人を保護するために名前が変更されました)。
アプリ A のマニフェスト ファイルには次のものが含まれます。
filepaths.xml には次のものがあります。
アプリ A とアプリ B の両方に次のものがあります。
両方のアプリで権限を定義しようとしました。どちらも同じデバッグ署名で署名されています。
ファイルが最終的に到達する実際のパスは次のとおりです。
この時点で私は困惑しています。同じアプリケーション内で作成したばかりのファイルにアクセス許可を付与できない理由がわかりません。私の質問は次のとおりです。なぜこの例外が発生するのですか?どうすればアプリ B に許可を与えることができますか?
android - データ URI を処理するアクティビティが見つかりません
基本的に、ユーザーがアプリに提供するデータからレポートを生成したいと考えています。最初に考えたのは、PDF ファイルを生成することでした。唯一の無料ライブラリはテキスト ラッピングなどの機能をサポートしていませんが、有料ライブラリのライセンスは最大 1000 ドルかかるため、これは実行不可能であることが判明しました。
したがって、すべてのコンテンツを含む html ファイルを生成しました。このファイルをデスクトップ Chrome で開くと、正常にレンダリングされます。ユーザーが共有ボタンをクリックすると、アプリはインテントを起動して、既定のブラウザーまたはモバイル Chrome で html ファイルを開く必要があります。
インテントを介してブラウザーで URL を開く方法を知っています。問題はファイルを開くことです。HTML ファイルは FileProvider を介してアクセスされています (つまり、uri の例: "content://[package].fileprovider/[filename].html")。インテントを実行myIntent.setData(htmlFileUri);
して起動すると、ダイアログにブラウザーは表示されず、テキスト エディターのみが表示されます。を使っても同じですsetDataAndType
。
次に、Data Uri: を試しましたdata:text/html;base64,[html as base64]
。繰り返しますが、この文字列をデスクトップ Chrome にコピーすると、問題なく動作します。ただし、この uri でインテントを開始すると、
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=data:text/html;base64,[base64]== typ=text/html }
.
最後にhttp://
、データ URI の先頭に追加すると、chrome またはデフォルト ブラウザを開くオプションが表示されます。私がそうすると、ページのURLでさえ、何もレンダリングされません。
他に試すことができるものはありますか、または一般的な提案はありますか? 前もって感謝します