调试重启功能 1.尝试代码块
//method oneString 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 testProcess 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是否能够获得运行在系统进程的权限,并没有查阅到更多相关的资料。

更多相关文章

  1. Android 获取本地音乐文件
  2. Android播放在线音乐文件
  3. Android应用程序调用系统解锁页面
  4. 文件读写
  5. Android应用程序启动过程源代码分析(4)
  6. Android读取Txt文件
  7. Android的权限 permission
  8. 在android获取root权限的方法^_^。

随机推荐

  1. 给作为安卓开发新手的自己的几点建议(摘抄
  2. android平台上的文件下载,文件和文件的操
  3. android selector
  4. Android百分比布局(PercentRelativeLayou
  5. android 五大布局
  6. Android——从入门到放弃
  7. Android(安卓)代码质量工具集成与应用
  8. Android(安卓)设备电池容量和使用量的获
  9. Android(安卓)控件之Gallery图片集
  10. android 获取文件的扩展名和去掉文件的扩