1. ホーム
  2. アンドロイド

Android 7.0以降で、ClipData.Item.getUriを通じてアプリの外部に公開されているもの。

2022-03-16 21:34:07

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つの方法で問題を解決します。