一、利用系统签名来获取权限关机
private void shutDown(){
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
- 源码中“android.intent.extra.KEY_CONFIRM”是 Intent.EXTRA_KEY_CONFIRM 方法。
- 源码中“android.intent.action.ACTION_REQUEST_SHUTDOWN“ 是 Intent.ACTION_REQUEST_SHUTDOWN 方法
需要在AndroidManifest.xml里添加 android:sharedUserId="android.uid.system"
和<uses-permission android:name="android.permission.SHUTDOWN/>"
权限。
是将自己的程序加入到了系统的进程中,同时也将获得系统的权限。需要添加系统签名。
android:sharedUserId="android.uid.system"
下面是范例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example"
android:sharedUserId="android.uid.system"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.SHUTDOWN"/>
当然,这些代码在eclipse里会报错(我当时用的是eclipse),把这些错误报告删掉,强行编译就可以了。具体做法是把problems里的把与它相关的错误报告删除掉。Windows-show view-other-搜索problems可以找到错误报告。上机用时需要添加系统签名,不然安装不上。
- 签名用目标系统的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.apk output.apk”,文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
二、系统root过,利用系统管理员root身份来行使关机命令
try {
createSuProcess("reboot -p").waitFor(); //关机命令
//createSuProcess("reboot").waitFor(); //这个部分代码是用来重启的
} catch (Exception e) {
e.printStackTrace();
}
static Process createSuProcess() throws IOException {
File rootUser = new File("/system/xbin/ru");
if(rootUser.exists()) {
return Runtime.getRuntime().exec(rootUser.getAbsolutePath());
} else {
return Runtime.getRuntime().exec("su");
}
}
static Process createSuProcess(String cmd) throws IOException {
DataOutputStream os = null;
Process process = createSuProcess();
try {
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + "\n");
os.writeBytes("exit $?\n");
} finally {
if(os != null) {
try {
os.close();
} catch (IOException e) {
}
}
}
return process;
}
try {
Process process = Runtime.getRuntime().exec(new String[]{"su" , "-c" ,"reboot -p"});
r = process.waitFor();
java.lang.System.out.println("r:" + r );
} catch (IOException e) {
e.printStackTrace();
r = -1;
}
try {
Process process = Runtime.getRuntime().exec("su -c reboot");
r = process.waitFor();
java.lang.System.out.println("r:" + r );
} catch (IOException e) {
e.printStackTrace();
r = -1;
}