今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有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. System.out.println(getPackageName());
  12. try
  13. {
  14. /**
  15. * 第三章方式直接创建文件,会放在/data/data/onerain.ha/files/下面
  16. */
  17. FileOutputStream fos = openFileOutput("test",
  18. Context.MODE_PRIVATE | Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
  19. }
  20. catch (FileNotFoundException e)
  21. {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }</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过的水货机才能做的呀!

android 程序更新(没有sdcard)的更多相关文章

  1. android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题

    转载自: http://blog.csdn.net/lovexieyuan520/article/details/9250099 在android软件开发中,总是需要更新版本,所以当有新版本开发的时候 ...

  2. Android小项目之十 应用程序更新的签名问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

  3. Android开发之应用程序更新实现

    近期给项目app做升级.对Android应用程序更新稍有研究,分享一下我的心得. 既然是更新,那么一定是要联网和下载的.所以联网和存储訪问权限时一定要有的: <!-- 权限申请 -->   ...

  4. Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)

    借助谷歌,并经过本大侠施展坑.蒙.拐.骗.偷五大绝技,终于成功实现在Delphi下获取Root权限并将其扩展为一个完整功能更加完整的TQAndroidShell记录,在华为荣耀2(Android 4. ...

  5. Android程序crash处理

    Android程序crash处理 时间 2014-11-24 13:45:37  CSDN博客 原文  http://blog.csdn.net/allen315410/article/details ...

  6. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  9. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

随机推荐

  1. JBoss 7 配置成windows启动服务

    将Jboss7 server 配置成一个windows启动服务的两个文件,部署步骤如下: 1.    先检查是否配置java_home和jboss_home的环境变量,如没配置上先配置,如我的是JBO ...

  2. PAT甲级1021. Deepest Root

    PAT甲级1021. Deepest Root 题意: 连接和非循环的图可以被认为是一棵树.树的高度取决于所选的根.现在你应该找到导致最高树的根.这样的根称为最深根. 输入规格: 每个输入文件包含一个 ...

  3. 关于利用ajax时,设置访问延时的方法

    在实际开发中应使用后端的延时方法,一般为sleep,可以设置延时几秒后返回给前端请求的数据 众所周知,在js中,并不存在例如C++或者JAVA.PHP中的sleep延时方法, 目前仅有的所谓延时方法S ...

  4. POJ 1755 Triathlon (半平面交)

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4733   Accepted: 1166 Descrip ...

  5. SDRAM interface slashes pin count

    Many designs need deep buffering but don't require ultrahigh-memory bandwidth. Examples include imag ...

  6. JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案

    今天遇到个很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url" ...

  7. 图解linux内核编译框架

    内核是如何编译成的 -知其然而不知其所以然 (第一篇) 转载:http://blog.chinaunix.net/uid-28236237-id-3840137.html Linux内核有分门别类的目 ...

  8. Android 4.0 x86安装教程 附带联网参数详细设置

    Android 4.0 x86是一个可以支持在电脑上运行的Android 4.0系统.没有手机一样也可以体验Android 4.0.这对玩机爱好者们来说也算得上是一个不大不小的好消息.不过目前的And ...

  9. sqlserver锁大全

    锁定提示                                 描述  HOLDLOCK        将共享锁保留到事务完成,而不是在相应的表.行或数据页不再需要时就立即释放锁.HOLDL ...

  10. 2)Linux程序设计入门--进程介绍

    )Linux程序设计入门--进程介绍 Linux下进程的创建 前言: 这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到: 进程的概念 进程的身份 进程的创建 守护进程的创建 .进程的 ...