//method one
String cmd="su-c reboot";
try{
//获取系统权限
Runtime.getRuntime().exec(cmd);
//tb log
LogMonitor_log4j.logToFileF(this.getClass().getSimpleName(),"Device reboot manully!");
}catch(Exception ex){
Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();
LogMonitor_log4j.logToFileF(this.getClass().getSimpleName(),"Device reboot failed!");
}
出现如下异常://another test
Process p=Runtime.getRuntime().exec(cmd);
Runtime.getRuntime().exec(String.valueOf(p.getInputStream()));
结果无效,出现同样的错误。
2.单独测试
仅单独测试:Runtime.getRuntime().exec("su");代码块时并没有问题。
仅单独测试:Runtime.getRuntime().exec("su -c");代码块并没有问题。
仅单独测试:Runtime.getRuntime().exec("su -c reboot");不会报错,但是程序没有任何响应。-à中间间隔了一段时间。但我再次点击button触发Runtime.getRuntime().exec("su -c reboot");时,弹出了root权限管理是否授权的对话框,应该是360root的功能,选择允许授权之后,再次点击button实现重新启动。启动之后呢,打开360root管理,自己写的app权限已经被添加到了root允许中去了。
3.测试删除360root后,运行该程序
注意这里的错误,和一开始的还是有区别的,Command[su,-c,reboot],此处出现这个错误的原因是缺少root权限,执行exec(“su –c reboot”)不能成功,su是获取系统权限。再重新给device授权,使用360超级root。
4.总结
事实上在最开始我就已经root好了手机,但是为什么会出1里边的错误呢,大家再仔细看看我的指令,“su-c reboot”在“su”和“-c”指令见得空格没有了,导致乌龙。在手机root的情况下,上面的方法是可以实现重启机器的,但是在第一次运行程序时,程序执行到“su -c reboot”时,360超级root会询问是否给予root权限,这时候要允许,那么以后程序在运行时就能够顺利重启啦。
那么我的app要部署到另外一个device上,但是却没有达到reboot的条件,是不是会出现bug。是的。因为在进行”su“指令时,360超级root会询问是否给予权限,这时候要人工操作允许。所以要在app程序一开始执行的时候就执行exec(“su”)然程序获得root权限,这样后面就可以顺利执行reboot啦。方法一:
测试之后报如下错误,重启不成功:try { Intent iReboot = new Intent(Intent.ACTION_REBOOT); iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); AccActivity.this.startActivity(iReboot); }catch(Exception ex){ Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show(); }
虽然Manifest文件中加入了
但是下面是有波浪线的,意味着
try {
PowerManager pManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
pManager.reboot("");
}catch(Exception ex){
Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();
}
测试之后报如下错误,重启不成功:从查到的资料来看,解决这个问题又有两个办法(Eclipse中的解决办法):
详见:http://blog.youkuaiyun.com/vincent_czz/article/details/7199567
A.1. 加入android:sharedUserId=”android.uid.system“
2.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform
3. 使用mm命令来编译,生成的apk就有重启权限了
B.1. 加入android:sharedUserId=”android.uid.system“
2.使用eclipse编译出apk文件,但是这个apk文件是不能用的
3.用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件
4.使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apkoutput.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。