我制作了一个应用程序,尝试从远程服务器下载 APK 更新到内部存储,然后在设备上安装更新。
我在 API24 设备上对其进行了测试,一切都按预期工作。
现在我正在 API 19 设备上对其进行测试(以测试与更新应用程序的旧方式有关的代码部分)并且我不断收到“解析 list 时出现解析错误”。令我困惑的是,我可以在设备上手动安装 APK 并且没有解析错误,所以我认为问题不在实际的 list 文件中。我检查了内部存储中下载的 APK 文件的长度,它似乎已完全下载。所有 API 版本的 APK 下载代码都是相同的。
代码:
pathToApk = getFilesDir() + "/update.apk";
try (InputStream is = response.body().byteStream();
BufferedInputStream input = new BufferedInputStream(is);
OutputStream os = new FileOutputStream(pathToApk)) {
byte[] data = new byte[1024];
int count;
while ((count = input.read(data)) != -1) {
os.write(data, 0, count);
}
}
File toInstall = new File(pathToApk);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
Uri apkUri = Uri.fromFile(toInstall);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
错误:
W/PackageParser: Unable to read AndroidManifest.xml of /data/data/my.package.name/files/update.apk
java.io.FileNotFoundException: AndroidManifest.xml
at android.content.res.AssetManager.openXmlAssetNative(Native Method)
at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:501)
at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:469)
at android.content.pm.PackageParser.parsePackage(PackageParser.java:544)
at com.android.packageinstaller.PackageUtil.getPackageInfo(PackageUtil.java:73)
at com.android.packageinstaller.PackageInstallerActivity.onCreate(PackageInstallerActivity.java:467)
at android.app.Activity.performCreate(Activity.java:5350)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2320)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5322)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
at dalvik.system.NativeStart.main(Native Method)
11-10 10:16:24.213 4140-4140/? W/PackageInstaller: Parse error when parsing manifest. Discontinuing installation
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.package.name">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".main.activities.UpdateActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
</manifest>
编辑
请参阅我的答案以获取解决方案。
最佳答案
问题是系统无法在 API<=23 上从我的应用程序的私有(private)内部存储中读取 APK。
修复非常简单。
改变了这一行:
OutputStream os = new FileOutputStream(pathToApk)
对此:
boolean old = Build.VERSION.SDK_INT < Build.VERSION_CODES.N;
OutputStream os = old ?
openFileOutput("update.apk", Context.MODE_WORLD_READABLE)
: new FileOutputStream(pathToApk)
关于android - 解析 list 时解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219686/