Android设备重启(reboot)---Android studio

调试重启功能
1.尝试代码块
//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!");
}
出现如下异常:

百度出现的类似的问题解决方案:
Android设备重启(reboot)---Android studio_第1张图片
其中解决方案votes最多的如下:
Android设备重启(reboot)---Android studio_第2张图片
参照上图内容修改代码为:
//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后,运行该程序

Android设备重启(reboot)---Android studio_第3张图片

注意这里的错误,和一开始的还是有区别的,Command[su,-c,reboot],此处出现这个错误的原因是缺少root权限,执行exec(“su –c reboot”)不能成功,su是获取系统权限。再重新给device授权,使用360超级root。

Android设备重启(reboot)---Android studio_第4张图片

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啦。

5.其他重启方法

方法一:


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();
}
测试之后报如下错误,重启不成功:

Android设备重启(reboot)---Android studio_第5张图片
虽然Manifest文件中加入了

 但是下面是有波浪线的,意味着

方法二:
try {
   PowerManager pManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
   pManager.reboot("");
}catch(Exception ex){
   Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();
}
测试之后报如下错误,重启不成功:
同样说我没有android.permission.REBOOT权限。
对上述两种失败的方法总结:需要在Manifest文件的manifest节点下加入android:sharedUserId=”android.uid.system“,加入之后该应用会会运行在系统进程中,这样就有权限实现重启。那么再加入android:sharedUserId=”android.uid.system“之后,在AS中run程序后会出现程序写不进调试机中去:
Android设备重启(reboot)---Android studio_第6张图片

从查到的资料来看,解决这个问题又有两个办法(Eclipse中的解决办法):

详见:http://blog.csdn.net/vincent_czz/article/details/7199567

         A.1. 加入android:sharedUserId=”android.uid.system“

               2.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform

              3. 使用mm命令来编译,生成的apk就有重启权限了

       B1. 加入android:sharedUserId=”android.uid.system“

     2.使用eclipse编译出apk文件,但是这个apk文件是不能用的

            3.用压缩软件打开apk文件,删掉META-INF目录下的CERT.SFCERT.RSA两个文件

            4.使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build\target\product\security",下面的platform.pk8platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apkoutput.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

         查阅了很多的资料,大家都是采用这种方法,提供的解决方案都是Eclipse环境下。那么在AS下加入了android:sharedUserId=”android.uid.system“之后,是否还能够用Eclipse中的两种方法解决,如何解决?AS中也有签名,但是自己签名过的app是否能够获得运行在系统进程的权限,并没有查阅到更多相关的资料。

你可能感兴趣的:(Android)