FileProviderの変更によりAndroid N用のアプリケーションを修正する必要があります。私は基本的に私たちの最後の私たちのためにこのトピックについてすべてを読んだが、ソリューションは私のためにうまくいきませんでした。FileProviderを使用してAndroid Nにダウンロードしたファイルを開く
ここでは、我々のアプリからのダウンロードを開始しDownload
フォルダに格納し、DownloadManager
としてsoonsとして意図ACTION_VIEW
を呼び出し、彼はダウンロードが終了だ告げる私達の前のコードです:
BroadcastReceiver onComplete = new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Log.d(TAG, "Download commplete");
// Check for our download
long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (mDownloadReference == referenceId) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(mDownloadReference);
Cursor c = mDownloadManager.query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
String localUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(localUri);
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
if (mimeType != null) {
Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
openFileIntent.setDataAndTypeAndNormalize(Uri.parse(localUri), mimeType);
openFileIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
try {
mAcme.startActivity(openFileIntent);
}
catch (ActivityNotFoundException e) {
// Ignore if no activity was found.
}
}
}
}
}
}
};
これは、Android M上で動作しますが、しかし、人気のあるFileUriExposedException
のためにNで壊れます。私は今、FileProvider
を使ってこれを修正しようとしましたが、動作させることができません。私はコンテンツのURIを取得しようとすると、それは壊しています:
file:///storage/emulated/0/Download/test.pdf
Environment.getExternalStorageDirectory()
戻り/storage/emulated/0
、これがためのコードです:localUri
は、ファイルのDownloadManager
から返さ
Failed to find configured root that contains /file:/storage/emulated/0/Download/test.pdf
することです変換:
File file = new File(localUri);
Log.d(TAG, localUri + " - " + Environment.getExternalStorageDirectory());
Uri contentUri = FileProvider.getUriForFile(ctxt, "my.file.provider", file);
file_paths.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="my.file.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
AndroidManifest.xml
から:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_path" path="." />
</paths>
そして私は、私はそのxmlファイルで見つけることができるすべての値を試してみました。 :(ここ
あなたがAndroidのサポートライブラリの最新バージョンであることを確認してください。あなたが袖口から外れているなら、これは現在の 'FileProvider'のバグのように感じます。 – CommonsWare
'file:/// storage/emulated/0/Download/test.pdf'です。あなたはそれをそのまま使うことはできません。それから「file://」を削除します。有効なファイルパス '/ storage/emulated/0/Download/test.pdf'を使用する必要があります。 – greenapps
@CommonsWare私はv24.2で動作しています。1 – althaus