打开安装程序时出错

时间:2018-06-19 11:57:20

标签: android android-studio installation apk

我有一个应用程序,可以在其中与服务器核对是否已安装的apk有更新,如果是,该应用程序会为我打开一条消息以确认下载,完成安装后,我必须安装,但此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
          Process: com.soirtec.taurus, PID: 22263
          java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.soirtec.taurus launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } bqHint=1 (has extras) } in com.soirtec.taurus.service.updateapp.ShowNote$3@783f8c4
              at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1195)
              at android.os.Handler.handleCallback(Handler.java:751)
              at android.os.Handler.dispatchMessage(Handler.java:95)
              at android.os.Looper.loop(Looper.java:154)
              at android.app.ActivityThread.main(ActivityThread.java:6776)
              at java.lang.reflect.Method.invoke(Native Method)
              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
           Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Download/app-dev.apk exposed beyond app through Intent.getData()
              at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
              at android.net.Uri.checkFileUriExposed(Uri.java:2354)
              at android.content.Intent.prepareToLeaveProcess(Intent.java:9557)
              at android.content.Intent.prepareToLeaveProcess(Intent.java:9515)
              at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
              at android.app.Activity.startActivityForResult(Activity.java:4404)
              at android.app.Activity.startActivityForResult(Activity.java:4363)
              at android.app.Activity.startActivity(Activity.java:4687)
              at android.app.Activity.startActivity(Activity.java:4655)
              at com.soirtec.taurus.service.updateapp.ShowNote$3.onReceive(ShowNote.java:117)
              at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1185)
              at android.os.Handler.handleCallback(Handler.java:751) 
              at android.os.Handler.dispatchMessage(Handler.java:95) 
              at android.os.Looper.loop(Looper.java:154) 
              at android.app.ActivityThread.main(ActivityThread.java:6776) 
              at java.lang.reflect.Method.invoke(Native Method) 
              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) 
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) here

这是我正在检查的代码部分,以查看下载是否已完成,并且是在初始化下载的apk安装后立即进行的。

receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            Toast.makeText(getApplicationContext(), "Download Completed", Toast.LENGTH_LONG).show();

            long downloadId = intent.getLongExtra(
                    DownloadManager.EXTRA_DOWNLOAD_ID, 0);
            DownloadManager.Query query = new DownloadManager.Query();
            query.setFilterById(enqueue);
            Cursor c = dm.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));

                    Log.d("ainfo", uriString);

                    if(downloadId == c.getInt(0)) {
                        Log.d("DOWNLOAD PATH:", c.getString(c.getColumnIndex("local_uri")));


                        Log.d("isRooted:",String.valueOf(isRooted()));
                        if(isRooted()==false){
                            //if your device is not rooted
                            Intent intent_install = new Intent(Intent.ACTION_VIEW);
                            intent_install.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/Download/"+"app-dev.apk")), "application/vnd.android.package-archive");
                            Log.d("phone path",Environment.getExternalStorageDirectory() + "/Download/"+"app-dev.apk");
                            intent_install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent_install);
                            Toast.makeText(getApplicationContext(), "App Installing", Toast.LENGTH_LONG).show();
                        }else{
                            //if your device is rooted then you can install or update app in background directly
                            Toast.makeText(getApplicationContext(), "App Installing...Please Wait", Toast.LENGTH_LONG).show();
                            File file = new File("/mnt/sdcard/Download/app-dev.apk");
                            Log.d("IN INSTALLER:", "/mnt/sdcard/Download/app-dev.apk");
                            if(file.exists()){
                                try {
                                    String command;
                                    Log.d("IN File exists:","/mnt/sdcard/Download/app-dev.apk");

                                    command = "pm install -r " + "/mnt/sdcard/Download/app-dev.apk";
                                    Log.d("COMMAND:",command);
                                    Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
                                    proc.waitFor();
                                    Toast.makeText(getApplicationContext(), "App Installed Successfully", Toast.LENGTH_LONG).show();

                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
            c.close();
        }
    }
};

0 个答案:

没有答案