应用权限概述(未完成!)

许可的目的是保护Android用户的隐私。Android应用必须请求权限去访问用户敏感数据(例如联系人和短信),以及某些系统功能(如相机和互联网)。根据功能,系统可能会自动授予权限,或者可能会提示用户批准请求。

 Android安全体系结构的核心设计点是,默认情况下,任何应用程序都无权执行任何会对其他应用程序,操作系统或用户产生负面影响的操作。这包括读取或写入用户的私人数据(如联系人或电子邮件),读取或写入其他应用程序的文件,执行网络访问,保持设备唤醒等等。

此页面概述了Android权限的工作方式,包括:如何向用户显示权限,安装时和运行时权限请求之间的区别,权限的实施方式以及权限和其组的类别。

如果您只想获取如何使用应用程序权限的操作指南,请参阅请求应用程序权限。

权限批准

应用程序必须通过在应用清单中包含有<uses-permission>标记来公布其所需的权限。 例如,需要发送SMS消息的应用程序将在清单中包含以下行:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.SEND_SMS"/>

    <application ...>
        ...
    </application>
</manifest>

 如果您的应用在其清单中列出了正常权限(即,不会对用户的隐私或设备操作造成太大风险的权限),系统会自动将这些权限授予您的应用。如果您的应用在其清单中列出了危险权限(即可能影响用户隐私或设备正常运行的权限),例如上面的SEND_SMS权限,则用户必须明确同意授予这些权限。

有关普通和危险权限的详细信息,请参阅保护级别。

请求危险权限的提示

只有危险权限才需要用户同意。 Android要求用户授予危险权限的方式取决于用户设备上运行的Android版本以及应用所针对的系统版本。

运行时请求(Android 6.0及更高版本)

如果设备运行的是Android 6.0(API级别23)或更高版本,且应用程序的targetSdkVersion为23或更高,则在安装时不会通知用户任何应用程序权限。 您的应用必须要求用户在运行时授予危险权限。 当您的应用请求权限时,用户会看到系统对话框(如图1左侧所示),告诉用户您的应用尝试访问哪个权限组。 该对话框包括拒绝和允许按钮。

如果用户拒绝权限请求,则下次应用请求权限时,该对话框包含一个复选框,选中该复选框后,表示不希望再次提示用户获得权限(参见图1,右)。

图1.初始权限对话框(左)和次要权限请求以及关闭进一步请求的选项(右)

如果用户选中“永不再询问”框并点击“拒绝”,如果以后尝试请求相同的权限系统则不再提示用户。

即使用户授予您的应用程序所请求的权限,您也不能始终持有它。 用户还可以选择在系统设置中逐个启用和禁用权限。 您应该始终在运行时检查并请求权限以防止运行时错误(SecurityException)。

有关如何处理运行时权限请求的详细信息,请参阅请求应用程序权限。

安装时请求(Android 5.1.1及更低版本)

如果设备运行Android 5.1.1(API级别22)或更低版本,或者应用程序的targetSdkVersion为22或更低,在任何版本的Android上运行时,系统都会自动要求用户在安装时为您的应用授予所有危险权限 -  时间(见图2)。

 

图2.安装时权限对话框

如果用户单击“接受”,则会授予应用程序请求的所有权限。 如果用户拒绝权限请求,系统将取消应用程序的安装。

如果应用更新包含对其他权限的需求,则会在更新应用之前提示用户接受这些新权限。

关于推荐用户熟悉请求权限模式的概述,请参阅应用程序权限最佳实践。

可选硬件功能的权限

访问某些硬件功能(如蓝牙或相机)需要应用程序权限。 但是,并非所有Android设备都具有这些硬件功能。 因此,如果您的应用请求CAMERA权限,那么您还需要在清单中包含<uses-feature>标记来声明是否确实需要此功能。 例如:

<uses-feature android:name="android.hardware.camera" android:required="false" />

 如果您为该功能声明了android:required =“false”,那么Google Play允许您的应用安装在没有此功能的设备上。 然后,您必须在运行时通过调用PackageManager.hasSystemFeature()检查当前设备是否具有该功能,并在该功能不可用时正常禁用该功能。

如果您未提供<uses-feature>标记,那么当Google Play看到您的应用请求相应的权限时,它会认为您的应用需要此功能。 因此,它会从没有该功能的设备中过滤您的应用,就像您在<uses-feature>标记中声明了android:required =“true”一样。

有关详细信息,请参阅Google Play和基于功能的过滤

权限执行

权限不仅仅用于请求系统功能。 应用程序提供的服务可以强制执行自定义权限,以限制谁可以使用它们。 有关声明自定义权限的详细信息,请参阅定义自定义应用程序权限。

Activity权限的使用

清单中android:permission属性带有<activity>标记的权限的运用限制了谁可以启动该Activity。 在Context.startActivity()和Activity.startActivityForResult()的时候检查权限。 如果调用者没有所需的权限,则会从调用中抛出SecurityException。

Service权限的使用

清单中android:permission属性带有<service>标记的权限的运用限制了谁可以启动或绑定该Service。 在Context.startService(),Context.stopService()和Context.bindService()的时候检查权限。如果调用者没有所需的权限,则会从调用中抛出SecurityException。

Broadcast 权限的使用

android:permission属性带有<receiver>标记的权限的运用限制了谁可以向关联的BroadcastReceiver发送广播。因为系统尝试将提交的广播传递给特定的接收者,所以在Context.sendBroadcast()返回后检查权限。 因此,权限失败不会导致异常被抛回调用者; 它只是没有传递意图。

同样的,可以向Context.registerReceiver()提供权限谁给动态注册的接收者发送广播。 另一方面,在调用Context.sendBroadcast()时可以提供权限以限制允许哪些广播接收器接收广播。

注意,接收方和广播都需要权限。 发生这种情况时,必须通过两个权限检查才能将意图传递给关联目标。 有关更多信息,请参阅限制具有权限的广播。

 Content Provider权限的使用

android:permission属性带有<provider>标记的权限的运用限制了谁可以访问ContentProvider中的数据。 (Content providers有一个重要的额外安全设施,称为URI权限,下面将对此进行描述。)与其他组件不同,您可以设置两个单独的权限属性:android:readPermission限制谁可以从provider读取,以及android: writePermission限制谁可以写入它。请注意,如果provider 受读取和写入权限保护,则仅保留写入权限并不意味着您可以从provider读取。

首次检索provider以及在provider上执行操作时将检查权限(如果您没有任何权限,则抛出SecurityException), 使用ContentResolver.query()需要保持读取权限; 使用ContentResolver.insert(),ContentResolver.update(),ContentResolver.delete()需要写入权限。 在这些情况下,未保留所需的权限会导致从调用中抛出SecurityException。

URL权限

当与content providers一起使用时,系统描述的标准权限通常到目前为止是不够的。content provider可能希望通过读写权限来保护自己,而其直接访问者还需要将特定URI交给其他应用程序以供其操作。

一个典型的例子是电子邮件应用程序中的附件。 应该通过权限来保护对电子邮件的访问,因为这是敏感的用户数据。但是,如果向图像查看器提供图像附件的URI,则该图像查看器不再具有打开附件的权限,因为它没有理由拥有访问所有电子邮件的权限。

此问题的解决方案是per-URI权限:启动activity或将结果返回给activity时,调用者可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。这授予权限给接收的activity访问意图中特定的数据URL,不管在content provider中访问数据对应意图的任何权限

 

转载于:https://www.cnblogs.com/bky1225987336/p/10555173.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值