android - 解析 list 时解析错误

标签 android

我制作了一个应用程序,尝试从远程服务器下载 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/

相关文章:

java - 无法删除 Firebase 中的子节点

来自另一个没有静态的类的Android调用函数

android - phonegap android 应用程序名称出现在启动画面之前

安卓 : Unable to instantiate activity

javascript - Widget 在 IOS 和 Android 上不显示

java - 从 ListView 中删除行的动画

java - getGoogleAppId 失败,出现异常 : java. lang.IllegalStateException:必须在 getGoogleAppId 之前调用初始化

java - 使用 mockito 模拟 AsyncTask 导致 NullPointerException

android - Android Support Library的CardView在不同设备上的不同结果

android - 无法将 json 格式的字符串转换为 Java 映射