Android实现关机/重启

这篇博客主要介绍了如何在Android系统中实现关机和重启功能。难点在于获取关机权限,需要在AndroidManifest.xml中配置android:sharedUserId="android.uid.system",并确保版本号高于旧版。此外,还需使用系统签名对应用进行签名,这涉及到找到目标系统的平台密钥和使用signapk.jar工具进行签名操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实重启是比较简单,较难的反而是关机。因为关机需要获取系统的权限,这个过程是比较麻烦的。废话不多说,直接上代码:

首先,配置AndroidManifest.xml文件,加上:android:sharedUserId="android.uid.system"

<span style="font-size:14px;">    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="com.example.xxxxxx"  
        android:sharedUserId="android.uid.system"  
        android:versionCode="1"  
        android:versionName="1.0" >  </span>
通过shareUserId,拥有同一个User id的多个APK就可以配置成运行在同一个进程中,那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就可以拥有系统权限。

升级要记得版本号要比旧版本大!

然后,配置应用需要的权限:

<span style="font-size:14px;">    <uses-permission android:name="android.permission.SET_TIME" />
    <uses-permission android:name="android.permission.SHUTDOWN" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.DEVICE_POWER" /></span>
会提醒:“Permission is only granted to system apps”的错误,意思是“权限只对系统应用授权”,不用担心,只需要project->clean,点击确定提醒就消失了。
具体执行代码:

public void reboot() {
			// TODO 重启
			Intent i = new Intent(Intent.ACTION_REBOOT);
			i.putExtra("nowait", 1);
			i.putExtra("interval", 1);
			i.putExtra("window", 0);
			sendBroadcast(i);
		}

		public void shutDown() {
			// TODO 关机
			try {
				// 获得ServiceManager类
				Class
    
     ServiceManager = Class
						.forName("android.os.ServiceManager");

				// 获得ServiceManager的getService方法
				Method getService = ServiceManager.getMethod("getService",
						java.lang.String.class);

				// 调用getService获取RemoteService
				Object oRemoteService = getService.invoke(null,
						Context.POWER_SERVICE);

				// 获得IPowerManager.Stub类
				Class
    
     cStub = Class.forName("android.os.IPowerManager$Stub");
				// 获得asInterface方法
				Method asInterface = cStub.getMethod("asInterface",
						android.os.IBinder.class);
				// 调用asInterface方法获取IPowerManager对象
				Object oIPowerManager = asInterface
						.invoke(null, oRemoteService);
				// 获得shutdown()方法
				Method shutdown = oIPowerManager.getClass().getMethod(
						"shutdown", boolean.class, boolean.class);
				// 调用shutdown()方法
				shutdown.invoke(oIPowerManager, false, true);

			} catch (Exception e) {
				e.printStackTrace();
			}
		}

最后,签名。

完成以上步骤后编译出来的apk文件是不能使用的,这个签名是编译器默认的Debug签名,而不是系统签名。Android系统有的权限是基于签名的,签名不对,也就不能获取相应的权限。那么怎样获取系统签名呢?

1、找到目标系统的源代码,进入build/target/product/security ,找到platform.pk8和platform.x509.pem这两个文件,这是系统默认使用的密钥。

2、已经有密钥了,现在需要签名的工具:signapk.jar文件。signapk.jar的源码位置build/tools/signapk,你可以自己编译成jar文件。或者你如果懒得做,还可以直接在目录中搜索“signapk.jar”,反正我就是这么找到的。。。

3、最好将这几个文件和未签名的apk文件放在一个目录,然后执行命令: java -jar signapk.jar platform.x509.pem platform.pk8  old.apk new.apk。
这条命令的意思是:通过signapk.jar签名工具,以“platform.x509.pem”这个公钥文件和“platform.pk8”这个私钥文件对“old.apk”进行签名,签名后的文件保存为“new.apk”。搞定!



参考:http://blog.youkuaiyun.com/u014375869/article/details/38470039

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值