android应用商店权限,Android应用商店——Splash页面的实现,Android运行时权限的使用...

参考:

1. http://blog..net/lmj623565791/article/details/50709663

2. 《Android进阶之光》

上篇介绍了该项目的总体介绍,有兴趣的童鞋可以点击查看:

Android应用商店——项目介绍

Splash页面开发

Splash页面一般情况下用于展示app的logo、本版本的相关信息,多为一张图片,初始化完毕后,便进入程序的主体UI界面。本项目闪屏页面只展示相关logo,点击“进入首页”时,需用户手动授予读取SD卡的权限。

e843db1493a3ac1e4dd5685f71890bb6.png

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;

}

}

}

c184f8a710827fadd38d0cf6000d9a15.png

如果用户选择“允许”,则进入主界面UI,下一次就不会弹出权限申请提示框了;若选择“拒绝”,就弹出Toast显示权限被拒绝,下一次还会弹出权限申请提示框,只不过这一次会多一个选择项——“不再询问”,如下:

518240aaecd044c369a95ba177fd5c70.png

如果我们勾选了该选项,则下一次就不会弹出权限申请提示框,而直接调用onRequestPermissionsResult,回调结果为最后一次用户的选择,也就是弹出我们定义的Toast:”没有授权SD卡,可能会影响应用的使用”。

如果想要再次打开该权限,需要在 设置 —> 应用 —> 配置应用 —> 应用访问授权 —> 存储空间权限中操作(此设置为Android 7.1.1的原生设置,不同rom下的操作可能不同),如下图:

ce028bd979fd73f5c51dba20bb4fed2f.png

处理“不再询问”选项

如果用户选择了“不再询问”,那么每次我们调用需要访问该权限的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;

}

......

如下图:

a97fe74929358dae0f6f4094013e81be.png

PermissionsDispatcher框架的使用

以上繁琐的步骤可用第三方框架PermissionsDispatcher解决,具体使用可自行google或者github上直接查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值