Android 7.0以降で、ClipData.Item.getUriを通じてアプリの外部に公開されているもの。
Android 7.0でカメラ呼び出し時に新たなエラーが発生する。
android.os.FileUriExposedException:file:///storage/emulated/0/xxx アプリを超えて公開 throughClipData.Item.getUri()
android.os.FileUriExposedException:file:///storage/emulated/0/Download/appName-2.3.0.apk appthrough Intent.getData() を超えて公開されています。
解決方法
1. AndroidManifest.xml に次のコードを追加します。
android:name="android.support.v4.content.FileProvider"
android:authorities="app's package name.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
注意事項
当局:app.fileProviderのパッケージ名
grantUriPermissions: URIへの一時的なアクセスを許可するには、trueを指定する必要があります。
exported: falseでなければなりません。
resource: の @xml/file_paths は、次に追加するファイルです。
2. Create a new xml folder in the res directory and a new file_paths xml file (as follows)
<イグ
3. Open the file_paths.xml file and add the following content
<未定義
パス: アクセスに一時的な認証が必要なパス (. はすべてのパスを表す)
name: アクセスパスに付ける名前
4. Android Nに対応するためのコード修正
Intent intent = new Intent(Intent.ACTION_VIEW);
// determine if it is AndroidN and higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
startActivity(intent);
Twitter共有で以下のエラーが発生しました。
Question file:///storage/emulated/0/photo.jpegexposed beyond app through ClipData.Item.getUri
解決策
Application.onCreateに以下のコードを追加します。
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
Android 7.0以降、アプリが他のアプリに自身のファイルを提供する際にfile://形式のURIを与えると、FileUriExposedExceptionをスローします。これは、Googleがターゲットアプリにファイルのパーミッションがない可能性があり、問題が発生する可能性があると判断するためです。そのため、この動作はすぐに失敗するようにしましょう。
そこで、上記の2つの方法で問題を解決します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例