2019独角兽企业重金招聘Python工程师标准>>>

Android

android中如何通过代码检测是否有root权限?

  • while

    3 票

  • 1892
评论 (0) • 分享 • 链接 • 2012-02-10 

4个答案

票 数

  • andev

    3 票

  • 5441
  • 最佳答案

封装了一个类,代码如下:

public class ShellCommand { private Boolean can_su;     public SH sh; public SH su; public ShellCommand() { sh = new SH("sh"); su = new SH("su"); } public boolean canSU() { return canSU(false); } public boolean canSU(boolean force_check) { if (can_su == null || force_check) { CommandResult r = su.runWaitFor("id"); StringBuilder out = new StringBuilder(); if (r.stdout != null) out.append(r.stdout).append(" ; "); if (r.stderr != null) out.append(r.stderr); can_su = r.success(); } return can_su; } public SH suOrSH() { return canSU() ? su : sh; } public class CommandResult { public final String stdout; public final String stderr; public final Integer exit_value; CommandResult(Integer exit_value_in, String stdout_in, String stderr_in) { exit_value = exit_value_in; stdout = stdout_in; stderr = stderr_in; } CommandResult(Integer exit_value_in) { this(exit_value_in, null, null); } public boolean success() { return exit_value != null && exit_value == 0; } } public class SH { private String SHELL = "sh"; public SH(String SHELL_in) { SHELL = SHELL_in; } public Process run(String s) { Process process = null; try { process = Runtime.getRuntime().exec(SHELL); DataOutputStream toProcess = new DataOutputStream(process.getOutputStream()); toProcess.writeBytes("exec " + s + "\n"); toProcess.flush(); } catch(Exception e) { process = null; } return process; } private String getStreamLines(InputStream is) { String out = null; StringBuffer buffer = null; DataInputStream dis = new DataInputStream(is); try { if (dis.available() > 0) { buffer = new StringBuffer(dis.readLine()); while(dis.available() > 0) buffer.append("\n").append(dis.readLine()); } dis.close(); } catch (Exception ex) { } if (buffer != null) out = buffer.toString(); return out; } public CommandResult runWaitFor(String s) { Process process = run(s); Integer exit_value = null; String stdout = null; String stderr = null; if (process != null) { try { exit_value = process.waitFor(); stdout = getStreamLines(process.getInputStream()); stderr = getStreamLines(process.getErrorStream()); } catch(InterruptedException e) { } catch(NullPointerException e) { } } return new CommandResult(exit_value, stdout, stderr); } } }

通过return new ShellCommand().canSU()即可获得。

注意这个方法最好放在异步中做,因为不同的机器检查时间不同。

评论 (0) • 链接 • 2012-02-17

  • 稻草人

    8 票

  • 1710

1、最直接的判断有无root :判断是否有权限管理。如果已经root,则手机往往会有权限管理器,可用安装需要权限的软件。
2、只要随便写个具有“写入”权限的代码,在Android真机的系统目录里试试就知道,如果“写入”成功,说明具有root权限。

如果非要代码检测,下面代码可以试试

package com.pocketdigi;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.os.Bundle;

