无法以编程方式安装下载的apk

时间:2018-11-10 09:31:57

标签: android android-download-manager android-install-apk

我在使用以下代码时遇到麻烦。该apk已完美下载并保存在Downloads/Raman目录中,但给我错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.hamed.demo, PID: 1177
                  java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.hamed.demo (has extras) } in com.hamed.demo.AppsList$9@673ff0b
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1153)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:241)
                      at android.app.ActivityThread.main(ActivityThread.java:6274)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                   Caused by: android.os.FileUriExposedException: file:///file%3A/storage/emulated/0/Download/GadgetSaint/Sample-2.apk exposed beyond app through Intent.getData()
                      at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
                      at android.net.Uri.checkFileUriExposed(Uri.java:2351)
                      at android.content.Intent.prepareToLeaveProcess(Intent.java:9043)
                      at android.content.Intent.prepareToLeaveProcess(Intent.java:9004)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519)
                      at android.app.Activity.startActivityForResult(Activity.java:4266)
                      at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                      at android.app.Activity.startActivityForResult(Activity.java:4224)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
                      at android.app.Activity.startActivity(Activity.java:4563)
                      at android.app.Activity.startActivity(Activity.java:4531)
                      at com.hamed.demo.AppsList$9.onReceive(AppsList.java:313)
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1143)
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:241) 
                      at android.app.ActivityThread.main(ActivityThread.java:6274) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

我的代码:

private void download_from_url(String url) {
    Download_Uri = Uri.parse(url);
    final DownloadManager[] downloadManager = {(DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE)};
    DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
    request.setAllowedOverRoaming(false);
    request.setTitle("Raman Downloading " + "Sample" + ".apk");
    request.setDescription("Downloading " + "Sample" + ".apk");
    request.setVisibleInDownloadsUi(true);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/Raman/"  + "/" + "Sample" + ".apk");


    final long refid = downloadManager[0].enqueue(request);


    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                DownloadManager.Query query = new DownloadManager.Query();
                query.setFilterById(refid);
                downloadManager[0] = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
                Cursor c = downloadManager[0].query(query);
                if (c.moveToFirst()) {
                    int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                        String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));


                        File file = new File(uriString);
                        Intent intent2 = new Intent(Intent.ACTION_VIEW);
                        intent2.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        intent2.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        startActivity(intent2);

                    }
                }
            }
        }
    };
    registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

将以下代码添加到onCreate后,

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

应用不会崩溃,但会一直告诉我:

There was a problem parsing the package

我已经测试了许多不同的解决方案,但是没有一个起作用。 This one, this one和许多其他解决方案均无效。

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试在> 24的设备上安装应用

使用N代替FileProvider

您可以按照此答案。

android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()