Android设备重启(reboot)---Android(安卓)studio
//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!");}出现如下异常:
百度出现的类似的问题解决方案:
其中解决方案votes最多的如下:
参照上图内容修改代码为:
//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后,运行该程序
注意这里的错误,和一开始的还是有区别的,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啦。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();}测试之后报如下错误,重启不成功:
虽然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程序后会出现程序写不进调试机中去:
从查到的资料来看,解决这个问题又有两个办法(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就有重启权限了
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",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
查阅了很多的资料,大家都是采用这种方法,提供的解决方案都是Eclipse环境下。那么在AS下加入了android:sharedUserId=”android.uid.system“之后,是否还能够用Eclipse中的两种方法解决,如何解决?AS中也有签名,但是自己签名过的app是否能够获得运行在系统进程的权限,并没有查阅到更多相关的资料。更多相关文章
- Android(安卓)JNI和NDK学习(3)--Android.mk分析
- 【Android(安卓)Demo】让Android支持自定义的ttf字体
- Android(安卓)SDCard操作(文件读写,容量计算)
- 前台android与后台Servlet交互---上传文件
- 总结系列-Android的文件系统
- android官方资源下载url
- Android(安卓)权限添加
- Android(安卓)预置APK的权限授予
- Android(安卓)控件抖动效果