问题描述
今天收到一个客户的反馈,说他手机内部更新失败,出现:“解析包出现错误的问题”,在高的版本不会发生,然后我用模拟器来测试(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;
}
}
}
网友评论