下载apk文件在/data/data/packagename/目录下,如何安装成功

来源:互联网 发布:用java编写菱形 编辑:程序博客网 时间:2024/05/22 03:47

今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有sdcard的情况,如果有sdcard,那就不用废话了。。。

 

先说一下软件更新的基本原理,从服务器下载一个程序的apk,然后启动安装,通常的情况下我们用到的都是在sdcard中操作,比如做些图片缓存或者记录一些用户的信息之类的,而今天要总结的是在用户没有sdcard的情况下的做法。

 

1.摆在我们面前的第一个问题是没有sdcard的情况下,我们应该把apk文件下载到哪里?哪里可以下载?这是最重要的一个问题!

android是linux内核的系统,所以android也符合linux的规范,比如文件的权限

先说一下apk文件可以放在哪儿?

答案是你的应用程序所在的目录。

也许有些人不知道应用程序所在的目录是哪个,很简单,只需要在控制台(或者eclipse自带的DDMS中,当然DDMS不是所有的机型都可以看得到)下进入到/data/data/目录下,然后输入linux命令ls -al显示的那些com.xxx之类的目录,就是你手机上安装的程序目录啦!放个小图。。。



 

而我这个工程的包名叫onerain.ha,所以,我刚才说的那个目录就是/data/data/onerain.ha/目录了!(这是linux的目录,不是windows下的.后缀名的文件)。

PS:如果你的机器是行货,在没有获取root权限时你是不能使用ls命令的,你只是不能更清楚的看到目录所包含的文件信息,但是不会影响你的操作!

 

2.怎么获取这个目录?

我这里用了三种方式,所以会生成三个目录,代码如下

1.  /** 

2.           * 第一种方式可以放在android程序为我们提供的一个cache目录中 

3.           */  

4.          File cacheDir = getCacheDir();  

5.          System.out.println(cacheDir.getPath());  

6.          /** 

7.           * 第二种方式我们可以自己创建一个目录, 

8.          */  

9.          File dir = getDir("aaa", Context.MODE_PRIVATE | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);  

10.         System.out.println(dir.getPath());  

11.   

12.         System.out.println(getPackageName());  

13.           

14.         try   

15.         {  

16.             /** 

17.              * 第三章方式直接创建文件,会放在/data/data/onerain.ha/files/下面 

18.              */  

19.             FileOutputStream fos = openFileOutput("test",   

20.                     Context.MODE_PRIVATE | Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);  

21.     }   

22.         catch (FileNotFoundException e)   

23.         {  

24.             // TODO Auto-generated catch block  

25.             e.printStackTrace();  

26.     } 


然后你的工程目录就会变成这样,截图了


个人比较推荐第二种方式,原因是权限,上图中,只有app_aaa是对于其他用户来说rwx权限的(因为我们要在目录下写内容,即从服务器下载之后写流,所以这个w权限是必须的,而你要进入到这个目录下,x权限也是必须的)!当然,如果你就是不想在这个目录下写也没关系,权限是可以修改的!

 

3.修改权限

这个应该属于linux的问题,当然也是很简单的,命令行是这样的

chmod [指令] [文件/目录]

指令简单介绍下,linux下分为三种使用者,字母u代表拥有者(user),g代表拥有者所在的组(group),o代表其他用户(other),a代表全部,而字母r代表可读,w代表可写,x代表可执行

如果要把某个文件修改为对于所有用户可读可写可执行,可以这样写指令

chmod a+rwx/data/data/oneran.ha/cache  当然也可以写成 chmod ugo+rwx /data/data/onerain.ha/cache

当然还有一种用数字表示的方法,上述命令还可以这样写

chmod 777 /data/data/onerain.ha/cache

三位数字对应的是拥有者,拥有者所在的组,其他用户,而rwx对应的值是421,如果是7说明是4+2+1即全权限!

PS:扯远了,其实也不远,这里介绍修改权限不只是为了修改这个目录,还要修改你下载的apk文件的权限,因为下载之后默认是不可执行的!!!

 

4.程序中修改权限

在命令行中会修改权限了,可是我们想要的是在程序中执行这些命令的功能啊!那如何呢?

我们下载的apk文件是权限不够的,可以看下,代码+图

[java] view plaincopyprint?

1.  File apkFile = new File(dir.getPath() + "/test.apk");  

2.          if(!apkFile.exists())  

3.          {  

4.              try {  

5.                  apkFile.createNewFile();  

6.              } catch (IOException e) {  

7.                  // TODO Auto-generated catch block  

8.                  e.printStackTrace();  

9.              }  

10.         }


看到了吧,只有拥有者才有rw权限。。。。坑爹吧!


所以我们的代码还要加上这句:

1.   String[] command = {"chmod""777", dir.getPath() + "/test.apk"};  

2.          ProcessBuilder builder = new ProcessBuilder(command);  

3.          try {  

4.              builder.start();  

5.          } catch (IOException e) {  

6.              // TODO Auto-generated catch block  

7.              e.printStackTrace();  

8.          }  

再看图吧,有图有真相


看,我们的apk文件的权限,哈哈,成功了!剩下的工作就是启动一个Intent去用android系统自带的第三方安装程序去安装这个apk了,就会把之前的覆盖掉了!因为是第三方的,所以o+x是必不可少的撒(即其他用户有可执行的权限)



注意:如果我们在data/data/package name/files/ 目录下又建立了新目录,然后把apk文件放在该新目录下。这个时候这个新目录的权限也要修改为777,不然只改apk文件的权限也是不行的。


原文地址:http://blog.csdn.net/onerain88/article/details/7035723

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 真玉跟假玉灯下区别 真玉和假玉滴水图 假玉髓图片 假宝玉睡王夫人与薛姨娘 真玉和假玉的区别 怎么看真玉假玉 怎么辨别真玉和假玉 和田玉100元是真是假 怎样辨别真玉和假玉 怎么辨别真玉假玉 和田玉假皮鉴定 怎样辨别玉是真是假 怎么鉴别真玉假玉 怎样辨别真玉假玉 怎么鉴别假玉 假玉 200等于260000仙玉真的假的 云南翡翠馆卖的玉是真是假 假球 千万别买令人发指的假球联赛 高速收费员假笑 假笑男孩 假笑 假笑图片 假笑男孩图片 收费员假笑走红 假笑男孩高清图 职业假笑 收费员职业假笑走红后报警 收费站假笑 心疼假笑男孩 职业假笑走红后报警 山东一笑阿胶是假的吗 假笑图片表情包 笑表情包 收费员被质疑假笑 高速收费员被质疑假笑 假紫砂壶对人体有害吗 假紫砂壶是什么做的 假的紫砂壶有毒吗 假紫砂壶鉴别方法