【问题标题】:unable to install downloaded apk programmatically [duplicate]无法以编程方式安装下载的 apk [重复]
【发布时间】:2019-04-13 17:26:12
【问题描述】:

以下代码有问题。 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 和许多其他解决方案都不起作用。

【问题讨论】:

  • 在 Android 7.0+ 中,如果您的应用的 targetVersioncode 超过 7.0+,则应从 FileProvider 获取 uri。

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


【解决方案1】:

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

使用FileProvider 而不是Uri.fromFile.

你可以关注这个答案。

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

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多