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过的水货机才能做的呀!

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/ruiati/p/3680409.html
Copyright © 2011-2022 走看看