Android 6.0 权限申请
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()方法的使用