Android权限问题

Android权限问题总结

Android 权限分为安装时权限运行时权限特殊权限

安装时权限

安装时权限时是指在AndroidMainfest中申请的,安装后就会自动授予的权限。不需要主动申请。应用商店查看的应用详情中使用的权限一般显示的也是安装时权限。安装时权限又分为:普通权限(protectlevel:normal) 和 ==签名权限(protectlevel:signature)==两种。

  • 普通权限:ACCESS_NETWORK_STATEACCESS_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,格式如下:

  • 在A app的Androidmainfest中声明了一个permission:com.self.test,保护级别设置为normal。在Activity的属性里设置android:permission。它表示申请了权限com.self.test的应用才能启动这个Activity。

当在另一个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

你可能感兴趣的:(Android,android,java)