android 理解和使用自定义权限

简介:

转自http://byandby.iteye.com/blog/1028034

里面有示例源代码下载


先扯几句别的

执行运行时安全性检查
    Android中的运行时安全性检查是在进程级别和操作级别上进行的。在进程级别,Android禁止一个应用程序直接访问另一个应用程序的数据。实现方法是,每个应用程序都在不同的进程中运行,使用唯一且固定的ID。在操作级别上,Android定义了一组受保护的功能和资源。要使用应用程序能够访问此信息,必须向  AndroidManifest.xml 文件添加一个或多个权限请求。也可以为应用程序定义自定义权限。

进程边界上的安全性
      在桌面环境中,大部分应用程序都使用相同的用户ID 运行,与此不同的是,Android应用程序通常使用自己的唯一ID运行。通过使用不同的ID 运行每个应用程序,Android围绕每个进程创建了一种隔离边界。这能够阻止一个应用程序直接访问另一个应用程序。
尽管每个进程都具有边界,但应用程序之间的数据共享显然也可以实现,但必须显示地进行共享。换句话说,要获得另一个应用程序的数据,必须借助该应用程序的组件。例如,可以查询另一应用程序的ContentProvider, 可以调用另一个应用程序中的活动,或者可以与另一个应用程序的服务通信。所有这些途径都提供了在应用程序之间共享信息的方法,但它们显式方式实现此目的,因为你不会访问基础数据库、文件等内容。

下面我们来 使用自定义权限
     Android支持为应用程序定义自定义权限。例如,如果希望阻止某些用户启动应用程序中的某个活动(也就是某个Activity),可以定义自定义权限来实现,要使用自定义权限,首先在AndroidManifest.xml 文件中声明它们。定义了权限之后,可以将它们作为组件定义的一部分进行引用。
     创建一个应用程序,其中包含一个不是所有人都允许启动的活动。要启动该活动,用户必须具有特定的权限,我们新建一个Android项目 输入 CustomPermission作为项目名称,输入 com.cust.perm最为包名称,输入 CustPermMainActivity作为活动名称 我们还得创建一个具有特殊权限才能访问的 Activity 名字是 PrivActivity,下面使我们的 PrivActivity类。
Java代码   收藏代码
  1. package com.cust.perm;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.ViewGroup.LayoutParams;  
  6. import android.widget.LinearLayout;  
  7. import android.widget.TextView;  
  8.   
  9. public class PrivActivity extends Activity {  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         LinearLayout view = new LinearLayout(this);  
  14.         view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,  
  15.                 LayoutParams.WRAP_CONTENT));  
  16.         view.setOrientation(LinearLayout.HORIZONTAL);  
  17.         TextView nameLbl = new TextView(this);  
  18.         nameLbl.setText("Hello from PrivActivity");  
  19.         view.addView(nameLbl);  
  20.         setContentView(view);  
  21.     }  
  22.   
  23. }  


      这是一个灰常正常的Activity,我们要展示的是如果使用权限保护此activity,然后我们从客户端调用它,如果调用成功 我们就会在屏幕上看到 我们定义的文本 “Hello from PrivActivity”  下面我们来给这个activity 创建权限,灰常简单了,找到我们的AndroidManifest.xml文件 点击Permissions 然后 Add  来张图。



    图一看大家就明白了 权限具有 名称、标签、图标、权限组、描述和保护级别 这些属性。
    这个就不都解释了,挑2个解释,大家可以去看看文档,虽然我也看不懂。
