zoukankan      html  css  js  c++  java
  • android 程序更新(没有sdcard)

    今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有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. <span style="font-size:18px;">/** 
    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.     }</span>  


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


    个人比较推荐第二种方式,原因是权限,上图中,只有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文件是权限不够的,可以看下,代码+图

    1. <span style="font-size:18px;">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.         }</span>  

    看到了吧,只有拥有者才有rw权限。。。。坑爹吧!所以我们的代码还要加上这句

    1. <span style="font-size:18px;">        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.         }  
    9. </span>  


    再看图吧,有图有真相


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

     

    PS:行货机也可以这样操作的,不是只有root过的水货机才能做的呀!

  • 相关阅读:
    [2019 CSP-S赛前集训] [CF1037D] Valid BFS?
    [2019 CSP-S赛前集训] [洛谷P1613] 跑路
    [2019 CSP-S赛前集训] [洛谷P1967] 货车运输
    [洛谷博客] 我的洛谷博客内容搬运
    终于开通了博客
    Qt Creator 添加arm版本的qmake时的问题
    U盘挂载问题
    段错误解决办法
    printf %m
    使用pthread_create()创建线程
  • 原文地址:https://www.cnblogs.com/ruiati/p/3680409.html
Copyright © 2011-2022 走看看