Android应用商店——Splash页面的实现,Android运行时权限的使用
2017-08-27 18:11
399 查看
参考:
1. http://blog.csdn.net/lmj623565791/article/details/50709663
2. 《Android进阶之光》
上篇介绍了该项目的总体介绍,有兴趣的童鞋可以点击查看:
Android应用商店——项目介绍
google将权限分为两类:一类是Normal Permissions,一般不涉及用户隐私,无需用户授权,而且用户不能取消这类授权,比如手机震动、访问网络等,只要在清单文件中声明即可;
Normal Permissions如下
第二类是Dangerous Permissions,一般会涉及用户隐私,需要用户手动进行授权,比如读取sdcard、访问通信录等。
Dangerous Permissions:
Dangerous Permission是以分组的形式给出的,同一组的任何一个权限被授权了,其他权限也自动被授权。此外,对于申请时弹出的提示框上面的文本说明,也是对整个权限组的说明,而不是单个权限的说明。
如果用户选择“允许”,则进入主界面UI,下一次就不会弹出权限申请提示框了;若选择“拒绝”,就弹出Toast显示权限被拒绝,下一次还会弹出权限申请提示框,只不过这一次会多一个选择项——“不再询问”,如下:
如果我们勾选了该选项,则下一次就不会弹出权限申请提示框,而直接调用onRequestPermissionsResult,回调结果为最后一次用户的选择,也就是弹出我们定义的Toast:”没有授权SD卡,可能会影响应用的使用”。
如果想要再次打开该权限,需要在 设置 —> 应用 —> 配置应用 —> 应用访问授权 —> 存储空间权限中操作(此设置为Android 7.1.1的原生设置,不同rom下的操作可能不同),如下图:
如下图:
1. http://blog.csdn.net/lmj623565791/article/details/50709663
2. 《Android进阶之光》
上篇介绍了该项目的总体介绍,有兴趣的童鞋可以点击查看:
Android应用商店——项目介绍
Splash页面开发
Splash页面一般情况下用于展示app的logo、本版本的相关信息,多为一张图片,初始化完毕后,便进入程序的主体UI界面。本项目闪屏页面只展示相关logo,点击“进入首页”时,需用户手动授予读取SD卡的权限。Android运行时权限
实现支持运行时权限
想必大家都知道,Android 6.0之前,安装app会列出安装此app的相关访问权限,而且只有安装时会出现一次,一旦我们同意并安装了此app,这个app就可以在用户毫不知晓的情况下访问权限内的所有东西(流氓软件全家桶)。Android 6.0以后的版本,google对此类情况进行了整改,app不得不在运行时一个一个询问用户来授予权限。对于开发者而言,你需要在每个需要权限的地方检查权限,否则等待你的就是app崩溃!!!google将权限分为两类:一类是Normal Permissions,一般不涉及用户隐私,无需用户授权,而且用户不能取消这类授权,比如手机震动、访问网络等,只要在清单文件中声明即可;
Normal Permissions如下
1. ACCESS_LOCATION_EXTRA_COMMANDS 2. ACCESS_NETWORK_STATE 3. ACCESS_NOTIFICATION_POLICY 4. ACCESS_WIFI_STATE 5. BLUETOOTH 6. BLUETOOTH_ADMIN 7. BROADCAST_STICKY 8. CHANGE_NETWORK_STATE 9. CHANGE_WIFI_MULTICAST_STATE 10. CHANGE_WIFI_STATE 11. DISABLE_KEYGUARD 12. EXPAND_STATUS_BAR 13. GET_PACKAGE_SIZE 14. INSTALL_SHORTCUT 15. INTERNET 16. KILL_BACKGROUND_PROCESSES 17. MODIFY_AUDIO_SETTINGS 18. NFC 19. READ_SYNC_SETTINGS 20. READ_SYNC_STATS 21. RECEIVE_BOOT_COMPLETED 22. REORDER_TASKS 23. REQUEST_INSTALL_PACKAGES 24. SET_ALARM 25. SET_TIME_ZONE 26. SET_WALLPAPER 27. SET_WALLPAPER_HINTS 28. TRANSMIT_IR 29. UNINSTALL_SHORTCUT 30. USE_FINGERPRINT 31. VIBRATE 32. WAKE_LOCK 33. WRITE_SYNC_SETTINGS
第二类是Dangerous Permissions,一般会涉及用户隐私,需要用户手动进行授权,比如读取sdcard、访问通信录等。
Dangerous Permissions:
1. group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS 2. 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 3. group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR 4. group:android.permission-group.CAMERA permission:android.permission.CAMERA 5. group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS 6. group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION 7. group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE 8. group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO 9. 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
Dangerous Permission是以分组的形式给出的,同一组的任何一个权限被授权了,其他权限也自动被授权。此外,对于申请时弹出的提示框上面的文本说明,也是对整个权限组的说明,而不是单个权限的说明。
public class SplashActivity extends Activity { /** * 用于保存是否第一次进入闪屏页面的配置文件 */ private SharedPreferences mSp; @BindView(R.id.bt_enter_home) Button mBt_enter_home; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); ButterKnife.bind(this); mSp = getSharedPreferences(Constant.PREFERENCE_NAME,MODE_PRIVATE); boolean isFirstComeIn = mSp.getBoolean(Constant.PREFERENCE_KEY_IS_FIRST_COME_IN,true); if (!isFirstComeIn) {//直接进入 enterHomeActivity(); } } /** * 校验权限 */ private void verifyPermission() { //检查是否有读写SD的权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {//如果没有该权限,去申请 ActivityCompat.requestPermissions(this,Constant.permissions,Constant.PERMISSION_REQUEST_CODE); } else { enterHomeActivity(); } } /** * “进入首页”Button的点击事件,进入主界面 */ @OnClick(R.id.bt_enter_home) protected void onEnterHome(){ verifyPermission(); } private void enterHomeActivity() { mSp.edit().putBoolean(Constant.PREFERENCE_KEY_IS_FIRST_COME_IN,false).commit(); Intent intent = new Intent(this, HomeActivity.class); startActivity(intent); finish(); } /** * 申请权限的回调 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case Constant.PERMISSION_REQUEST_CODE: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this,"授权SD卡成功",Toast.LENGTH_SHORT).show(); enterHomeActivity(); } else { Toast.makeText(this,"没有授权SD卡,可能会影响应用的使用",Toast.LENGTH_SHORT).show(); mBt_enter_home.setEnabled(false); } break; default: break; } } }
如果用户选择“允许”,则进入主界面UI,下一次就不会弹出权限申请提示框了;若选择“拒绝”,就弹出Toast显示权限被拒绝,下一次还会弹出权限申请提示框,只不过这一次会多一个选择项——“不再询问”,如下:
如果我们勾选了该选项,则下一次就不会弹出权限申请提示框,而直接调用onRequestPermissionsResult,回调结果为最后一次用户的选择,也就是弹出我们定义的Toast:”没有授权SD卡,可能会影响应用的使用”。
如果想要再次打开该权限,需要在 设置 —> 应用 —> 配置应用 —> 应用访问授权 —> 存储空间权限中操作(此设置为Android 7.1.1的原生设置,不同rom下的操作可能不同),如下图:
处理“不再询问”选项
如果用户选择了“不再询问”,那么每次我们调用需要访问该权限的API时都会失效,这显然是不好的用户体验。所以我们需要做的就是给用户一个友好的提。这时候需要使用shouldShowRequestPermissionRationale()方法,这个方法用来帮助开发者向用户解释权限的情况。如果用户选择了“不再询问”选项,则shouldShowRequestPermissionRationale()方法会返回false,这时候我们可以弹出AlertDialog来提示用户允许访问该权限的重要性:...... /** * 申请权限的回调 * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case Constant.PERMISSION_REQUEST_CODE: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this,"授权SD卡成功",Toast.LENGTH_SHORT).show(); enterHomeActivity(); } else { Toast.makeText(this,"没有授权SD卡,可能会影响应用的使用",Toast.LENGTH_SHORT).show(); if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)) { AlertDialog dialog = new AlertDialog.Builder(this).setMessage("该功能需要访问SD卡的权限,不开启将无法正常工作!").setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); dialog.show(); } mBt_enter_home.setEnabled(false); } break; default: break; } ......
如下图:
PermissionsDispatcher框架的使用
以上繁琐的步骤可用第三方框架PermissionsDispatcher解决,具体使用可自行google或者github上直接查看相关文章推荐
- 使用Android应用调用WebService实现天气预报
- Android小技巧(一):实现捕获应用的运行时异常
- Android应用中使用GridView实现数据网格显示
- Android实现打电话的功能-使用Intent和AndroidManifset.xml中加入权限
- 使用 Ant 实现批量打包Android应用
- Android应用中使用GridView实现数据网格显示(传智播客视频笔记)
- Android深入浅出系列之实例应用—程序运行进度提示条应用ProgressBar和Handler的使用
- Android中使用ViewPager和PagerTabStrip实现页面滑动效果
- 使用Ant 实现批量打包Android应用
- Android应用自动更新功能实现使用AsyncTask!
- Android 应用第一次运行时,引导页面的设置方法(只让程序Acitivity运行一次的设置方法)
- AJAX在静态HTML页面中实现权限控制的应用
- [Android学UI之一]简单实现移动应用左右滑动导航页面
- 使用双缓冲技术实现Android画板应用
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- 使用Ant 实现批量打包Android应用
- 初学Android实现打电话的功能-使用Intent和AndroidManifset.xml中加入权限
- Android使用系统Intent实现分享功能及将应用加入分享列表++分享邮箱实现
- 初学Android实现打电话的功能-使用Intent和AndroidManifset.xml中加入权限
- 【Android应用开发】-(11)使用JPCT-AE 3D框架实现旋转的立方体(附效果图及源码)