35241


現在アプリを更新するシステムの作成をしているのですが、エラーが検出されます。  
しかし、このエラーはAndroid 6.0.1の実機では発生すらせずAndroid O のエミュレータで検出されました。

[code]

        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();
        }
    }
    
[/code]

エラーコードはこちらです。

[code]

        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)
    
[/code]

勿論、別スレッドで実行しています。  
もし解決方法をご存知の方がいらっしゃいましたら、ご教授のほどお願いいたします。


CC BY-SA 3.0
2017-06-02T13:38:33.673
35227
2017-06-03T04:22:56.123
23205
question
android android-studio
AndroidのアプリインストールIntentでFileUriExposedExceptionによりアプリが落ちる


Android 7.0 からパーミッションに変更がありました。  
[ここのファイル
システムのパーミッションの変更](https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ja#perm)を参考にしてください。

> パッケージ ドメイン以外の file:// URI  
>  を渡すと、レシーバーがアクセスできないパスになる可能性があります。そのため、file:// URI  
>  を渡そうとすると、FileUriExposedException がトリガーされます。プライベート  
>  ファイルのコンテンツの共有には、FileProviderを使用することをお勧めします。

file://スキーマを直接扱うのではなくcontent://スキーマで扱ってください。  
[FileProvider](https://developer.android.com/reference/android/support/v4/content/FileProvider.html?hl=ja)を使う方法が独自Providerを用意する必要がないので簡単です。


CC BY-SA 3.0
2017-06-03T04:22:56.123
35241
2017-06-03T04:22:56.123
20272
35227
answer