Android权限问题总结
Android 权限分为安装时权限、运行时权限和特殊权限。
安装时权限
安装时权限时是指在AndroidMainfest中申请的,安装后就会自动授予的权限。不需要主动申请。应用商店查看的应用详情中使用的权限一般显示的也是安装时权限。安装时权限又分为:普通权限(protectlevel:normal) 和 ==签名权限(protectlevel:signature)==两种。
- 普通权限:ACCESS_NETWORK_STATE 、ACCESS_WIFI_STATE 等。
- 签名权限:当应用声明了其他应用已定义的签名权限时,如果两个应用使用同一证书进行签名,系统会在安装时向前者授予该权限。否则,系统无法向前者授予该权限。
app互相调用
- 假如有APP A,其AndroidManifest的某个Activity launchActivity的 **android:exported = true **的时候就可以从另一个App B中调用打开launchActivity。
Intent intent = new Inetnt();
intent.SetClassName("包名","Activity名");
startActivity(intent);
- 这样会导致任意一个APP 都可以调用,引起安全问题。现在,我们想让只有某些APP才能调用打开。
-自定义Permission Android 可以自定义Permission,格式如下:
<permission
android:name="com.self.test"
android:protectionLevel="normal" />
- 在A app的Androidmainfest中声明了一个permission:com.self.test,保护级别设置为normal。在Activity的属性里设置android:permission。它表示申请了权限com.self.test的应用才能启动这个Activity。
<activity
android:name=".LaunchActivity"
android:permission="com.self.test"
android:exported="true" />
当在另一个app中没有申请权限com.self.test的时候,启动LaunchActivity会报错,1如下:
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.example.myapplication/.LaunchActivity } from ProcessRecord{2dd4083 13617:com.example.test/u0a148} (pid=13617, uid=10148) requires com.self.test
at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
at android.os.Parcel.createException(Parcel.java:2409)
当在B中申请了com.self.test 就可以正常启动A的LaunchActivity。
- 权限的保护级别
上面我们看到,我们在A中声明的自定义权限的保护级别是normal,这时候会有这样的问题: 1.当手机先安装B app的时候此时A还没有被安装,com.self.test 权限还没有被声明。后续如果继续安装A,在B中也无法获得com.self.test权限。因为B在申请com.self.test权限的时候,该权限还不存在,后续也不会继续申请。 2.当将com.self.test的保护级别设置为signature或者signatureorsystem的时候,****如果A和B具有相同的签名(所有的系统化应用都具有相同的签名),则无论安装顺序先后,能够正常取得权限。不具有相同的签名,无论安顺序先后都无法使用权限。 所以:: Android 权限保护级别为signature的,必须使用相同的签名,才能申请这个权限,不同的签名,根本申请不到。
运行时权限
运行时权限必须动态申请,protectLevel == dangerous。
特殊权限
特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限。此外,如果平台和 OEM 想要防止有人执行功能特别强大的操作(例如通过其他应用绘图),通常会定义特殊权限。 系统设置中的特殊应用访问权限页面包含一组用户可切换的操作。其中的许多操作都以特殊权限的形式实现。每项特殊权限都有自己的实现细节。如需查看使用每项特殊权限的说明。系统会为特殊权限分配“appop”保护级别。 如:
SMS_FINANCIAL_TRANSACTIONS
Added in API level 29
Deprecated in API level 31
public static final String SMS_FINANCIAL_TRANSACTIONS
This constant was deprecated in API level 31.
The API that used this permission is no longer functional.
Allows financial apps to read filtered sms messages. Protection level: signature|appop
Constant Value: "android.permission.SMS_FINANCIAL_TRANSACTIONS"
应用权限的请求示范可以查看Android官网:https://developer.android.google.cn/training/permissions/requesting
|