记2018年6月22日
学习android版本更新功能
使用intent隐式调用系统应用安装apk时遇到的问题。
这是异常信息:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.sanqian.splashdemo, PID: 24544 android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW cat=[android.intent.category.DEFAULT] typ=application/vnd.android.package-archive flg=0x10000000 } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1792) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512) at android.app.Activity.startActivityForResult(Activity.java:3896) at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:54) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) at android.app.Activity.startActivityForResult(Activity.java:3845) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:708) at android.app.Activity.startActivity(Activity.java:4232) at android.app.Activity.startActivity(Activity.java:4147) at com.example.sanqian.splashdemo.com.sanqian.Activity.SplashActivity.installApk(SplashActivity.java:104) at com.example.sanqian.splashdemo.com.sanqian.Activity.SplashActivity$4.onSuccess(SplashActivity.java:167) at com.lidroid.xutils.http.HttpHandler.onProgressUpdate(HttpHandler.java:218) at com.lidroid.xutils.task.PriorityAsyncTask$InternalHandler.handleMessage(PriorityAsyncTask.java:385) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:5958) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)
上网找了好多类似的异常,加了权限,加了setFLAG,但问题都不在这,后来索性把整个intent隐式调用copy下来运行,居然成功运行,后来比对一下发现是setData和setType方法的问题。
修改前的bug代码:
protected void installApk(File file){ //系统界面,源码,安装apk入口 Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); //文件作为数据源,设置安装的类型 intent.setData(Uri.fromFile(file)); intent.setType("application/vnd.android.package-archive"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
修改后的代码:
/** * 下载完成,提示用户安装 */ private void installApk(File file) { //调用系统安装程序 Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); }
可见,单独使用intent.setData()和intent.setType()会报错,后来使用intent.setDataAndType()居然成功运行,,,实在是。。。
至于为什么还是不清楚,有大佬知道还望留言相告,在此感谢。
另外,我的运行环境是android5.1, API 22