android permission 和 permission group详解

阅读Android SDK时可以发现, Android Manifest下有两个内部类, 一个是permission ,还有一个是permission_group。

 

 

这两个内部类是干什么的呢? 有什么区别呢?

 

对于Permission, 可能做过Android开发的人应该都知道, 这就是权限。 在这个类中定义了很多的权限,比如网络访问权限、蓝牙设备访问权限、振动器使用权限等等.. 

 

 

 

一般用法就是在 AndroidManifest.xml 中进行定义, 如下例:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     package="com.yfz" android:versionCode="1"  
  5.     android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon"  
  7.         android:label="@string/app_name">  
  8.         <activity android:name=".LesMain"  
  9.             android:label="@string/app_name"  
  10.             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category  
  14.                     android:name="android.intent.category.LAUNCHER" />  
  15.             </intent-filter>  
  16.             <!-- 支持ACTION_SEND -->  
  17.             <intent-filter>  
  18.                 <action android:name="android.intent.action.SEND">  
  19.                 </action>  
  20.                 <category  
  21.                     android:name="android.intent.category.DEFAULT">  
  22.                 </category>  
  23.                 <data android:mimeType="text/plain">  
  24.                 </data>  
  25.             </intent-filter>  
  26.         </activity>  
  27.     </application>  
  28.     <uses-sdk android:minSdkVersion="8" />  
  29.     <!-- 访问网络 -->  
  30.     <uses-permission android:name="android.permission.INTERNET" />  
  31.     <!-- 使用振动的权限 -->  
  32.     <uses-permission android:name="android.permission.VIBRATE"></uses-permission>  
  33.     <!-- 键盘锁权限Allows applications to disable the keyguard -->  
  34.     <uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>  
  35.     <!-- 调用相机权限 -->  
  36.     <uses-permission android:name="android.permission.CAMERA"/>  
  37.     <!-- 悬浮窗 -->  
  38.     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  
  39. </manifest>  
 

 

这里面的<uses-permission android:name="android.permission.xxx" />就是权限定义。

 

一般我们都是在这边定义好, 不知道能不能动态授权噢.. 下次研究下!

 

那么permission_group是干什么的呢?

 

从SDK中可以看到, 这个类中只有很少的几个常量定义。究竟什么作用?

 

 

 

其实Android在定义 permission 时, 为每个Permission都进行了分组, 每一个Permission都有一个PermissionGroup属性。

 

来看一下Android源码(在frameworks/base/core/res /AndroidManifest.xml):

 

 

  1. <!-- Used for permissions that can be used to make the user spend money  
  2.      without their direct involvement.  For example, this is the group  
  3.      for permissions that allow you to directly place phone calls,  
  4.      directly send SMS messages, etc. -->  
  5. <permission-group android:name="android.permission-group.COST_MONEY"  
  6.     android:label="@string/permgrouplab_costMoney"  
  7.     android:description="@string/permgroupdesc_costMoney" />  
  8. <!-- Allows an application to send SMS messages. -->  
  9. <permission android:name="android.permission.SEND_SMS"  
  10.     android:permissionGroup="android.permission-group.COST_MONEY"  
  11.     android:protectionLevel="dangerous"  
  12.     android:label="@string/permlab_sendSms"  
  13.     android:description="@string/permdesc_sendSms" />  
  14. <!-- Allows an application to initiate a phone call without going through  
  15.      the Dialer user interface for the user to confirm the call  
  16.      being placed. -->  
  17. <permission android:name="android.permission.CALL_PHONE"  
  18.     android:permissionGroup="android.permission-group.COST_MONEY"  
  19.     android:protectionLevel="dangerous"  
  20.     android:label="@string/permlab_callPhone"  
  21.     android:description="@string/permdesc_callPhone" />  
 

 

可以看到,这边先定义了一个PermissionGroup : android.permission-group.COST_MONEY, 然后又定义了两个Permission : 

android.permission.SEND_SMS  和 android.permission.CALL_PHONE , 需要注意的是,这两个权限中都一个android:permissionGroup属性,这个属性就指定了这个权限所属的PermissionGroup。

 