android:name  必须有   权限的名称。通常应该尊选Android的命名方案 (*.permission.*)
android:protectionLevel  必须有 定义权限的风险级别,必须是以下值之一:
notmal、 dangerous、signature、signatureOrSystem  normal表示权限是低风险的,不会对系统、用户或其他应用程序造成危害。

   现在已经有了自定义权限。接下来需要告诉系统,PrivActivity 活动应该仅由具有 syh.permission.STARTMYACTIVITY 权限的应用程序启动。要在活动上设置必需的权限,可以将 android:permission 特性添加到 AndroidManifest.xml中的活动定义中。为了能启动活动,还需要想activity 添加一个Intent过滤器,下面是我们的 AndroidManifest.xml文件。
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.cust.perm" android:versionCode="1"  
  4.     android:versionName="1.0">  
  5.     <application android:icon="@drawable/icon"  
  6.         android:label="@string/app_name">  
  7.         <activity android:name=".CustPermMainActivity"  
  8.             android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.intent.action.MAIN" />  
  11.                 <category  
  12.                     android:name="android.intent.category.LAUNCHER" />  
  13.             </intent-filter>  
  14.         </activity>  
  15.         <activity android:name="PrivActivity"  
  16.             android:permission="syh.permission.STARTMYACTIVITY">  
  17.             <intent-filter>  
  18.                 <action android:name="android.intent.action.MAIN" />  
  19.                 <category  
  20.                     android:name="android.intent.category.LAUNCHER" />  
  21.             </intent-filter>  
  22.         </activity>  
  23.     </application>  
  24.     <uses-sdk android:minSdkVersion="9" />  
  25.     <permission android:description="@string/startMyActivityDesc"  
  26.         android:label="Start My Activity"  
  27.         android:name="syh.permission.STARTMYACTIVITY"  
  28.         android:protectionLevel="normal">  
  29.     </permission>  
  30. </manifest>  


   我们的权限描述属性 android:description 引用了字符串资源 所以我们还得向 strings.xml添加一个字符串常量,如下:
Xml代码   收藏代码
  1. <string name="startMyActivityDesc">Allow starting my activity</string>  


  好了我们现在来编写客户端,我们将在客户端中 访问刚才我们定义的具有特殊权限才能访问的Activity。新建项目 ClientOfCustomPermission  我们定义了一个按钮,当我们点击按钮就会访问那个具有特殊权限才能访问的 activity,下面是我们客户端的布局文件。
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <Button  
  8.     android:id="@+id/btn"  
  9.     android:text="Lauch PrivActivity"  
  10.     android:layout_width="wrap_content"  
  11.     android:layout_height="wrap_content"  
  12.     />  
  13. </LinearLayout>  


运行效果





  下面来看看我们的 ClientCustPermMainActivity类, 也没有什么特别的 就是我们需要在客户端的 AndroidManifest.xml文件中声明我们的访问权限 如下。
Java代码   收藏代码
  1. package com.client.cust.perm;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class ClientCustPermMainActivity extends Activity {  
  11.   
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         Button btn = (Button) findViewById(R.id.btn);  
  17.         btn.setOnClickListener(new OnClickListener() {  
  18.             @Override  
  19.             public void onClick(View v) {  
  20.                 Intent intent = new Intent();  
  21.                 // 通过指定包名来启动我们想要启动的 Activity 注意第二个参数是完全限定包名  
  22.                 intent.setClassName("com.cust.perm",  
  23.                         "com.cust.perm.PrivActivity");  
  24.                 startActivity(intent);  
  25.             }  
  26.         });  
  27.     }  
  28. }  


      我们添加了 uses-permission 项来请求自定义权限,具有该权限才能启动在 CustomPermission 项目中实现的 PrivActivity,然后我们运行 客户端, 在这里 我要弱弱的提醒大家一下,由于我们是在 我们的客户端 去访问另外一个项目中的 具有特殊权限的activity,不是如访问服务 所以我们的另一个项目 也就是CustomPermission必须先运行,然后再运行我们的客户端,不然 是访问不了滴。

目录
相关文章
|
15天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
48 1
|
4月前
|
XML Android开发 数据安全/隐私保护
Android 自定义开源库 EasyView
Android 自定义开源库 EasyView
|
4月前
|
XML Java Android开发
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
40 1
|
7月前
|
API Android开发
Android 自定义最大宽度,高度, 宽高比例 Layout
Android 自定义最大宽度,高度, 宽高比例 Layout
|
4月前
|
XML 搜索推荐 Java
Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)
Android App开发之自定义图形中位图与图形互转、剪裁图形内部区域、给图形添加部件的讲解及实战(附源码 简单易懂)
33 0
|
4月前
|
XML 前端开发 Java
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
Android Studio App自定义控件中自定义视图的绘制讲解及实战(附源码 包括自定义绘制各种图形)
34 1
|
4月前
|
XML API Android开发
Android 自定义View 之 圆环进度条
Android 自定义View 之 圆环进度条
|
19天前
|
Android开发
Android 开发 pickerview 自定义选择器
Android 开发 pickerview 自定义选择器
10 0
|
7月前
|
XML Android开发 数据格式
自定义Android titleBar
自定义Android titleBar
26 0
|
8月前
|
Android开发
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
70 0