zoukankan      html  css  js  c++  java
  • Android自定义权限和使用权限

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


    自定义权限,主要用于保护被赋予权限的组件。如无权限与有权限,正如public与private的对类保护的区别


    执行运行时安全性检查 

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


    进程边界上的安全性 

          在桌面环境中,大部分应用程序都使用相同的用户ID 运行,与此不同的是,Android应用程序通常使用自己的唯一ID运行。通过使用不同的ID 运行每个应用程序,Android围绕每个进程创建了一种隔离边界。这能够阻止一个应用程序直接访问另一个应用程序。 

    尽管每个进程都具有边界,但应用程序之间的数据共享显然也可以实现,但必须显示地进行共享。换句话说,要获得另一个应用程序的数据,必须借助该应用程序的组件。例如,可以查询另一应用程序的ContentProvider, 可以调用另一个应用程序中的活动,或者可以与另一个应用程序的服务通信。所有这些途径都提供了在应用程序之间共享信息的方法,但它们显式方式实现此目的,因为你不会访问基础数据库、文件等内容。 


    下面我们来 使用自定义权限 

         Android支持为应用程序定义自定义权限。例如,如果希望阻止某些用户启动应用程序中的某个活动(也就是某个Activity),可以定义自定义权限来实现,要使用自定义权限,首先在AndroidManifest.xml 文件中声明它们。定义了权限之后,可以将它们作为组件定义的一部分进行引用。 

    首先创建一个工程DefinePermission

    修改MainActivity当前类,添加

    	Toast.makeText(this, "欢迎来到步步高的世界!", Toast.LENGTH_LONG).show();
    修改AndroidManifest.xml文件
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lzx.definepermission"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
        <permission
            android:name="com.lzx.permission.test"
            android:label="@string/app_name"
            android:permissionGroup="@string/hello_world"
            android:protectionLevel="normal" >
        </permission>
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/title_activity_main"
                android:permission="com.lzx.permission.test" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>


    1、自定义权限

    声明的含义如下;

    android:label:权限名字,显示给用户的,值可是一个 string 数据,例如这里的“自定义权限”。

    android:description:比 label 更长的对权限的描述。值是通过 resource 文件中获取的,不能直接写 string 值,例如这里的”@string/test”。

    android:name:权限名字,如果其他 app 引用该权限需要填写这个名字。

    android:protectionLevel:权限级别,分为 4 个级别:

      • normal:低风险权限,在安装的时候,系统会自动授予权限给 application。
      • dangerous:高风险权限,系统不会自动授予权限给 app,在用到的时候,会给用户提示。
      • signature:签名权限,在其他 app 引用声明的权限的时候,需要保证两个 app 的签名一致。这样系统就会自动授予权限给第三方 app,而不提示给用户。
      • signatureOrSystem:这个权限是引用该权限的 app 需要有和系统同样的签名才能授予的权限,一般不推荐使用。
      2、为MainActivity加入启动权限:android:permission="com.lzx.permission.test"


    再建一个Client工程
    修改xml添加一个button按钮
    修改MainActivity添加button点击事件
    		((Button) findViewById(R.id.button1))
    				.setOnClickListener(new View.OnClickListener() {
    					public void onClick(View v) {
    						Intent intent = new Intent();
    						intent.setClassName("com.lzx.definepermission",
    								"com.lzx.definepermission.MainActivity");
    						startActivity(intent);
    					}
    				});


    修改AndroidManifest.xml文件
    <manifest 
    
    xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lzx.client"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-permission android:name="com.lzx.permission.test" 
    
    />
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.lzx.client.MainActivity"
                android:label="@string/title_activity_main">
                <intent-filter>
                    <action 
    
    android:name="android.intent.action.MAIN" />
                    <category 
    
    android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>


    添加使用权限use-permission,使用刚才定义的permission
    同时注意,给当前Activity也要加上访问权限
    可能遇见问题:
    1、secure问题,那是要启动加权限的Acitvity,当前启动者也要加上相关权限
    2、Activity找不到,第一要先安装DefinePermission项目,第二要看你启动Activity的包是否写的正确。

    另外关于权限,再讲个小知识,Android控件中会包含这样一条android:exported=true,表示此控件能被所在Application之外的其他Application所捕捉到,默认为false,不能捕捉到,即不能访问。

  • 相关阅读:
    ubuntu 软件包(package)更换源(source)为阿里云镜像 update&upgrade
    【转载】 ftp 命令行
    阿里云服务器开启端口
    [转载] login shell和non-login shell
    python中global变量释疑
    python 用abc模块构建抽象基类Abstract Base Classes
    【转载】python 特殊函数 dunder function
    tensorflow2.0——波士顿房价数据与多个特征的关系(多元函数的预测)
    tensorflow2.0——波士顿房价数据与房间数关系的预测
    tensorflow2.0——自动求导GradientTape
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147383.html
Copyright © 2011-2022 走看看