android 程序更新(没有sdcard)

2023-10-27

今天总结一下我们写的程序需要更新(默认用户已经安装上旧版本了),而用户更新时却没有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.怎么获取这个目录?

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

/**
         * 第一种方式可以放在android程序为我们提供的一个cache目录中
         */
        File cacheDir = getCacheDir();
        System.out.println(cacheDir.getPath());
        /**
         * 第二种方式我们可以自己创建一个目录,
        */
        File dir = getDir("aaa", Context.MODE_PRIVATE | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
        System.out.println(dir.getPath());

        System.out.println(getPackageName());
        
        try 
        {
        	/**
        	 * 第三章方式直接创建文件,会放在/data/data/onerain.ha/files/下面
        	 */
			FileOutputStream fos = openFileOutput("test", 
					Context.MODE_PRIVATE | Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
	} 
        catch (FileNotFoundException e) 
        {
			// TODO Auto-generated catch block
			e.printStackTrace();
	}

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


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

File apkFile = new File(dir.getPath() + "/test.apk");
        if(!apkFile.exists())
        {
        	try {
				apkFile.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }

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

        String[] command = {"chmod", "777", dir.getPath() + "/test.apk"};
        ProcessBuilder builder = new ProcessBuilder(command);
        try {
			builder.start();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

再看图吧,有图有真相


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


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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 简单的postgersql存储过程样例

    建表 CREATE TABLE Employees Id serial Name VARCHAR 100 DateOfBirth Date City VARCHAR 100 Designation VARCHAR 100 JoiningDa
  • 小米r3g openwrt软件源,换源

    小米r3g openwrt软件源 换源 自带的源不好用 自己找了一个 还是在中科大源站上改的 中科大这个网站上的资源太多了 ssh登录后替换 etc opkg distfeeds conf 里面的源地址 也可能是 etc opkg conf
  • 【Android】[2] 如何制作启动倒计时页

    前言 实现效果 源码地址 https github com littlecurl AppProjects 进去找AndroidCountDown或者AndroidCountDown zip进行下载 前提条件 红黑联盟 Android性能优化
  • Numpy中的排序(sort,argsort)

    按索引排序 gt gt import numpy as np gt gt x np array 0 12 48 4 14 18 1 7 99 灵活应用索引和切片实现按索引的排序 倒序的实现 普通列表也可用reverse实现 numpy则没有
  • VMware开启虚拟机无法正常开机(100%解决)

    发现自己的WMware上部署的虚拟机都无法开机 VMware Workstation 与 Device Credential Guard 不兼容 在禁用 Device Credential Guard 后 可以运行 VMware Works
  • Java做图片上传、文件上传、 批量上传、 Base64图片上传 。附上源码

    文章参考 control代码 Controller RequestMapping uploadService public class UploadServerController extends BaseController privat
  • 【CLYZ集训】催眠大师【费用流】

    题目大意 给定一个 n m n times m n m 的棋盘 棋盘上每个位置要么为空要么为障碍 定义棋盘上两个位置 x
  • c++学习日记(1)

    c 学习日记 基本选择知识 计算机操作系统出现死锁的原因是什么 死锁的原因主要是 1 bai 因为系统资源不足 2 进程运行推进的顺序不合适 3 资源分配不当等 如果系统资源充足 进程的资源请求都能够得到满足 死锁出现的可能性就很低 否则就
  • 达梦数据库之表结构定义语句的获取

    在日常工作中 经常需要获取表定义语句以对表结构进行分析 改动等操作 达梦数据库提供了多种方式获取表结构的定义语句 如下 方法一 通过manager管理工具可视化界面查看 通过manager工具登录数据库后 在左侧树状列表中选择需要获取定义语
  • Java feign方式对同一个服务编写多个远程调用实例报错及3种解决办法

    这篇博客将介绍Java feign方式对同一个服务进行多个远程调用实例遇到的报错及3种解决办法 当单独仅有一个调用实例时ok 俩个调用实例时一段时间报错 一段时间好 间歇性的 之后就彻底调不通了 服务ServiceA有interface1
  • 我想在十年之后成立一家软件公司

    2023年9月7日 周四下午 这也是我的第200篇公开的博客 今天突然想在以后成立一家软件公司 公司名我已经想好了 之所以想成立一家公司 是因为我意识到很多事情靠一个人是完成不了的 比如开发一个与众不同的操作系统 此外 通过成立公司 依靠团
  • 金晟富:6.13黄金暴跌原油暴涨下周怎么看?开盘行情操作建议

    前言导读 各位投资朋友 转眼间又到周末了 祝大家周末愉快 端午安康 一周交易结束了 很多人觉得本周行情操作好像很难的样子 看不懂行情 反复扫单亏损 甚至害怕交易做单 其实 在本人分析看来 大家无非就是看不懂行情 缺乏技术判定分析能力 而当你
  • 干了三年的功能测试,让我女朋友跑了,太难受了...

    简单概括一下 先说一下自己的情况 普通本科 19年通过校招进入深圳某软件公司 干了3年多的功能测试 21年的那会 因为大环境不好 我整个人心惊胆战的 怕自己卷铺盖走人了 我感觉自己不能够在这样蹉跎下去了 长时间呆在一个舒适的环境真的会让一个
  • 软件测试目的与软件测试原则

    软件测试的目的 说到软件测试 很多人都引用Grenford J Myers在 The Art of Software Testing 一书中的观点 软件测试是为了发现错误而执行程序的过程 测试是为了证明程序有错 而不是证明程序无错 一个好的
  • MySQL - 数据查询_简单查询_数据库的基本查询

    查询所有字段数据 查询所有字段是指查询表中所有字段的数据 这种方式可以将表中所有字段的数据都查询出来 MySQL有两种方式可以查询表中的所有字段 1 列出表的所有字段 通过SQL语句SELECT列出表的所有字段 具体语法形式如下 其中 fi
  • 修改Jupyter Notebook默认目录

    Jupyter Notebook介绍 通过网页访问的web应用程序 在网页中编写和执行程序 便于程序的远程访问 屏蔽了不同系统间的显示差异 能够通过网页或PPT的方式分享 可以在同一个文档中展示代码 图像 注释 公式 图形和运行结果 初次安
  • Microsoft Dynamics CRM 服务器安装说明

  • LCD1602 液晶显示实验

    LCD1602 简介 LCD1602是一种用来显示字母 数字 符号的点阵型液晶模块 可显示 2 行字符信息 每行又能显示 16 个字符 每个字符由若干个 5x7 或 5x10 的点阵字符位组成 每位之间有一个点距的间隔 每行之间也有间隔 起
  • linux给脚本文件赋权限,linux编写.sh脚本并赋权限问题

    linux编写 sh脚本并赋权限问题 今日打包编译项目时 发现缺少一个git pull更新项目的脚本 所以在linux编写了一个gitpull sh脚本 能够实现更新项目的需求 1 首先vi gitpull sh或者使用vim编辑器 2 内
  • android 程序更新(没有sdcard)

    今天总结一下我们写的程序需要更新 默认用户已经安装上旧版本了 而用户更新时却没有sdcard的情况 如果有sdcard 那就不用废话了 先说一下软件更新的基本原理 从服务器下载一个程序的apk 然后启动安装 通常的情况下我们用到的都是在sd