@x-codeの回答に同意しましたが、問題についてあまり明確に説明されていませんが、別のアプリの内部データにアクセスしようとする場合は、アクセス許可が必要です。
アプリに正当に属し、ユーザーがアプリをアンインストールするときに削除する必要があるファイル。これらのファイルは外部ストレージ上にあるため、技術的にはユーザーや他のアプリからアクセスできますが、現実的にはアプリ外のユーザーに価値を提供しないファイルです。
実際、SDKバージョン24が多くのスキームで更新され、ファイルの操作に大幅な変更があることをドキュメントで発見しました。ドキュメントから、file://の問題は次のように説明されています..
パッケージ ドメインの外部で file:// URI を渡すと、受信者がアクセスできないパスを残す可能性があります。したがって、file:// URI を渡そうとすると、FileUriExposedException がトリガーされます。プライベート ファイルのコンテンツを共有するための推奨される方法は、FileProvider を使用することです。
セキュリティ上の理由から、 file:// の代わりに Content:// を使用することを強くお勧めします。そのため、基本的には FileProvider の代わりに ContentProvider を使用します。
それを使用する簡単な例は以下のとおりです。
のAndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>
_paths.xml
次に、フォルダーの下の xml フォルダーにプロバイダー ファイルを作成しres
ます。フォルダーが存在しない場合は、作成する必要がある場合があります。
ファイルの内容を以下に示します。(path=".")
という名前のルート フォルダにある外部ストレージへのアクセスを共有したいと説明していますexternal_files
。
res/xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
今、それを使用するために、
Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
BuildConfig.APPLICATION_ID + ".provider",
createImageFile());
これはこのブログから引用したものなので、完全に理解するために読んでください。