而PermissionGroup在定义时,仅仅制定了label和descrip , 就是说明一下这个权限组的作用,没什么其他用处。

 

 


 

下面总结一下:

 

permissiongroup,就是permission里面的一个tag。


主要作用是用来显示application需要的权限,


比如你使用了<uses-permission android:name="android.permission.INTERNET" />权限,
那么在android的setting->applications->manage applications->你的应用程序,显示的是需要“Network communication”权限,这个“Network communication”就是permissionGroup的label。


所以说permissiongroup只是一个逻辑分组,作用也只有显示应用程序权限给用户看的。

 

当然需要额外说明的是, 并不是所有的Permission都有PermissionGroup, 有的可能没有分组。 这些没有分组的Permission也会自己指定label, 以便告知用户这个权限的作用。


大家好,今天给大家简单分享一下Android中自定义action与permission. 我们在实际开发中,经常会用到系统的功能,比如打电话功能只要如以下简单代码:

  1. Uri uri = Uri.parse("tel.xxxxxx");  
  2. Intent it =new Intent(Intent.ACTION_CALL,uri);   
  3. startActivity(it);    
  1. Uri uri = Uri.parse("tel.xxxxxx");  
  2. Intent it =new Intent(Intent.ACTION_CALL,uri);   
  3. startActivity(it);    

并且在AndroidManifest.xml文件中添加如下权限:

  1. <uses-permission id="android .permission.CALL_PHONE" />   
  1. <uses-permission id="android .permission.CALL_PHONE" />   

下面我将实例给大家分享一下自定义action与permission.实例有两个Android工程Demo,与Demo2. Demo工程有两个Activity一个是主Activity,另一个是ViewActivity,这个Activity我们给自定义了android.tutor.action.VIEW的action以及com.tutor.permission.VIEW的permission。

另一个Demo2的主Activity去调用Demo里的ViewActivity,代码如下:

  1. Intent mIntent = new Intent();  
  2. mIntent.setAction("android.tutor.action.VIEW");  
  3. startActivity(mIntent);  
  1. Intent mIntent = new Intent();  
  2. mIntent.setAction("android.tutor.action.VIEW");  
  3. startActivity(mIntent);  

并且要在AndroidMainfest.xml添加以下权限:

  1. <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  
  1. <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  

下面是具体步骤如下:

第一步:新建第一个Android工程Demo.目录结构如下:

第二步:新建名为ViewActivity的Activity,代码如下:

  1. package com.tutor.demo;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. public class ViewActivity extends Activity {  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.           
  10.         TextView mTextView = new TextView(this);  
  11.         mTextView.setText("我是自定义action并且加了权限的Activity.");  
  12.         setContentView(mTextView);  
  13.     }  
  14. }  
  1. package com.tutor.demo;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. public class ViewActivity extends Activity {  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.           
  10.         TextView mTextView = new TextView(this);  
  11.         mTextView.setText("我是自定义action并且加了权限的Activity.");  
  12.         setContentView(mTextView);  
  13.     }  
  14. }  

