内容简介
在Android M版本发布之前,Android系统中的权限模式一直采取较为简单粗暴的处理方式——即在安装之时由用户作出全部允许或者全不允许的二元选择。这意味着如果用户希望使用某款应用程序,则首先需要接受其中包含的全部权限要求或者干脆放弃安装。这就导致很多开发人员的编程成果在安装之时就被用户所弃用,根本无法真正实现用户与开发者间的信任关系乃至其它隐私保障手段。
而在新的权限模式之下,用户将能够根据自己的实际需要在运行时中对各项权限进行审核,且随时关闭其中的部分权限。在今天的文章中,我们将共同了解如何处理权限机制中出现在新型变更,并掌握它们给开发人员乃至用户使用体验带来的实际影响。
值得强调的是,这篇文章是在Android M正式版本发布之前所写成,因此其中一部分信息可能在未来出现变动。
1. 哪些部分要求对应权限?
尽管Android M仍然要求开发者在AndroidManifest.xml当中进行权限声明,但用户现在已经能够在运行时当中对应用所使用的权限进行审核或者撤销。在这套Android新版本当中,最重要的变动就是android.permission.INTERNET与android.permission.WRITE_EXTERNAL_STORAGE已经从危险评级恢复到了普通等级。这意味着我们用不着再使用之前针对这二者向用户提出申请。
在发出权限审核请求时,用户将需要根据权限组对其提供授权,而非对组内的各单独权限作出审核。这意味着如果我们的应用程序需要同时发送及收取短信消息,那么用户只需要批准短信权限组即可。下面这份列表为Android M开发者预览版2当中能够从系统设置中直接查看到的各受支持权限组。
另外需要注意的是,Android是一套强大的Intent系统,它允许开发人员获取来自其它应用程序的数据。相较于申请摄像头使用权限并开发出一款能够使用Camera API的应用,大家现在可以要求用户利用现有受信拍照应用拍摄一幅图像,从而帮助自己的应用程序获取所需之图像素材。这些与摄像头相关的权限将由拍照应用负责处理,而非应用程序本身。
2. 如何要求获取权限?
当大家需要使用某项要求权限审核机制的功能时,系统会执行一系列事件流程。我们首先需要查看该权限是否已经为用户所允许。
如果用户此前尚未批准这项权限,那么大家可以通过权限请求对话框的形式向用户作出提示。在***弹出权限请求对话框时,用户需要在拒绝与接受二者之间作出选择。
不过如果用户此前已经拒绝了相关权限的请求,并再次面对同样的请求,这时他们将看到额外的选项——即永远停止显示此类权限请求询问。
大家可以在请求某项权限之前通过调用checkSelfPermission来检查用户此前是否已经通过了该权限授权。这项方法会根据权限是否得到批准而返回一个int值。
如果返回结果为PackageManager.PERMISSION_GRANTED,那么大家可以继续根据既定设计思路推进。不过如果该权限此前尚未得到批准,那么我们需要利用requestPermissions向用户发出请求,利用一个权限字符串数组进行传递,并利用一段自定义int请求代码对应用的逻辑流程进行追踪。
- int hasLocationPermission = checkSelfPermission( Manifest.permission.ACCESS_FINE_LOCATION );
- int hasSMSPermission = checkSelfPermission( Manifest.permission.SEND_SMS );
- List<String> permissions = new ArrayList<String>();
- if( hasLocationPermission != PackageManager.PERMISSION_GRANTED ) {
- permissions.add( Manifest.permission.ACCESS_FINE_LOCATION );
- }
- if( hasSMSPermission != PackageManager.PERMISSION_GRANTED ) {
- permissions.add( Manifest.permission.SEND_SMS );
- }
- if( !permissions.isEmpty() ) {
- requestPermissions( permissions.toArray( new String[permissions.size()] ), REQUEST_CODE_SOME_FEATURES_PERMISSIONS );
- }
在requestPermissions被调用之后,用户则会看到一个对话框,其中包含应用程序所需权限项目之权限组提示。这是请求必需权限的***实践方式,现在大家***不要在应用***启动时一次性要求用户接受全部对应权限。
当用户点选了对话框中的选项之后,我们接下来要调用onRequestPermissionsResult并在Activity当中进行访问。通过这种方式,我们的应用程序将能够在用户拒绝了一项或者多项权限请求之后继续运行剩余部分功能。
以下代码显示了我们该如何在某项权限被批准或者拒***对结果进行查询。如果用户拒绝了我们提出的必要权限申请,大家应当禁用对应的功能并允许用户了解其为何无法在应用程序当中正常生效。
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- switch ( requestCode ) {
- case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: {
- for( int i = 0; i < permissions.length; i++ ) {
- if( grantResults[i] == PackageManager.PERMISSION_GRANTED ) {
- Log.d( "Permissions", "Permission Granted: " + permissions[i] );
- } else if( grantResults[i] == PackageManager.PERMISSION_DENIED ) {
- Log.d( "Permissions", "Permission Denied: " + permissions[i] );
- }
- }
- }
- break;
- default: {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- }
- }
- }
3. Android M当中的遗留应用
尽管针对Android M开发而成的应用程序必须采用新型权限对话框与相关实现方法,但面向早期Android版本构建的应用仍然会在安装时直接向用户显示权限列表并要求一次性接受或拒绝。不过在Android M当中,用户完全可以在作出选择之后随时对相关权限进行调用。
由于负责处理权限调用任务的底层结构并不适用于面向早期Android版本的应用程序,所以当相关权限未被接受时,任何要求配合相关权限的功能都会返回null、0或者空值。这有可能导致应用程序出现意料之外的行为,因此建议各位开发人员对自己的原有应用程序进行升级,以确保其尽早支持Android M中的全新权限模式。
总结陈词
在今天的文章中,大家已经了解了新型Android M权限模式以及如何在自己的应用程序当中为其提供支持。我们还探讨了如何调整针对早期版本系统开发的应用程序,以确保其能够与Android新版本顺畅协作。利用这些信息,大家应该能够保证自己的应用程序做好迎接Android下一代重要版本更新的各项准备。