下载apk到本地,安装遇到的解析包时出现错误的分析

原创 2015年08月22日 19:37:02

遇到一些问题,使用代码的结果是无法满足自己的需求,很多时候是和手机本身的的一些权限和机制有关系。


问题1:下载apk到 内部存储,安装时无法找到路径,提示:解析包时发生错误

这个原因就是由于权限的原因,首先内部存储,在权限的原因下,默认为私有,内部存储所以只能本应用自己调用。而安装应用是PackagesInstaller和PackageManager系统的其他部分调用,就等于是外部应用调用的,所以是无法成功的,由于我的需求就是把apk存放到内部存储的固定目录下。

首先,可以设置权限的调用内部存储的方法有两个(参考连接:http://aijiawang-126-com.iteye.com/blog/792931 

一个openFIleInput(String name,int mode),第一个参数是文件名字,不能带有“/”,意思就是不能是路径,必须是文件名,第二个参数是模式。

还有就是getDir()方法getDir(String name, int mode),返回/data/data/youPackageName/下的指定名称的文件夹File对象,如果该文件夹不存在则用指定名称创建一个新的文件夹。 

这个放在file下面好像是可以的。

然后就是使用android.app.ContextImpl.setFilePermissionsFromMode(String name,int mode,int extraPermissions);

还有就是android.os.FileUtils.setPermissions(String path, int mode, int uid, int gid);

这个两个类是系统内部类,在eclipse中编写,是无法正常调用的,因为你找不到包,最方便的方法就是利用反射。

大概发一个例子来简单总计下反射的使用,以及参数的含义。

public void setFilePathPermissions(String name, int mode,
			int extraPermissions) {
		Class<?> clazz;
		try {
			// 包名加类名
			clazz = Class.forName("android.app.ContextImpl");
			// 方法名
			Method method = clazz.getDeclaredMethod(
					"setFilePermissionsFromMode", new Class[] { String.class,
							int.class, int.class });
			method.invoke(null, name, mode, extraPermissions);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
首先Class.forName中的参数,是类的全名加上包名。

getDeclaredMethod方法中的第一个参数是方法名,第二个参数,是个参数数组,就比如setFilePermissionsFromMode方法有三个参数, 后面就追加三个参数,可以像上面那样写个数组,中间有三个元素,

clazz.getDeclaredMethod("setFilePermissionsFromMode", new Class[] { String.class,int.class, int.class });
也可以把数组显示去掉,如下

clazz.getDeclaredMethod("setFilePermissionsFromMode", String.class,int.class, int.class );
所需要反射的方法的参数有几个,就写几个,是什么类型,就调用类型.class的方法。记住,int和integer是不一样的。

method.invoke(null, name, mode, extraPermissions);其实也是两个参数模式,如果方法是static的话,第一个参数,就设置为null,否则写成clazz.newInstance(),

后面三个参数,本身和上面类型.class是一个意思,也是一个数组,这是就是直接写的方式,把三个参数传进来就ok了。

如果该方法没有返回值,你自己创建的方法名的返回值类型就写void就行了。


还有自己用模拟器测试的时候,可以用adb打开应用下包名的权限,必须是一级一级目录的打开。变成外部可读写的默认。

下面是用adb设置过程:

abd root

adb remount(成功会显示remount success)

adb shell(会变成root@android:/#)

cd data/data

ls(查看清单)

cd 目录(进入包名,进入各个文件夹)

ls -la  (会查看到下面的文件,权限信息也会显示)

cd .. (回退,和git一样)

chmod  -R  777 (要给权限的目录)

ls -la (查看就会发现权限改了)

ctrl +c (退出)


其实把apk下载到外部路径下是可以调用安装的。

还有我为了满足需求,采用的方法是,把文件下载到本地自定义目录,然后copy到外部路径,然后从外部路径调用安装,随后把它删除掉。


今天学了单例模式,到现在才明白。

想一直保存一个值,然后每次启动的时候,就会新建一个对象,然后调用的又是默认值,最后无法满足需求。

public class Contance {
	public boolean flag = true;
	private static Contance mInstance = null;

	public static Contance getInstance() {
		if (mInstance == null) {
			mInstance = new Contance();
			Log.i("test_pass", "new instance");
		}
		Log.i("test_pass", "mInstance");
		return mInstance;
	}
}
这是一个例子,所谓单例就是一个目的,所谓的单,就是只有一次,就是只新建一次对象,

当我调用flag的时候,不是每次都默认的true,我想改变起状态,并且保留这个值,这样就用到了单例模式。

我此时就这样写Contance.getInstance().flag;

在调用getInstance的时候,会传进来一个实例,判断这个实例是不是null,如果是空,就是没有创建过,此时就new。如果不是空, 说明已经new过了,就把当前的实例return,这样就只需要new一次,这就是单例模式。


还有Settings.system.putInt();在receiver是不能调用的,此时因为进程不是system进程,所以无法调用system的写方法,但是geiInt是可以调用的。

android:sharedUserId="android.uid.system"


此时还有adb命令,用于应用重启生效。先在手机上设置开发者模式,在开启adb调试,

然后adb中执行如下命令:

adb root

abd remount

adb push 应用路径 /system/app

adb reboot  (重启)









安装apk解析包时出现错误(应用内更新)

最近遇到一个问题,有个别用户在应用内更新版本会出现解析包失败的情况,而且有的机型还是必现,浏览器下载就没问题,应用内就有问题,这就很让人费解,之前一直没关注过这种情况,但是用户就是上帝,有问题必须得解...
  • geqian2010
  • geqian2010
  • 2017年07月24日 10:59
  • 5931

android手机上安装apk时出现解析包错误的一个解决办法

今天下午在学习安卓开发时,学习开发文档中的gridview时,在模拟器上调试程序一切正常,如下图所示: 但当将bin目录下的HelloGridView.apk拷贝到M8安卓系统后进行安装...
  • happyrabbit456
  • happyrabbit456
  • 2014年08月11日 16:21
  • 2584

Android 7.0解析包时出现问题 的解决方案(应用内更新)

在工作上遇到了一个关于下载更新安装包无法安装的问题,解决之后特地在这里做一个笔记,遇到相似问题的朋友可以试试看能不能解决自己的问题。 问题描述 我们在进行Android开发的时候,一般都会在应用里...
  • y505772146
  • y505772146
  • 2017年02月16日 18:59
  • 18536

android之解析包时出现错误(二)

为什么是二呢,之前遇到过一次了,详见http://blog.csdn.net/jason0539/article/details/12222173 这次的原因不同,再记录下 public class ...
  • jason0539
  • jason0539
  • 2014年03月21日 20:44
  • 24748

关于更新app时出现解析包错误

参考:http://stackoverflow.com/questions/5503487/android-failed-to-open-zip-archive包解析错误因为权限的问题,所以要在安装之...
  • zengyinan
  • zengyinan
  • 2016年06月21日 20:39
  • 1361

更新应用程序安卓apk时出现解析程序包时出现问题

在一次工作中,需求是进入应用程序splash时检测版本,发现新版本提示用户进行更新,更新好后就自动跳转安装界面。     我当时是把用户点击更新下载后的apk存放到data/data/package...
  • qq_31588719
  • qq_31588719
  • 2017年04月14日 09:26
  • 4402

android错误之解析包时出现问题(一)

类越来越多,有点乱,强迫症,多弄了几个包,整理的井井有条,心里那个舒服,结果问题就来了 无法安装了,总是显示“解析包时出现问题”,最烦的就是这种问题,一点技术含量都没有的小问题却要浪费大量时间去找原因...
  • jason0539
  • jason0539
  • 2013年10月01日 17:59
  • 45956

安卓安装apk时出现“解析程序包时出现错误” 的解决方法

测试升级的时候发现安卓7.0以上的版本出现升不了级的情况    百度找到答案   第一步:根据安卓版本适配不同的apk打开方式 File file = new File(apkPath); //...
  • qq_34379916
  • qq_34379916
  • 2018年01月11日 11:00
  • 165

解析程序包出现问题(更新下载apk)

最近在做更新功能 由于公司的项目是没有上线的,所以不能借助APP商店来更新。 我的大致思路是: 1.校验APP的版本号 2.下载最新版本 3.安装apk包 1.校验APP的版本号 由于公...
  • liangfeng093
  • liangfeng093
  • 2017年10月26日 15:43
  • 454

android 版本升级,从服务器下载的apk,包解析失败问题解决

今天做了一个android 的版本升级,从服务器上面下载下来的apk总是在安装的时候 报解析失败,包不能解析。  开始找问题,发现  下载下来的文件和实际服务器中的文件大小不一致。 这应该就是问题的根...
  • qq_34155601
  • qq_34155601
  • 2017年05月23日 17:16
  • 635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:下载apk到本地,安装遇到的解析包时出现错误的分析
举报原因:
原因补充:

(最多只允许输入30个字)