Android应用程序可以自定义属于自己的权限或者属于开发者使用的同一个签名的权限。自定义权限的步骤如下:
一、在AndroidManifest文件中,添加一个permission标签:
<permission
android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
android:name :权限的唯一标识,一般使用包名+权限名;
android:permissionGroup: 权限所属权限组的名称;
android:protectionLevel: 权限的等级:
normal 是最低的等级,声明此权限的app,系统会默认授予此权限,不会提示用户;
dangerous 权限对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户;
signature 权限表明的操作只针对使用同一个证书签名的app开放;
signatureOrSystem 与signature类似,只是增加了rom中自带的app的声明。
android:name 属性是必须的,其他的可选,未写的系统会指定默认值。
二、具体使用范例:
1. 创建一个工程CustomPermission,新建两个活动,主活动对应的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OneProject"
android:textSize="12pt"
android:gravity="center"
android:layout_centerInParent="true" />
<Button
android:id="@+id/intent_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent"
android:textSize="10pt"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
2. 第二个活动对应的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加权限才能看到我!!!"
android:layout_gravity="center_vertical"
android:gravity="center"
android:textSize="12pt"/>
</LinearLayout>
3. 在配置文件中自定义权限,并对第二个活动添加权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.custompermission">
<permission
android:name="com.example.custompermission.get2view"
android:protectionLevel="signature"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.CustomPermission">
<activity
android:name=".MainActivity2"
android:permission="com.example.custompermission.get2view"
android:exported="true">
<intent-filter>
<action android:name="com.example.custompermission.get2view" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
4. 主活动代码如下:
package com.example.custompermission;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.intent_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.example.custompermission.get2view");
startActivity(intent);
}
});
}
}
运行工程CustomPermission:在主活动点击INTENT按钮,跳转第二个活动可以正常跳转。
结论:对于同一个工程,活动之间进行跳转,即便不添加权限申请也可以。
5. 创建另一个工程UsePermission,主活动里放置一个按钮,用于跳转CustomPermission工程的第二个活动,对应布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TwoProject"
android:textSize="12pt"
android:gravity="center"
android:layout_centerInParent="true"/>
<Button
android:id="@+id/intent_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent"
android:textSize="10pt"
android:layout_alignParentRight="true"/>
</RelativeLayout>
6. 主活动代码如下:
package com.example.usepermission;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.intent_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("com.example.custompermission.get2view");
startActivity(intent);
}
});
}
}
(1)不在配置文件里申请访问CustomPermission工程的第二个活动的权限,点击跳转按钮Logcat窗口报错:
java.lang.SecurityException: Permission Denial: starting Intent
(2)在配置文件里申请访问权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.usepermission">
<uses-permission android:name="com.example.custompermission.get2view"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.UsePermission">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
运行程序,点击跳转按钮的效果如下: