Android 尝试从本地文件安装apk时未发现活动错误
我制作了一个应用程序,从内部服务器下载APK,在本地保存,并希望提示用户安装它。Android 尝试从本地文件安装apk时未发现活动错误,android,android-activity,installation,Android,Android Activity,Installation,我制作了一个应用程序,从内部服务器下载APK,在本地保存,并希望提示用户安装它。 我的代码如下: protected void onPostExecute(String path) { Intent promptInstall = new Intent(Intent.ACTION_VIEW); promptInstall.setDataAndType(Uri.parse(path), "application/vnd.android.package-archive");
我的代码如下:
protected void onPostExecute(String path) {
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(Uri.parse(path), "application/vnd.android.package-archive");
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(promptInstall);
}
路径包含APK文件,因此下载没有问题,但在尝试启动活动时,我得到:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/storage/sdcard/download/internalLocalApplication.apk typ=application/vnd.android.package-archive flg=0x10000000 }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1765)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1602)
at android.app.Activity.startActivityFromFragment(Activity.java:4340)
at android.app.Activity.startActivityFromFragment(Activity.java:4312)
at android.app.Fragment.startActivity(Fragment.java:1075)
at android.app.Fragment.startActivity(Fragment.java:1054)
我做错了什么
更新:似乎,如果我改变代码如下它的工作!似乎Uri有问题
@Override
protected void onPostExecute(String path) {
Uri fileLoc = Uri.fromFile(new File(path));
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(fileLoc, "application/vnd.android.package-archive");
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(promptInstall);
}
调用
Uri.parse(path)
时,path
参数需要包含如下内容:
file:///storage/sdcard/download/internalLocalApplication.apk
当前,您的路径
参数不包含该方案(即文件://
部分),这就是无法正确解析该方案的原因
然后,当Android查找可以查看此URI的
活动时,它找不到匹配的活动,因为URI没有“scheme”。我在尝试打开由DownloadManager生成的URI时遇到了相同的错误,如dm.getUriForDownloadedFile(id)代码>
使用以下代码修复了它:
Uri uri;
Cursor q = dm.query(new DownloadManager.Query().setFilterById(id));
if ( q == null ) {
Toast.makeText(AppContext,
"FAILED: Unable to read downloaded file" ,
Toast.LENGTH_LONG).show();
break;
}
q.moveToFirst();
String path = "file://" + q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
uri = Uri.parse(path);
Log.d(TAG,"dm query: " + path );
intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setDataAndType(uri, dm.getMimeTypeForDownloadedFile(id));
你好使用Android 7DownloadManager.COLUMN\u LOCAL\u FILENAME
不推荐使用,代码失败。我怎样才能解决这个问题?