我创建了一个应用程序,我从内部服务器下载APK,在本地保存,并提示用户安装它。
我的代码如下:
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);
}
答案 0 :(得分:4)
当您致电Uri.parse(path)
时,path
参数需要包含以下内容:
file:///storage/sdcard/download/internalLocalApplication.apk
目前您的path
参数不包含该方案(即:file://
部分),这就是无法正确解析的原因。
当Android然后查找可以查看此URI的Activity
时,它找不到匹配的URI,因为URI没有“方案”。
答案 1 :(得分:0)
尝试打开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));