FAQ00366]如何使Android应用程序获取系统权限

[DESCRIPTION]
如何使Android应用程序获取系统权限
[SOLUTION]
    在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要signatureOrSystem等级的permission才能使用。有两种方法可以处理,来得到系统权限。
第一个方法直接修改编译,需要在Android系统源码的环境下用make来编译:
   1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
   2.  修改它的Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
   3.  使用mm命令来编译,生成的apk就有修改系统时间的权限了。
第二个方法使用系统签名文件来处理:
1. 同上,和系统相同的uid. Android 的系统用户id是android.uid.system , 在Manifest里面添加android:sharedUserId="android.uid.system"。
2. 相同的系统签名。包签名需要用到android提供的signapk,但很遗憾,我们的开发包里面并没有,需要您手动的从源码里面编译,在2.2的版本中,源码路径是:froyo\build\tools\signapk。
然后从源码路径froyo\build\target\product\security中取出两个系统签名文件platform.pk8 and platform.x509.pem. 
就可以对eclipse编译好的apk签名了,(注: 编译好的apk在bin目录下)。
形式是:
Java –jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk.
完成这两部后,在运行之前,您还要从模拟器上卸载掉原来的相同程序,因为签名改了,不然会报错不能安装。
对于在模拟器上进行setCurrentTimeMillis 虽然我们能够修改模拟器的时间了,这个方法的返回值仍然是false, 可能是不能真正的修改系统的时钟吧。在Log中的提示是:
08-16 08:29:24.307: WARN/SystemClock(125): Unable to set rtc to 1281918564: Invalid argument. 
这个和android模拟器里面自带的setting里面的修改时间Log提示错误是一样的。

你可能感兴趣的:(FAQ00366]如何使Android应用程序获取系统权限)