Android6.0过后,Android开始运行中请求用户的权限了,Android终于意识到权限的重要性了,但是这个时候已经太晚了,至少6.0的权限申请在国内来说只是一个摆设,很多程序如果不给予相应的或者不相关的权限,将会直接退出程序,这是一个非常差的体检,至少微信是这样的体检,你懂的

权限更新和App Store对权限的要求的审核

IOS 10.0已经增加了对数据使用的权限的动态申请

Android仍然只有对基本的硬年和存储的使用的申请,可以说IOS更加全面

IOS app store要求一个程序如果用户没有给予必要的权限,这个功能需要以其他的方式给予良好的体检,否则应用审核将不给以通过,apple 在审核上的一万让所有的程序不敢越过这一个坎

android app store却没有这样的审核要求和机制,至少在国内杂乱无比的各种app store下都没有对权限进行审核,所以国为的各种App都开始变的极其流虻的方式来处理权限,一是为为更好的控制用户的设备,二是减少开发时间和成本

如:新版的微信,在一开始启动的时候要求用户赋予各种权限,如果用户拒绝了其中的某一个权限后,微信将自动退出,用户无法使用微信的任何功能,真是流虻的世界到来了

update:2016.11.2

一个开源的权限库

https://github.com/googlesamples/easypermissions

6.0的权限的申请步骤

1、Mainfest申请程序所有将会用户的权限,如果不申请将会直接闪退

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

2. 在必要的地方动态申请权限

/**
 * 正常处理通迅录
 */
private void showContacts() {
    if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
                PERMISSIONS_REQUEST_READ_CONTACTS);
        
        //申请调用通迅录权限
        return;
    }

    //
    if (getLoaderManager().getLoader(CONTACTS_LOADER) == null) {
        getLoaderManager().initLoader(CONTACTS_LOADER, null, this);
    }
    mListView.setAdapter(mContactsAdapter);
}

/**
 * 正常处理日历
 */
private void showEvents() {
    if (checkSelfPermission(Manifest.permission.READ_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CALENDAR},
                PERMISSIONS_REQUEST_READ_CALENDAR);
        //申请调用日历申请权限
        return;
    }

    if (getLoaderManager().getLoader(EVENTS_LOADER) == null) {
        getLoaderManager().initLoader(EVENTS_LOADER, null, this);
    }
    mListView.setAdapter(mEventsAdapter);
}

/**
 * 处理所有权限
 */
private void requestAllPermissions() {
    List<String> permissions = new ArrayList<>();
    if (checkSelfPermission(Manifest.permission.READ_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.READ_CALENDAR);
    }
    if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
        permissions.add(Manifest.permission.READ_CONTACTS);
    }
    if (!permissions.isEmpty()) {
        requestPermissions(permissions.toArray(new String[0]),
                PERMISSIONS_REQUEST_ALL_PERMISSIONS);
    }
}

3. 在Activity中处理申请权限的回调

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[],
                                       int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_REQUEST_READ_CONTACTS: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                showContacts();
            }
        }
        break;

        case PERMISSIONS_REQUEST_READ_CALENDAR: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                showEvents();
            }
        }
        break;

        case PERMISSIONS_REQUEST_ALL_PERMISSIONS: {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    switch (permissions[i]) {
                        case Manifest.permission.READ_CALENDAR: {
                            Toast.makeText(this, "Granted Calendar!",
                                    Toast.LENGTH_SHORT).show();
                        }
                        break;

                        case Manifest.permission.READ_CONTACTS: {
                            showContacts();
                        }
                        break;
                    }
                }
            }
        }
        break;
    }
}


注意:最简单的权限处理当然可以像微信一样流虻: 在程序闪屏页面进行所有必要权限的申请,如果全部通过,将进入主程序,如果用户拒绝,将退出程序,具体直接参照requestAllPermissions()方法的使用