Android API:已获ROOT权限的设备程序化访问系统文件失败的解决办法
解决办法
问题核心:你调用Runtime.getRuntime().exec("su")只是启动了一个独立的root权限进程,但当前应用的主进程还是普通用户权限,直接用Java的File API访问系统目录自然没有权限,所以listFiles()返回null。
可行的解决思路是在root进程中执行文件操作命令,读取命令输出结果,而非直接用Java的File类。具体实现方式如下:
- 通过
su -c参数直接执行shell命令获取目录内容,比如ls /bin,然后读取命令的输出流解析结果:
try { // 执行root权限的ls命令,获取/bin下的文件列表 Process process = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /bin"}); BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); // 读取正常输出(目录内容) String line; System.out.println("/bin下的文件:"); while ((line = inputReader.readLine()) != null) { System.out.println(line); } // 读取错误输出,排查权限问题(比如用户拒绝root授权) String errorLine; while ((errorLine = errorReader.readLine()) != null) { System.err.println("错误信息:" + errorLine); } inputReader.close(); errorReader.close(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); }
- 若需要更详细的文件信息(比如文件大小、权限),可以把命令换成
ls -l /bin,再解析每行的字段。 - 部分设备的
su可能需要指定完整路径,比如/system/bin/su,可根据实际情况调整命令数组。
额外确认项:
- 设备确实已成功root,且应用请求root权限时用户已允许。
- 部分定制ROM可能限制了对/bin目录的访问,这种情况需要检查ROM的权限策略。
内容的提问来源于stack exchange,提问作者Ray Liu
相关产品推荐
相关产品推荐

