我有一个应用程序,可以在其中与服务器核对是否已安装的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();
}
}
};