第三步:在AndroidMainfest.xml中定义action与permission,代码如下:

 第6,7,20行代码定义了permission,第18-21行定义了action.第28行是同一个android工程访问ViewActivity也要申请权限.

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.tutor.demo"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.      <permission android:protectionLevel="normal" android:name="com.tutor.permission.VIEW">  
  7.      </permission>  
  8.       
  9.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  10.         <activity android:name=".Demo"  
  11.                   android:label="@string/app_name">  
  12.             <intent-filter>  
  13.                 <action android:name="android.intent.action.MAIN" />  
  14.                 <category android:name="android.intent.category.LAUNCHER" />  
  15.             </intent-filter>  
  16.         </activity>  
  17.           
  18.         <activity android:name=".ViewActivity"  
  19.                   android:label="自定义action与permission"  
  20.                   android:permission="com.tutor.permission.VIEW"  
  21.         >  
  22.             <intent-filter>  
  23.                 <action android:name="android.tutor.action.VIEW" />  
  24.                 <category android:name="android.intent.category.DEFAULT" />  
  25.             </intent-filter>  
  26.         </activity>  
  27.     </application>      
  28.     <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  
  29. </manifest>  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.tutor.demo"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.      <permission android:protectionLevel="normal" android:name="com.tutor.permission.VIEW">  
  7.      </permission>  
  8.       
  9.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  10.         <activity android:name=".Demo"  
  11.                   android:label="@string/app_name">  
  12.             <intent-filter>  
  13.                 <action android:name="android.intent.action.MAIN" />  
  14.                 <category android:name="android.intent.category.LAUNCHER" />  
  15.             </intent-filter>  
  16.         </activity>  
  17.           
  18.         <activity android:name=".ViewActivity"  
  19.                   android:label="自定义action与permission"  
  20.                   android:permission="com.tutor.permission.VIEW"  
  21.         >  
  22.             <intent-filter>  
  23.                 <action android:name="android.tutor.action.VIEW" />  
  24.                 <category android:name="android.intent.category.DEFAULT" />  
  25.             </intent-filter>  
  26.         </activity>  
  27.     </application>      
  28.     <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  
  29. </manifest>  

第四步:修改主Activity,Demo.java代码如下(在onCreate()里去跳转到ViewActivity,也需要申请权限的如上面的第28行代码):

  1. package com.tutor.demo;  
  2. import com.tutor.demo.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. public class Demo extends Activity {  
  7.    
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);        
  12.         //跳转ViewActivity   
  13.         Intent mIntent = new Intent();  
  14.         mIntent.setAction("android.tutor.action.VIEW");  
  15.         startActivity(mIntent);  
  16.     }  
  17. }  
  1. package com.tutor.demo;  
  2. import com.tutor.demo.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. public class Demo extends Activity {  
  7.    
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);        
  12.         //跳转ViewActivity  
  13.         Intent mIntent = new Intent();  
  14.         mIntent.setAction("android.tutor.action.VIEW");  
  15.         startActivity(mIntent);  
  16.     }  
  17. }  

第五步:运行Demo工程,效果如下图:

 

上面是同一个Android工程里访问ViewActivity的情形,下面我们新建一个Demo2的android工程,去调用ViewActivity.

Demo2.java代码如下:

  1. package com.tutor.demo2;  
  2. import com.tutor.demo2.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. public class Demo2 extends Activity {  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.         //访问应用demo里的ViewActivity  
  12.         Intent mIntent = new Intent();  
  13.         mIntent.setAction("android.tutor.action.VIEW");  
  14.         startActivity(mIntent);       
  15.     }  
  16. }  
  1. package com.tutor.demo2;  
  2. import com.tutor.demo2.R;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. public class Demo2 extends Activity {  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.         //访问应用demo里的ViewActivity  
  12.         Intent mIntent = new Intent();  
  13.         mIntent.setAction("android.tutor.action.VIEW");  
  14.         startActivity(mIntent);       
  15.     }  
  16. }  

在Demo2工程里的AndroidMainifest.xml中申请权限,不加权限程序会报错,代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.tutor.demo2"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".Demo2"  
  8.                   android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.intent.action.MAIN" />  
  11.                 <category android:name="android.intent.category.LAUNCHER" />  
  12.             </intent-filter>  
  13.         </activity>  
  14.     </application>  
  15.      <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  
  16. </manifest>  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.tutor.demo2"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".Demo2"  
  8.                   android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.intent.action.MAIN" />  
  11.                 <category android:name="android.intent.category.LAUNCHER" />  
  12.             </intent-filter>  
  13.         </activity>  
  14.     </application>  
  15.      <uses-permission android:name="com.tutor.permission.VIEW"></uses-permission>  
  16. </manifest>  

运行之效果如下图所示:

 

一样的效果,呵呵,ok,今天就先讲到这里。

原文:http://blog.csdn.net/Android_Tutor/archive/2011/04/08/6310418.aspx


总结:在同一个app中,可以直接调用需要权限的activity,在android4.4中测试的,不知道其它版本是否也这样。在一个应用的主activity中,不应该设置权限,因为如果设置了权限,则launcher不能启动该activity。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值