尝试从安卓应用程序toprogrammatically安装APK时解析错误
尽可能简洁:尝试从安卓应用程序toprogrammatically安装APK时解析错误
-APK文件未损坏。
- 我可以浏览到手机文件系统中的APK,并从那里手动安装它,没有问题。
-I使用以下代码启动安装过程。文件的位置是正确的证实:
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时出现错误。
我找到了一个解决方案(不太清楚为什么有这个问题,但我解决了它)。
在我看来,下载DownloadManager时无法通过URI访问下载的文件,并且您获取访问被拒绝(以及各种文件未找到异常错误),这就是为什么PackageInstaller无法读取所有清单(并且这是解析错误)。
这就是我所做的,我希望能解决你的问题,我知道这不是最优雅的说法。
由于DownloadManager.COLUMN_LOCAL_FILENAME的已弃用i相COLUMN_LOCAL_URI试图访问该文件,并用这个URI访问其内容(q是光标)
String strUri = q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Uri apkUri = Uri.parse(strUri);
我可以访问和将文件复制到一个临时文件中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活动。
我希望它有帮助
你应该使用文件的规范路径。来自文档 -
规范路径名既是绝对路径名也是唯一路径名。规范形式的确切定义是与系统相关的。如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以系统依赖的方式将其映射到其唯一形式。这通常涉及删除冗余名称,如“。”和路径名“..”,解析符号链接(在UNIX平台上),并将驱动器号转换为标准大小写(在Microsoft Windows平台上)。
为什么我需要这样做? –
问题是由一些OEM的一些错误构建的android的一些OEM,packageInstaller给出错误 - EACCES(权限被拒绝),而你仍然可以从该路径访问该文件。所以你需要获取文件,getCanonicalPath()。软件包安装程序安装它。 –
好的。感谢您的解释。 –
** **确实**是'downloadfilelocation'指向? – CommonsWare
'downloadfilelocation'您在日志中获取的路径是否正常? – Vikrant
是的,位置很好。它指向file:///storage/sdcard0/Download/org.mycompany.myapp.apk –