android 获取权限应用怎么获取系统权限

android应用怎么获取系统权限
& & &对于一般的Android应用开发来说是不需要用到系统权限的,但是在某些特殊情况下调用一些API是需要系统权限的譬如设置系统的时间SystemClock.setCurrentTimeMillis()函数来修改系统时间。下面介绍的这两种方法是可以获取到系统权限的。
& & & & & 第一种方法需要有Android源代码,这样才能在Android源代码下通过mm进行编译,其中具体的步骤如下:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入 android:sharedUserId=&android.uid.system&这个属性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行 ,此处的作用就是获取系统签名
3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
一般的获取系统权限都是通过如下的方法,但是该方法需要系统源码才可以。
& & & 第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译,可以先将系统签名文件导出备用
&1. 同上,加入android:sharedUserId=&android.uid.system&这个属性。&
&2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。
&3. 使用目标系统的platform密钥来重新给apk文件签名。
这步比较麻烦,首先找到密钥文件,
在我的Android源码目录中的位置 是&build/target/product/security&,
下面的platform.pk8和platform.x509.pem两个文件。
然后用 Android提供的Signapk工具来签名,在&在 android目录下/out/host/linux-x86/framework/signapk.jar&
用法为:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk,文件名最好使用绝对路径防止找不到。其中的test.apk是没有签名前的,test_signed.apk是签名后的。
以上是我总结的在Android应用中获取系统权限的方法,希望能有一些帮助。
本文已收录于以下专栏:
相关文章推荐
在安卓6.0后对于危险的权限不仅需要程序员去AndroidManifest.xml中申明权限,而且也要代码去动态申请权限。
package org.zkl.zhangkelu.activity.e...
Android系统中,权限等级分为
[&normal& | &dangerous&| &signature& | &signatureOrSystem&]
normal 、dangerous是一般...
perl目录操作,
创建目录句柄指向要操作的目录。 打开目录句柄使用 opendir ;
opendir dirhandle,
例:取某目录下文件的列表:
opendir...
#用正则表达式进行匹配
m// = // =
m%%,m||,m&&,m{},m(),匹配的时候根据需要写自己的定界符,像qw省略双引号定界符一样
模式匹配修饰符:
跟在定界符后面的,...
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中...
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中...
android 的API中有提供
SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真
机,在l...
在 android 的API中有提供
SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真
机,在log...
转自:http://blog.csdn.net/liujian885/archive//5404834.aspx
在 android 的API中有提供 SystemClock...
转自:http://blog.csdn.net/liujian885/archive//5404834.aspx 在 android 的API中有提供 SystemClock.se...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)1079人阅读
Android拓展学习(36)
现在设备的安全性越来越受到重视,随之而来的便是开发中的各种不便,比如有普通权限,运行时权限,系统权限之分。对于运行时权限的添加可以参考
对于Android中各个权限的含义可以参考/////中的释义
而对于系统权限,却没有很好的解决方案,暂时只有一些特定的解决方案。
转载请注明出处,本文出自
chapter one 系统应用添加系统权限
对于可以编译到源码里的apk添加系统权限很简单,就两步
一,在androidmanifest.xml文件中添加uid,即让应用跑在system进程中:android:sharduserid= “”
&manifest xmlns:android=&/apk/res/android&
package=&com.fang.zrf.networkdemo&
android:sharedUserId=&android.uid.system&&
二,在该应用的mk文件中添加签名,即让该应用使用系统签名
LOCAL_CERTIFICATE := platform
其中platform对应的签名文件的位置为android/build/target/product/security& platform.pk8和platform.x509.pem
然后使用编译命令编译apk即可。
但如果没有mk的应用该怎么办呢?
其实也可以总结出来,让一个应用使用系统权限不外乎两步
第一就是uid改为system第二就是使用系统的签名,明白了这些之后我们就可以对应用使用系统权限了
chapter two 三方应用添加系统权限
第一步同上,添加Android:shareduserid属性
第二步,将打包好的apk使用系统签名重新签名打包。签名打包使用到一个Android源码中自带的一个工具叫做signapk,所在目录为Android/out/host/linux-x86/framework
使用cmd命令进行重新签名打包java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
其中old.apk是打包好的apk,而new.apk是重新签名的apk。然后可以使用adb install -r new.apk将应用安装到手机上,此时即可获取系统权限。但有一个条件,既然用的是系统的签名,那首先就要保证你应用的系统签名和手机的系统签名一致,这个可能各大厂商会有所改动,所以不太能兼容。
chapter three DEMO实现
好了,说了这么多,来个demo看一看吧。demo所实现的功能有三个,
一是开启手机移动网络
二是关闭手机移动网络
三是获取手机移动网络
其实总结起来就是对手机移动网络的set和get两个功能而已。源码上对于set和get的方法属于hide的,不供三方应用使用,所以我们可以利用反射来调用到。
首先,先来看看需要什么权限
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE&/&
&uses-permission android:name=&android.permission.CHANGE_NETWORK_STATE&/&
&uses-permission android:name=&android.permission.MODIFY_PHONE_STATE&/&
其中MODIFY_PHONE_STATE为系统权限,所以我们只能是按chapter two所示的做法来做。先把代码完成了生成了apk再重新签名。
紧接着就是设置手机移动网络的 状态
public static void setMobileDataState(Context context, boolean enable){
Class[] argsClass = new Class[1];
argsClass[0] = boolean.//setmobiledataenable方法中要传入一个boolean类型的参数
ConnectivityManager connMr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method method = connMr.getClass().getMethod(&setMobileDataEnabled&,argsClass);
method.invoke(connMr,enable);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context,&set failure + e = & + e.getCause(),Toast.LENGTH_LONG).show();
然后是获取手机移动网络的状态
public static boolean getMobileDataState(Context context){
ConnectivityManager connMr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Class[] argsclass =//get时不需要传入参数,所以直接传入一个null的数组即可
Method method = connMr.getClass().getDeclaredMethod(&getMobileDataEnabled&,argsclass);
return (boolean)method.invoke(connMr);
} catch (Exception e) {
e.printStackTrace();
接下来就是界面设计的方法的调用了,
先来看看界面实现效果
&&&&&&&&&&&&&&&&
public class MainActivity extends Activity implements View.OnClickListener{
private TextView mOpenN
private TextView mCloseN
private TextView mGetNetS
private TextView mNetS
private boolean isOpenS
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
* 初始化view
private void initView(){
mOpenNet = (TextView) findViewById(R.id.open_network);
mCloseNet = (TextView) findViewById(R.id.close_network);
mGetNetState = (TextView) findViewById(R.id.get_state);
mNetState = (TextView) findViewById(R.id.network_state);
setClickListener(mOpenNet,mCloseNet,mGetNetState);
* 初始化数据
private void initData(){
updateView();
* 设置view的点击事件
* @param views
private void setClickListener(View...views){
for (View view:views) {
if (view != null){
view.setOnClickListener(this);
public void onClick(View v) {
switch (v.getId()){
case R.id.open_network:
NetManager.setMobileDataState(getApplicationContext(),true);
updateView();
case R.id.close_network:
NetManager.setMobileDataState(getApplicationContext(),false);
updateView();
case R.id.get_state:
updateView();
protected void onResume() {
super.onResume();
updateView();
private void updateView(){
isOpenState = NetManager.getMobileDataState(getApplicationContext());
String str = isOpenState ? &true& : &false&;
if (str.equals(mNetState.getText().toString())){
mNetState.setText(str);
setTvEnable(!isOpenState,isOpenState);
private void setTvEnable(boolean setEnable,boolean closeEnable){
mOpenNet.setEnabled(setEnable);
mCloseNet.setEnabled(closeEnable);
代码完成后,在outputs目录下找到apk文件使用cmd命令进行重新签名。
到此,结束
如有问题,欢迎学习交流,微信公众号---fanfan程序媛
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:480989次
积分:5719
积分:5719
排名:第4732名
原创:100篇
评论:353条
关注我的新浪微博,私信咨询。
分享Android相关技术,旅行日志,fanfan程序媛。
阅读:121556
(1)(2)(5)(1)(2)(4)(6)(7)(4)(4)(2)(1)(5)(8)(7)(3)(9)(6)(13)(11)(2)
关注微信公众号2013年10月 移动开发大版内专家分月排行榜第三
2013年10月 移动开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。android用户权限获取_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
android用户权限获取
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢如何使Android应用程序获取系统权限
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到&Unable to open alarm driver: Permission denied &.这个函数需要root权限或者运行与系统进程中才可以用。
&&&&&&& 本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。
&&&&&&& 第一个方法简单点,不过需要在系统的环境下用make来编译:
&&&&&&& 1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=&android.uid.system&这个属性。
&&&&&&& 2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
&&&&&&& 3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
&&&&&&& 第二个方法麻烦点,不过不用开跑到源码环境下用make来编译:
&&&&&&& 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.apk output.apk&,文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
&&&&&&& 这样最后得到的apk和第一个方法是一样的。
&&&&&&& 最后解释一下原理,首先加入android:sharedUserId=&android.uid.system&这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。
&&&&&&& 只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
&&&&&&& 这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示&Package ... has no signatures that match those in shared user android.uid.system&,这样也是保护了系统的安全。
&&&&&&& 最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。
博主补充:
signapk编译结束后在 android目录下/out/host/linux-x86/framework/signapk.jar
使用方法:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk
实践证明,第二种方法不需要删掉META-INF目录下的CERT.SF和CERT.RSA两个文件,直接signapk就可以。
摘自 狐狸浩浩技术空间

我要回帖

更多关于 android 获取应用权限 的文章

 

随机推荐