`

android6.0新特性之权限管理

阅读更多

现状:

1、当代码编译版本都是 5.0及其以下(API23以下),在Manifest注册了权限。

    运行在6.0以下手机没有问题,用户只能在安装的时候选择同意权限,不能修改(不考虑第三方安全软件设置的因素)
    运行在6.0及其以上,对于敏感权限用户可以在设置中修改(不需要第三方软件),修改时系统会提示用户“可能会导致无法正常运行”,但还可以修改成功。一旦修改了在API23以下是没有办法在程序内部通过API的方法打开权限。对于非敏感权限安装后无法修改。
 

2、当代码编译版本都是 6.0及其以上(API23及其以上),在Manifest注册了权限。

    运行在6.0以下手机没有问题,用户只能在安装的时候选择同意权限,不能修改(不考虑第三方安全软件设置的因素)运行在6.0及其以上对于敏感权限安装后即可获取该权限,也无法修改。对于敏感权限安装后默认是没有权限的。程序内部可以判断、提示用户赋予这些权限。
 
Android6.0与权限相关的API
//检查是否已赋予某个权限,返回PackageManager.PERMISSION_GRANTED或PERMISSION_DENIED
ContextCompat.checkSelfPermission()
//向用户请求赋予某个(某些)权限
ActivityCompat.requestPermissions()
//向用户请求赋予权限的结果
OnRequestPermissionsResultCallback()
//Google提供的一个人性化的方法,表示是否向用户解释一下权限
ActivityCompat.shouldShowRequestPermissionRationale()
 
Fragment类似

FragmentCompat.requestPermissions()
OnRequestPermissionsResultCallback()
FragmentCompat.shouldShowRequestPermissionRationale()
 
示例:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        readExtStorageDir();
    }

    /**
     * 读取外部SD卡目录
     */
    private void readExtStorageDir() {
        int permissionResult = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (PackageManager.PERMISSION_GRANTED == permissionResult) {//已有权限
            doReadExtStorageDir();
        } else {//没有权限向用户索取权限
            final String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
            ActivityCompat.requestPermissions(MainActivity.this, permissions, 100);
        }
    }

    /**
     * 索取权限的结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (100 == requestCode) {
            if (null != permissions) {
//是读取外部SD卡的权限&已赋予权限
                if (Manifest.permission.READ_EXTERNAL_STORAGE.equals(permissions[0]) && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
                    doReadExtStorageDir();
                }
            }
        }
    }

    private void doReadExtStorageDir() {
        File storageDir = Environment.getExternalStorageDirectory();
        File[] files = storageDir.listFiles();
        if (null != files && files.length > 0) {
            for (File f : files) {
                Log.e("P", "==>" + f.getName());
            }
        }
    }

}
 
个性化提示:
   当用户拒绝后,但又没有点不再提示,那么这个时候是否给用户一个对权限要求的说明呢?这个时候就用到shouldShowRequestPermissionRationale方法
shouldShowRequestPermissionRationale()的理解:
如果之前请求过并被用户拒绝,那么它会返回 true,如果之前用户已经勾选了不再提示的选项,它会返回 false,同样当设备策略禁止应用拥有这条权限时也会返回 false。第一次请求这个权限也返回false。那么我们需要做的,就是在用户确切需要拒绝这个权限请求前向他解释我们为什么需要,否则当彻底拒绝后(用户在拒绝的时候勾选了不再提示也返回false,但执行requestPermissions()方法不会显示请求权限框),除非用户手动去设置中开启,我们都无法再得到权限了。
/**
 * 读取外部SD卡目录
*/
private void readExtStorageDir() {
    int permissionResult = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
    if (PackageManager.PERMISSION_GRANTED == permissionResult) {
        doReadExtStorageDir();
    } else {
        final String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};

        boolean shouldShowRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE);
        Log.e("P", "shouldShowRequestPermission==" + shouldShowRequestPermission);
        if (shouldShowRequestPermission) {
            showMessageOKCancel("向用户解释权限,请用户点击允许!", new DialogInterface.OnClickListener() {

                @Override
public void onClick(DialogInterface dialogInterface, int i) {
                    ActivityCompat.requestPermissions(MainActivity.this, permissions, 100);
                }
            });
            return;
        }
        ActivityCompat.requestPermissions(MainActivity.this, permissions, 100);

    }
}
一次请求多个权限:
//定义请求多个权限的名称    
String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
//向用户请求赋予权限
ActivityCompat.requestPermissions(MainActivity.this,permissions,100);

//回调结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    Log.e("P", requestCode + " " + permissions[0] + " " + grantResults[0]);
    if (100 == requestCode) {
        if (null != permissions) {
            for (int i = 0; i < permissions.length; i++) {
                Log.e("P", permissions[i] + " ===> " + grantResults[i]);
                if (Manifest.permission.READ_EXTERNAL_STORAGE.equals(permissions[i])) {
                    if (PackageManager.PERMISSION_GRANTED == grantResults[i]) {
                        doReadExtStorageDir();
                    }
                }
            }
        }
    }
}
  
 
权限组 
 ActivityCompat.requestPermissions()不能传权限组名称,只能传权限名称,同一组的任何一个权限被授权了,其他权限也自动被授权。
敏感权限列表
权限组 权限
android.permission-group.CALENDAR(日历数据)
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA(相机)
  • android.permission.CAMERA
android.permission-group.CONTACTS(联系人)
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.GET_ACCOUNTS
android.permission-group.LOCATION(位置)
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE(麦克风)
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE(电话)
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS(传感器)
  • android.permission.BODY_SENSORS
android.permission-group.SMS(短信)
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE(存储)
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE
 
  • 大小: 47.2 KB
  • 大小: 53.2 KB
  • 大小: 44.8 KB
分享到:
评论

相关推荐

    Android-android6.0权限管理

    Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样,一方面让用户更加容易的控制自己的隐私,一方面需要重新适配应用权限.

    Android6.0API中文手册CHM版

    1. **权限管理系统**:在Android 6.0中,权限管理进行了重大改革,引入了运行时权限模型。应用不再在安装时获得所有请求的权限,而是需要在运行时向用户请求权限,用户可以选择授予或拒绝。这对开发者来说意味着需要...

    android 6.0 sdk 官方编程范例

    总的来说,Android 6.0 SDK的官方编程范例覆盖了从权限管理到电源优化,再到新图形API和跨平台开发的多个方面,旨在帮助开发者充分利用这一版本的新特性,打造更优质、更安全、更高效的Android应用。通过深入学习和...

    Android 6.0源码(Marshmallow)

    通过对Android 6.0源码的分析,开发者可以深入理解系统的工作原理,优化应用程序的性能,以及更好地利用新特性和API。源码学习不仅是技术提升的过程,也是对系统底层机制的探索,对于任何希望在Android平台上做出...

    android 6.0 sdk源码

    API Level 23对应的是Android 6.0(Marshmallow)版本,这个版本引入了许多新特性和改进,包括权限管理的革新、Doze模式以提升电池寿命、App Links以增强应用间的链接导航等。 1. 权限管理:在Android 6.0中,系统...

    Android6.0 Api Demos

    在Android 6.0中,权限管理有了重大变化,引入了运行时权限的概念。开发者需要在应用运行时请求敏感权限,而不是在安装时一次性获取。API Demos中会有相关的例子展示如何在运行时动态请求权限,如访问联系人、存储...

    Android 6.0运行时权限Demo

    本Demo是针对Android 6.0运行时权限的一个实例,帮助开发者理解并实践这一新特性。 在Android 5.1及更早版本中,应用在安装时会一次性获取所有所需权限,用户在安装时只能接受或拒绝整个应用。然而,Android 6.0...

    安卓6.0开发 SDK android6.0 android-23 下载

    1. **权限管理**:Android 6.0引入了运行时权限模型,用户可以在安装应用后对个别敏感权限进行授权或拒绝,而不再是在安装时一次性全部同意。 2. **Doze模式**:这是一个电池优化功能,当设备闲置时,系统会进入...

    Android6.0的SDK的API接口

    1. **权限管理系统**:Android 6.0引入了运行时权限的概念,应用在运行时可以请求用户授予敏感权限,如读取联系人、位置信息等,而不是在安装时一次性获取所有权限。这提高了用户的隐私控制能力。 2. **Doze模式**...

    安卓6.0 sdk-23版本Android sdk

    通过`build.gradle`文件配置编译Sdk版本和目标Sdk版本,确保应用能够正确处理Android 6.0的新特性和权限请求。 总结,Android 6.0 SDK-23版本为开发者提供了更强大且安全的开发环境,尤其是运行时权限管理和Doze...

    Android6.0权限问题解决

    ### Android 6.0 权限管理解决方案 随着Android系统的不断升级和完善,用户隐私保护成为了开发者必须关注的重点。从Android 6.0(API级别23)开始,Android引入了一种新的权限模型,允许用户在应用运行时动态地授予或...

    android6.0 api23 sdk下载

    Android 6.0,代号Marshmallow,是Google在2015年发布的一...通过以上介绍,我们可以看到Android 6.0 API 23在系统权限、电池管理、安全性和用户体验等方面的重大改进,对于开发者来说,了解并掌握这些新特性至关重要。

    Android6.0 Settings添加以太网选项

    需要注意的是,由于Android系统的开源特性,不同设备厂商可能会有自己的定制系统,因此在不同设备上实现以太网连接可能还需要考虑特定厂商的修改和权限问题。此外,对于非开发人员来说,直接修改系统源码并编译系统...

    android6.0 开发例程

    Android 6.0(代号Marshmallow)是Google在2015年发布的Android操作系统版本之一,它引入了许多重要的新特性,这些新特性不仅为用户提供了更好的体验,也为开发者带来了新的挑战和机遇。下面我们将详细介绍与Android...

    Android SDK 6.0, 适用于API Level 23.7z

    API 23对应于Android 6.0 Marshmallow,发布于2015年,引入了许多新特性,如运行时权限管理、Doze模式、App Links等。 2. **运行时权限**:在Android 6.0中,应用程序的权限模型发生了变化。以前,用户在安装应用时...

    android 6.0源码 package包

    Android 6.0,代号Marshmallow,是Google发布的一个重要版本,引入了许多新特性和性能优化。在这个“android 6.0源码 package包”中,我们主要关注的是与应用程序和系统组件相关的源代码。 首先,Android源码中的`...

    关于Android6.0之后动态获取权限问题(参考其他博客)

    在编写代码时,我们需要充分理解和正确应用这些新特性,确保应用在各种Android版本上都能正常运行并尊重用户的权限选择。通过实践和学习,我们可以掌握动态权限获取的技巧,提高应用的用户体验。在项目...

    Android6.0动态权限申请

    动态权限申请是Android 6.0的核心特性之一,它主要涉及到以下几个方面: 1. **敏感权限**:Android定义了一些敏感权限,如访问联系人、位置信息、摄像头等。这些权限在Android 6.0及更高版本中需要在运行时请求。 ...

    Android6.0

    在Android系统的发展历程中,Android 6.0(Marshmallow)是一个重要的里程碑,它引入了许多新特性和改进,尤其是在权限管理方面。这个压缩包文件包含了与Android 6.0权限管理和封装相关的资源,包括`android6.0权限...

    Android 海康最新Android 6.0 demo

    Android 6.0引入了多项新特性,如运行时权限管理、Doze模式以提高电池续航、App Links以增强应用间链接的处理、以及对指纹识别的支持等。这些特性都可能在海康监控的demo中有所体现,比如安全访问权限的管理,可能...

Global site tag (gtag.js) - Google Analytics