android 5.0以下Parse error when parsing manifest. Discontinuing installation

问题描述

今天收到一个客户的反馈,说他手机内部更新失败,出现:“解析包出现错误的问题”,在高的版本不会发生,然后我用模拟器来测试(4.4版本),发现的确会发生这样的问题,得到的警告错误信息如下

Parse error when parsing manifest. Discontinuing installation

首先排除了没有下载完全的问题,也排除了存储不够的问题,最后确认的是权限问题导致的,我下载的目录是在/data/data/包名/files/文件夹里面的,是放在内部存储的,apk的权限是--rw-rw--。如果你是放在外部存储权限是rwx-rwx的。所以我们需要给他权限

                       File file = new File(updateDir, fileName);
                        String cmd = "chmod 777 " + file.getAbsolutePath();
                        Runtime runtime = Runtime.getRuntime();
                        try {
                            Process proc = runtime.exec(cmd);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        intent.setDataAndType(fileName, "application/vnd.android.package-archive");
                        UpdateService.this.startActivity(intent);

当然了最好的建议是不要放在内部存储,要放在外部是最好的

File工具类

/**
 * 创建时间: 2019/1/26
 * gxx
 * 注释描述:获取存储空间
 */
public class FileSDCardUtil {
    public static FileSDCardUtil fileSDCardUtil;

    public static FileSDCardUtil getInstance() {
        if (fileSDCardUtil == null) {
            synchronized (FileSDCardUtil.class) {
                if (fileSDCardUtil == null) {
                    fileSDCardUtil = new FileSDCardUtil();
                }
            }
        }
        return fileSDCardUtil;
    }


    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:获取内存存储路径Files地址,APP被卸载后都会跟着被卸载
     *
     * @context.getFilesDir() 获取的是根路径 :/data/data/包名/files
     */
    public String storeInFilesLocaltionPath(Context context) {
        String path = context.getFilesDir().getAbsolutePath();
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        return path+"/";
    }

    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:获取内存存储路径Files地址,APP被卸载后都会跟着被卸载
     *
     * @context.getCacheDir() 获取的是根路径 :/data/data/包名/cache
     */
    public String storeInCachesLocaltionPath(Context context) {
        String path = context.getCacheDir().getAbsolutePath();
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        return path+"/";
    }


    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:返回下载的APP目录
     */
    public String saveDownAppToSDcarPrivateFiles(Context context) {
        String path = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {//此目录下的是外部存储下的files/downAppDirs目录
            File file = context.getExternalFilesDir("downAppDirs");
            if (!file.exists()) {
                file.mkdirs();
            }
            path = file.getAbsolutePath();
        } else {
            path = context.getFilesDir().getAbsolutePath() + "/downAppDirs";
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            path = file.getAbsolutePath();
        }
        return path+"/";
    }

    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:获取缓存目录
     */
    public String getDiskCacheDir(Context context) {
        String cachePath = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {//此目录下的是外部存储下私有的Cache目录
            cachePath = context.getExternalCacheDir().getPath();
        } else {
            cachePath = context.getCacheDir().getPath();
        }
        return cachePath+"/";
    }

    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:获取缓存目录
     *
     * @fileName 文件夹名称
     */
    public String getDiskCacheDir(Context context, String fileName) {
        String cachePath = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {//此目录下的是外部存储下的私有的fileName目录
            cachePath = context.getExternalCacheDir().getPath() + "/" + fileName;
        } else {
            cachePath = context.getCacheDir().getPath()+ "/" + fileName;
        }
        File file = new File(cachePath);
        if (!file.exists()){
            file.mkdirs();
        }
        return file.getAbsolutePath()+"/";
    }


    /**
     * 作者:GaoXiaoXiong
     * 创建时间:2019/1/26
     * 注释描述:从sdcard中删除文件
     */
    public boolean removeFileFromSDCard(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            try {
                file.delete();
                return true;
            } catch (Exception e) {
                return false;
            }
        } else {
            return false;
        }
    }


}

Android-内部存储和外部存储

猜你喜欢

转载自blog.csdn.net/weixin_34288121/article/details/86959678