Android用代码操作Liunx命令进行文件的操作
2017-07-22 15:38
309 查看
最近接到一个外包,需要对 /data/data/package(下面我简称data包) 下面的文件进行处理,就是复制、粘贴到SD卡,有时还需要进行删除。起初就觉得不会这么简单,因为data包是涉及到权限的,但是因为针对的是已经root了的用户,所以刚开始也没当一回事。
查了许久,得出结论:
Android自从API19之后(也就是4.4),不能直接对二级存储设备进行写入,那什么是二级存储设备呢?我们都知道,Android手机现在普遍都有内置存储卡,而二级存储就是指外置的,而前面那台手机可以操作,是因为它的版本是4.2,所以就可以写入到外置SD卡中。
这下起码一个疑惑解决了,所以阿,遇到问题还是要淡定淡定!
接着我进入到 /storage/sdcard0/ 路径下面,用mkdir命令创建了一个文件夹:
这下就证明了用Liunx命令创建就不会受到限制,于是我就在代码中执行了以上的命令,果真有效:
结果,真的成功了!当时那个高兴阿,原来用Liunx命令一下子就可以搞定,而且效率比流高多了。
接着我心想就是用代码照搬命令即可:
结果没报错,但是没有复制到,这下又纳闷了。
就这样,结合网上和自己想法,各种尝试,还是无果,后来心想会不会是exec这个方法等于另开一个窗口,这样我的权限不就没了吗?于是获取了其返回值,也就是 Process 对象,顿然大悟,心想绝对如此!于是我用其输入流,继续续写了命令:
然并卵,上网一查,原来还得获取到data包的权限,于是又加了一句获取权限的代码:
还是然并卵,后来我想起以前学Java时好像提及到命令行之间要加回车符,接着就给加上:
嘿!这下就成功!
开始敲码
一开始我采用了读流的方式,就是用流来把data包下面的数据写到SD卡里,结果失败了。具体错误就是没有读取data包的权限,后来去谷歌度娘上查,都没查到什么有用的信息,都是说加上权限什么的,然后我检查了好几遍,都没有问题。一波三折
折腾了许久,我竟天真的拿来另一台测试机,以为是手机问题(汗),不过这也略有收获,怎么说呢?因为我发现在新的手机上,没法在SD卡上创建文件夹,我这下就更郁闷了,怎么这下连SD卡上都创建不了文件夹了。当时就有点懊恼,因为上一个问题折腾了这么久都还没解决,这下又有新问题,不过心想“既来之,则安之”,还是继续谷歌百度。查了许久,得出结论:
Android自从API19之后(也就是4.4),不能直接对二级存储设备进行写入,那什么是二级存储设备呢?我们都知道,Android手机现在普遍都有内置存储卡,而二级存储就是指外置的,而前面那台手机可以操作,是因为它的版本是4.2,所以就可以写入到外置SD卡中。
这下起码一个疑惑解决了,所以阿,遇到问题还是要淡定淡定!
巧用Liunx
这下虽知道了不能在SD卡上创建文件夹的原因了,可是问题还是没有解决,怎么办呢?我突然想起Liunx下创建可不可行呢,于是我连接手机后,我打开命令窗口熟练的敲如 adb shell,然后进入到终端,再输入 su 获取到最高权限,这点一定要已经root的机子才行,不然会提示su这个命令找不到。接着我进入到 /storage/sdcard0/ 路径下面,用mkdir命令创建了一个文件夹:
mkdir /storage/sdcard0/text01
这下就证明了用Liunx命令创建就不会受到限制,于是我就在代码中执行了以上的命令,果真有效:
try { Runtime.getRuntime().exec("mkdir /storage/sdcard0/text01"); } catch (IOException e) { LogUtils.e(e.getMessage()); }
再次遇坑
SD卡的问题解决了,我心想着用Liunx命令直接把data包的内容复制过去不就得了,说干就干,我过我先在终端试了一下:具体命令:cp -r 文件/文件夹路径 目标文件夹路径
结果,真的成功了!当时那个高兴阿,原来用Liunx命令一下子就可以搞定,而且效率比流高多了。
接着我心想就是用代码照搬命令即可:
try { Runtime.getRuntime().exec("cp -r /data/data/包名 /storage/sdcard0/text01"); } catch (IOException e) { LogUtils.e(e.getMessage()); }
结果没报错,但是没有复制到,这下又纳闷了。
如梦初醒
接着我就纳闷了,继续谷歌百度,网上搜到的答案都是说先调用su命令,但我之前已经调用过了,只是上面没贴,也就是这样:try { Runtime.getRuntime().exec("su"); Runtime.getRuntime().exec("cp -r /data/data/包名 /storage/sdcard0/text01"); } catch (IOException e) { LogUtils.e(e.getMessage()); }
就这样,结合网上和自己想法,各种尝试,还是无果,后来心想会不会是exec这个方法等于另开一个窗口,这样我的权限不就没了吗?于是获取了其返回值,也就是 Process 对象,顿然大悟,心想绝对如此!于是我用其输入流,继续续写了命令:
Process process = Runtime.getRuntime().exec("su"); String order = "cp -r /data/data/包名 /storage/sdcard0/text01"; OutputStream outputStream = process.getOutputStream(); outputStream.write(order.getBytes()); outputStream.flush(); outputStream.close();
然并卵,上网一查,原来还得获取到data包的权限,于是又加了一句获取权限的代码:
Process process = Runtime.getRuntime().exec("su"); String cmd = "chmod 777 /data\n"; String order = "cp -r /data/data/包名 /storage/sdcard0/text01"; OutputStream outputStream = process.getOutputStream(); outputStream.write(cmd.getBytes()); outputStream.write(order.getBytes()); outputStream.flush(); outputStream.close();
还是然并卵,后来我想起以前学Java时好像提及到命令行之间要加回车符,接着就给加上:
Process process = Runtime.getRuntime().exec("su"); String cmd = "chmod 777 /data\n"; String order = "cp -r /data/data/包名 /storage/sdcard0/text01"; OutputStream outputStream = process.getOutputStream(); outputStream.write(cmd.getBytes() + "\n"); outputStream.write(order.getBytes()); outputStream.flush(); outputStream.close();
嘿!这下就成功!
总结
通过以上的方法,就可以用Liunx命令对已经root的Android机进行文件的操作了。同时呢,遇到问题也要平常心对待,不要浮躁,没有问题是解决不了的,只要静下心来,问题就能逐一攻破!相关文章推荐
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Mac系统下利用ADB命令连接android手机并进行文件操作
- Linux 下几个文件操作命令的代码实现
- Android中使用SharedPreferences进行数据存储及文件操作模式
- Linux 下几个文件操作命令的代码实现
- Android—文件进行数据存储(四中操作模式)
- php对大文件进行读取操作的实现代码
- Android使用Linux命令执行文件操作
- android报错及解决2--Sdcard进行文件的读写操作报的异常
- android文件操作相关代码
- Android中使用SharedPreferences进行数据存储及文件操作
- Linux 下几个文件操作命令的代码实现,myfind find 查找命令 实现
- Linux 下几个文件操作命令的代码实现
- Android在对Sdcard进行文件的读写操作的时候报错FileNotFoundException
- Android (代码片段) 将网络或文件字节流转换为字符串(UT-8格式的)在进行网络交互时特别重要
- asp.net连接sql2005,cs文件里直接书写的代码,纯手工操作,不在web.config里面进行配置。
- Linux 下几个文件操作命令的代码实现
- android 读写xml,修改appserver.xml(根据appserver.xml文件的位置进行操作)
- Linux 下几个文件操作命令的代码实现