时隔多年以后,我们都胖了。(其实也老了。)
在github上面找demo,发现都是集成比较困难,还携带各种lib。表示有点难看懂。
我下载下来测试后,发现这个库在显示方面还没发现问题(在我的红米Note4x上面该弹的窗都弹了),
也是star的最高的一个项目:PermissionsDispatcher:https://github.com/hotchemi/PermissionsDispatcher
但是,有些看不懂的。所以就放弃了。后来选择了一个朋友发的简单的demo。稍微修改了下,能用。下面讲正文
1.需要动态申请的权限
需要弹窗申请的权限组:
CALENDAR日历
CAMERA 相机
CONTACTS 联系人
LOCATION 定位
MICROPHONE 麦克相关,比如录音
PHONE 手机状态
SENSORS 传感器
SMS 短信
STORAGE 存储权限
权限分组详情:
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
2.普通权限,只需在AndroidManifest.xml中申请即可
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
1.当你的targetSdkVersion>=23以后就需要做动态授权处理了。不然打开相机界面将是一片黑。如果你不想做这个功能,那你把你的targetSdkVersion设置为<23即可。
2.授权流程:首先检查你的权限是否在系统中存在,然后检查你的权限是否设置为允许,第一次申请授权的弹窗是系统的,第二次就需要我们自己来设置了。不然是没有提示的。
相信很多人用的是:ActivityCompat.checkSelfPermission(activity, perm)。 因为我在用我的手机测试的时候(红米Note4X),这句代码的是有问题的。
下面以启动第一个界面获取是否是第一次启动来做测试,判断是不是第一次启动需要申请读取本地缓存的flag来判断。所以要用到READ_PHONE_STATE 权限。
1.获取手机信息权限没有允许 2.启动APP,出现授权弹窗
3.拒绝后给出提示,并退出app 4.下一次启动APP时,再次弹窗。这时候的弹窗就是自己设置的了。(如果不处理,是没有提示的)
5.根据弹窗打开设置,找到APP开启权限 6.这时候在设置里面设置的权限在你的activity里面是没有监听的。我是在 onresume里面处理的
代码重点部分:
1.在授权管理里面加入了权限是否是第一次缓存,这样处理的目的是,如果是第一次申请,则交由系统处理,这时候是弹系统的弹窗。下一次的时候,是弹出自定义的窗口。
boolean request = PermissionsHelper.isRequest(sb.toString());
if (!request) {
PermissionsHelper.put(sb.toString(), true);
ActivityCompat.requestPermissions(activity, permsToRequest, 1);
} else {
for (String permission : permsToRequest) {
if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_DENIED) {
showMissingPermissionDialog(activity, permission);
}
}
}
2.为了达到在系统授权界面授权成功后达到操作一致性。在onresume里面出二次检测处理。(比如,在启动页面授权通过后,我就去读取信息是否是第一次启动该APP和token是否存在,来决定跳往哪个界面)
@Override
protected void onResume() {
super.onResume();
if (isSetting) {
PermissionsManager.getInstance().requestPermissionsIfNecessaryForResult(AppStart.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionsResultAction() {
@Override
public void onGranted() {
boolean hasActivated = ActivateHelper.hasActivated();
if (hasActivated) {
if (StringUtil.isNotEmpty(TokenHelper.get())) {
startActivity(MainActivity.newIndexIntent(mContext));
} else {
startActivity(LoginActivity.newIndexIntent(mContext));
}
} else {
startActivity(ActivateActivity.newIndexIntent(mContext));
}
AppActivityManager.getInstance().finishActivity(AppStart.this);
}
@Override
public void onDenied(String permission) {
Toast.makeText(mContext, "您拒绝了存储权限,“捷账宝”将无法正常运行,请到手机设置中的应用管理找到“捷账宝”后手动开启相关权限,谢谢", Toast.LENGTH_SHORT).show();
AppActivityManager.getInstance().finishActivity(AppStart.this);
}
});
}
}
1.授权代码:
PermissionsManager.getInstance().requestPermissionsIfNecessaryForResult(MainActivity.this, new String[]{Manifest.permission.CAMERA}, new PermissionsResultAction() {
@Override
public void onGranted() {//授权成功
}
@Override
public void onDenied(String permission) {//授权失败
}
});
2.最后别忘了最重要的在Activity里面的回调:
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
PermissionsManager.getInstance().notifyPermissionsChange(permissions, grantResults);
}
最后,结束了。。。
^_^^_^^_^
^_^
^_^^_^^_^
你以为结束了吗?