AndroidのアプリインストールIntentでFileUriExposedExceptionによりアプリが落ちる
現在アプリを更新するシステムの作成をしているのですが、エラーが検出されます。
しかし、このエラーはAndroid 6.0.1の実機では発生すらせずAndroid O のエミュレータで検出されました。
public void download() {
try {
// URL設定
URL url = new URL("https://drive.google.com/uc?id=0Bxp5wIuQibuSdU1BOWl0QUFVR0U");
// HTTP接続開始
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.connect();
// SDカードの設定
String PATH = Environment.getExternalStorageDirectory() + "/MCPEBackups/tmp/";
File file = new File(PATH);
file.mkdirs();
// テンポラリファイルの設定
File outputFile = new File(file, "MCPEBackup.apk");
FileOutputStream fos = new FileOutputStream(outputFile);
// ダウンロード開始
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
// Intent生成
Intent intent = new Intent(Intent.ACTION_VIEW);
// MIME type設定
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/MCPEBackups/tmp/" + "MCPEBackup.apk")), "application/vnd.android.package-archive");
// Intent発行
startActivity(intent);//412行目
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
エラーコードはこちらです。
06-02 13:20:48.176 3632-3632/jp.takesi.mcpebackup E/AndroidRuntime: FATAL EXCEPTION: main
Process: jp.takesi.mcpebackup, PID: 3632
android.os.FileUriExposedException: file:///storage/emulated/0/MCPEBackups/tmp/MCPEBackup.apk exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1932)
at android.net.Uri.checkFileUriExposed(Uri.java:2348)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9328)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9282)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1591)
at android.app.Activity.startActivityForResult(Activity.java:4298)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4256)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4607)
at android.app.Activity.startActivity(Activity.java:4575)
at jp.takesi.mcpebackup.MainActivity.download(MainActivity.java:412)
at jp.takesi.mcpebackup.MainActivity$6$1.onClick(MainActivity.java:368)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6440)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:746)
勿論、別スレッドで実行しています。
もし解決方法をご存知の方がいらっしゃいましたら、ご教授のほどお願いいたします。