Android 6.0 最简单的权限获取方法 RxPermition EasyPermition
Android 6.0 要单独的获取权限
这里提供两种很简单的方法
- EasyPermition
- RxPermition
EasyPermition
https://github.com/googlesamples/easypermissions
dependencies {
//6.0 permition
compile 'pub.devrel:easypermissions:0.1.7'
}
在启动的Activity添加如下代码
public class LoginActivity extends Activity implements EasyPermissions.PermissionCallbacks {
private static final int RC_CAMERA_PERM = ;
private static final int RC_LOCATION_CONTACTS_PERM = ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
requestPermissions();
} private void requestPermissions() {
//要获取的权限
String[] perms = {Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, perms)) {
// Have permissions, do the thing!
Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show();
} else {
// Ask for both permissions
EasyPermissions.requestPermissions(this, getString(R.string.rationale_location_contacts),
RC_LOCATION_CONTACTS_PERM, perms);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
} @Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
} @Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
EasyPermissions.checkDeniedPermissionsNeverAskAgain(this,
getString(R.string.rationale_ask_again),
R.string.setting, R.string.cancel, perms);
}
}
RxPermition
https://github.com/tbruyelle/RxPermissions
dependencies {
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
}
同样在启动的Activity
public class LoginActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login); Observable<Boolean> request = RxPermissions.getInstance(Global.getContext())
.request(
Manifest.permission.WRITE_EXTERNAL_STORAGE//文件读写
/* Manifest.permission.READ_CONTACTS,//联系人
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION*/
);
request.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
}
});
}
}
针对RxPermition、写了个工具类 大家可以参考如下
public class PermissionsUtils { public static Observable<Boolean> getFileAndContactsAndLocationGrant() {
Observable<Boolean> request = RxPermissions.getInstance(Global.getContext())
.request(
Manifest.permission.WRITE_EXTERNAL_STORAGE,//文件读写
Manifest.permission.READ_CONTACTS,//联系人
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION
);
return request;
} public static Observable<Boolean> getCameraAndAudioGrant() {
Observable<Boolean> request = RxPermissions.getInstance(Global.getContext())
.request(
Manifest.permission.CAMERA,//摄像头
Manifest.permission.RECORD_AUDIO//麦克风
);
return request;
}
/**
* 引导到设置界面
* @param activity
* @param isFinish
*/
@MainThread
public static void showPermissionDeniedDialog(final Activity activity, final boolean isFinish) {
DialogDeleteFriend dialog = new DialogDeleteFriend(activity, R.style.MyDialogBg);
dialog.show();
dialog.setIBtnListener(new IBtnClickListener() {
@Override
public void btnOk() {
Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
activity.startActivity(intent);
if (isFinish) activity.finish();
} @Override
public void btnCancle() {
if (isFinish) activity.finish();
}
});
dialog.updateType(DialogDeleteFriend.TYPE_TO_GRANTED);
}
}
用法如下
/**
* 获取授权后加载登录信息,并进入登录界面 如果没获取到权限则引导到设置页面
*/
private void getGrantedAndInitLoginInfo() {
rx.Observable<Boolean> grantObservable = PermissionsUtils.getFileAndContactsAndLocationGrant();
grantObservable.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) {
//do somthing 6.0以后需要权限
} else {
PermissionsUtils.showPermissionDeniedDialog(SplashActivity.this, true);
}
}
});
}
Android 6.0 最简单的权限获取方法 RxPermition EasyPermition的更多相关文章
- Android 6.0 超级简单的权限申请2 (Permission)
代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...
- Android 6.0 超级简单的权限申请 (Permission)
代码地址如下:http://www.demodashi.com/demo/13369.html 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐 ...
- Android 6.0的运行时权限
原文 http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发 Andr ...
- 聊一聊 Android 6.0 的运行时权限
权限一刀切 棉花糖运行时权限 权限的分组 正常权限 正常权限列表 特殊权限危险权限 请求SYSTEM_ALERT_WINDOW 请求WRITE_SETTINGS 必须要支持运行时权限么 不支持运行时权 ...
- 聊一聊Android 6.0的运行时权限
Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...
- android 开发 实现多个动态权限的方法(并且兼容6.0以下的版本权限授权)
android开发权限授权因为版本的不同有不同的授权方式,6.0以下的版本使用的是在注册表中添加权限的静态授权(这种授权权限提示只会出现在app安装的时候),而6.0以上(包含6.0)就需要动态授权的 ...
- 安卓从业者应该关注:Android 6.0的运行时权限
Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...
- Android 5.0 版本 USB 调试模式打开方法
Android 4.2 版本 USB 调试模式打开方法 1. 进入“设置”页面,点击“关于平板电脑”.见下图红色方框. 2. 疯狂点击“版本号”,见下图红色方框,直到出现“您现在处于开发者模式!” ...
- 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d14047603a5bf1242ad01b 导语 内存泄漏问题大约是An ...
随机推荐
- mybatis+springmvc+sqlite一个累心的问题:不在纠结
1 java.sql.SQLException: NYI 2 org.sqlite.RS.getColumnClassName(RS.java:269) 在配置mybatis+springmvc+sq ...
- gcc---C/C++ 编译器
gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点.现在很多程序员都应用GCC,怎样才能更好的应用GCC.目前,GCC可以用 ...
- scrapy框架中间件配置代理
scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...
- Ubuntu 16.04安装mysql (连接)
1.安装mysql sudo apt-get install mysql-server 注:若出现依赖问题安装失败,先执行以下命令sudo apt-get install -f 2.安装过程中会输入密 ...
- 加快编译的技巧 & mount及tmpfs
除了在头文件里面 #ifndef xxx 可以在实际 include这个头文件的前后,加上 #ifndef,这样就不会打开和扫描这个头文件了. 另外,下面这篇文章里面也总结了 http://www.c ...
- int long long 的取值范围
unsigned int 0-4294967295 //整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明 ...
- linux vim,vi编辑器的基础
在之前我也不知道为什么要学vim和vi编辑器,仅仅是听过别人说这个对与linux非常重要. 先说一下为什么要学习这个编辑器.个人的看书理解. 系统管理员的重要工作就是參与与设置某些重要软件的配置文件, ...
- 如何动态改变audio的播放的src
如何动态改变audio的播放的src 一.总结 一句话总结:js方式在请求外部网站的时候行,php方式在请求内外部资源都行.因为php走在js前面,所以问题可以从php方面想办法. 1.如何使用js控 ...
- MyBatis自动生成代码之generatorConfig配置文件及其详细解读
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- 洛谷P1908 逆序对(归并排序)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...