尝试从本地文件安装apk时未发现任何活动错误

时间:2015-04-15 13:38:28

标签: android android-activity install

我创建了一个应用程序,我从内部服务器下载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);
}

2 个答案:

答案 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));