public class RootActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DataInputStream stream;
if(isRooted()){
try {
stream = Terminal("ping -c 2 www.pocketdigi.com");
//其实ping并不需要root权限 ,这里是ping 2次后才停止,所以启动后需要一点时间才会有显示
//你可以自己换成需要root权限的命令试试
String temp;
while((temp=stream.readLine())!=null){
System.out.println(temp);
//循环输出返回值
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public DataInputStream Terminal(String command) throws Exception
{
Process process = Runtime.getRuntime().exec("su");
//执行到这,Superuser会跳出来,选择是否允许获取最高权限
OutputStream outstream = process.getOutputStream();
DataOutputStream DOPS = new DataOutputStream(outstream);
InputStream instream = process.getInputStream();
DataInputStream DIPS = new DataInputStream(instream);
String temp = command + "\n";
//加回车
DOPS.writeBytes(temp);
//执行
DOPS.flush();
//刷新,确保都发送到outputstream
DOPS.writeBytes("exit\n");
//退出
DOPS.flush();
process.waitFor();
return DIPS;
}
public boolean isRooted() {
//检测是否ROOT过
DataInputStream stream;
boolean flag=false;
try {
stream = Terminal("ls /data/");
//目录哪都行,不一定要需要ROOT权限的
if(stream.readLine()!=null)flag=true;
//根据是否有返回来判断是否有root权限
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();

}

return flag;
}

}

评论 (0) • 链接 • 2012-02-18

  • 张炎Lior

    4 票

  • 509

使用代码倒真是没试过,不过可以依照linux特性去思考。linux系统下root权限可以使用su命令,android本身也是小型的linux系统,所以可以尝试下面代码试验下:`
public static boolean runRootCommand(String command) {

Process process = null;   DataOutputStream os = null;   try {   process = Runtime.getRuntime().exec("su");   os = new DataOutputStream(process.getOutputStream());   os.writeBytes(command+"\n");   os.writeBytes("exit\n");   os.flush();   process.waitFor();   } catch (Exception e) {   Log.d("*** DEBUG ***", "Unexpected error - Here is what I know: "+e.getMessage());   return false;   }   finally {   try {   if (os != null) {   os.close();   }   process.destroy();   } catch (Exception e) {   // nothing   }   }   return true;   }  

}
`
另外如果不使用代码检测,可以有一个方法,将android设备连接USB调试,待识别设备后输入adb shell,如果出现$表述无root权限,如果出现#则表示有root权限,希望对你有用。

评论 (0) • 链接 • 2012-02-10

  • davis

    1 票

  • 1117

public static boolean runRootCommand(String command) {

Process process = null;   DataOutputStream os = null;   try {   process = Runtime.getRuntime().exec("su");   os = new DataOutputStream(process.getOutputStream());   os.writeBytes(command+"\n");   os.writeBytes("exit\n");   os.flush();   process.waitFor();   } catch (Exception e) {   Log.d("*** DEBUG ***", "Unexpected error - Here is what I know: "+e.getMessage());   return false;   }   finally {   try {   if (os != null) {   os.close();   }   process.destroy();   } catch (Exception e) {   // nothing   }   }   return true;   }  

}

转载于:https://my.oschina.net/zhuzihasablog/blog/98116

android中如何通过代码检测是否有root权限?相关推荐

  1. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  2. Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理

    Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理 草木瓜 20110408 一.前言 经过笔者自己测试与分析,得出结论:所以Android手机获取Root ...

  3. android外置传感器,Android中外接键盘的检测的实现

    今天来了一个问题:软键盘无法弹出.分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘.但实际情况并不是这么简单,该问题只有在特定条件下偶现,具体分析过程就不说了,就是软硬键盘支持上的逻辑问题.借着这 ...

  4. android外接键盘打汉字,Android中外接键盘的检测的实现

    今天来了一个问题:软键盘无法弹出.分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘.但实际情况并不是这么简单,该问题只有在特定条件下偶现,具体分析过程就不说了,就是软硬键盘支持上的逻辑问题.借着这 ...

  5. Unity 调用Android中的java代码

    文章目录 1. Android 程序 2. Unity程序 3. 最佳实践 Unity与Android交互有多种方式,使用AndroidJavaClass和AndroidJavaObject是最为方便 ...

  6. Android中如何使用代码打开各种类型的文件

    介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...

  7. 手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件

    介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...

  8. Android WIFI密码查看器实例(在获取Root权限下查看系统文件)

    Android WIFI密码查看器实例 实现原理:使用shell命令查看保存WIFI密码的系统文件 涉及的知识 界面展示 基本的Shell命令 shell查看WIFI密码 ShellUtil的使用 正 ...

  9. 权限执行[Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?

    每日一贴,今天的内容关键字为权限执行 RunTime.exec()这个接口可以说是给我们开发者供给了一个很好的直观操纵底层操纵系统的机遇,但是这个接口的使用还有很多需要注意的问题.由于要完全的分析这个 ...

最新文章

  1. Linux包管理器apt/apt-get发现远程代码执行漏洞
  2. 场效应管的判别、检测及使用时的注意事项!
  3. 第二章 数组名是一个指针常量吗?
  4. ML2 配置 OVS VxLAN - 每天5分钟玩转 OpenStack(146)
  5. SQL经典语句(转载)
  6. Flutter OpenContainer 容器转换过渡 Material Design 设计风格的实践
  7. delphi7 安装delphi 5 delphi 6控件
  8. JS function 函数基本定义方法
  9. Python是个什么鬼?为什么这么多人都在学Python?
  10. 9种常见的前端跨域解决方案(详解)
  11. “三区三线”永久基本农田划定实用工具
  12. 云计算之paas架构解析
  13. aics6圆角插件怎么安装_AI圆角插件!助你更快设计字体 Xtream Path1.4的安装使用教程...
  14. word2016从某一页开始插入新的起始页码
  15. 在Linux系统下安装更换操作系统
  16. SQL工具导出CSV文件中文乱码
  17. 电脑微信关闭自动保存_微信自动保存图片怎么关闭
  18. 幂律分布参数估计幂律分布公式计算
  19. 基于matlab的低秩结构重构算法仿真实现,对比ALM,IT,APG,ADMM
  20. 分式化简结果要求_分式化简的结果有什么要求?

热门文章

  1. Emlog百度快速收录插件
  2. 星际通讯+基于区块链的价值共享互联网即时通讯应用平台
  3. 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作...
  4. 移动端webapp开发必备知识
  5. 解决Ubuntu vim 中文乱码
  6. UIView的一些基本方法 init、loadView、viewDidLoad、viewDidUnload、dealloc
  7. Python_主成分分析
  8. 西瓜书机器学习总结(一)
  9. 如何用Pygame写游戏(二十二)
  10. Linux(debian7)错误集锦(二)之安装Gnome报错Failed to start unit user@1000.service