尽可能简洁:
-APK文件没有损坏。
- 我可以在手机的文件系统中浏览到APK,并从那里手动安装。没有问题。
- 我正在使用以下代码启动安装过程。文件位置已确认正确:
public void installfromlocal()
{
String downloadfilelocation = getsharedresourcestring("updatepackagelocation");
Log.e("installing from",downloadfilelocation);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(downloadfilelocation)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
到目前为止,我可以在互联网上花几个小时收集的内容显然是我不能让我的应用程序以编程方式从外部存储安装APK。我显然也不会将文件复制到内部存储并从那里安装。
那么现在呢?另外,我没有收到来自Logcat的消息。我只有一个弹出窗口提醒我解析apk时出错。
答案 0 :(得分:1)
我为我找到了一个解决方案(不太清楚为什么会有这个问题,但我解决了这个问题。)
在我看来,使用DownloadManager下载时,您无法通过URI访问下载的文件,并且您获得访问被拒绝(以及各种文件未找到异常错误),这就是为什么PackageInstaller无法读取所有清单(这就是解析)误差)。
这就是我所做的,我希望能解决你的问题,我知道至少可以说是不优雅。
由于DownloadManager.COLUMN_LOCAL_FILENAME已弃用,我尝试使用COLUMN_LOCAL_URI访问该文件并访问其内容(q为光标)
String strUri = q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Uri apkUri = Uri.parse(strUri);
使用此uri,我可以访问并将文件复制到getExternalCacheDir()中的临时文件
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(apkUri, "r");
InputStream inFile = new FileInputStream(pfd.getFileDescriptor());
OutputStream outFile = new FileOutputStream(tmpFile);
//copy
byte[] buffer = new byte[1024];
int length;
while ((length = inFile.read(buffer)) > 0) {
outFile.write(buffer, 0, length);
}
outFile.flush();
inFile.close();
outFile.close();
抓取创建的文件并获取其uri(可访问)并使用该uri启动活动。
我希望它有所帮助
答案 1 :(得分:1)
您应该使用文件的规范路径。来自文档 -
规范路径名既是绝对路径名也是唯一路径名。规范形式的精确定义取决于系统。如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以依赖于系统的方式将其映射到其唯一形式。这通常涉及删除冗余名称,例如“。”和路径名中的“..”,解析符号链接(在UNIX平台上),并将驱动器号转换为标准大小写(在Microsoft Windows平台上)。