2017-01-16 87 views
1

尽可能简洁:尝试从安卓应用程序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时出现错误。

+0

** **确实**是'downloadfilelocation'指向? – CommonsWare

+0

'downloadfilelocation'您在日志中获取的路径是否正常? – Vikrant

+0

是的,位置很好。它指向file:///storage/sdcard0/Download/org.mycompany.myapp.apk –

回答

1

我找到了一个解决方案(不太清楚为什么有这个问题,但我解决了它)。

在我看来,下载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活动。

我希望它有帮助

1

你应该使用文件的规范路径。来自文档 -

规范路径名既是绝对路径名也是唯一路径名。规范形式的确切定义是与系统相关的。如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以系统依赖的方式将其映射到其唯一形式。这通常涉及删除冗余名称,如“。”和路径名“..”,解析符号链接(在UNIX平台上),并将驱动器号转换为标准大小写(在Microsoft Windows平台上)。

+0

为什么我需要这样做? –

+1

问题是由一些OEM的一些错误构建的android的一些OEM,packageInstaller给出错误 - EACCES(权限被拒绝),而你仍然可以从该路径访问该文件。所以你需要获取文件,getCanonicalPath()。软件包安装程序安装它。 –

+1

好的。感谢您的解释。 –