Android动态获取运行时权限RxPermissions
新版的Android权限控制更加严格,一般需要在APP的运行时动态获取,如果按照谷歌官方的方法比葫芦画瓢获取动态运行时权限,代码比较繁琐,如果和业务逻辑再搅和在一起,代码的可读性变得比较差,因此一些第三方的运行时权限获取库因运而生。
RxPermissions基于RxJava2,实现了一种更为灵活和简洁的Android动态获取运行时权限的解决方案。其在github上的项目地址:https://github.com/tbruyelle/RxPermissions
首先需要在app的build.gradle文件引入RxPermissions以及RxJava2:
compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
AI 代码解读
RxPermissions需要Java1.8,同时需要开启jackOptions,写好的app的build.gradle文件例如:
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion '25.0.2' defaultConfig { applicationId "zhangfei.demo" minSdkVersion 21 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" jackOptions { enabled true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' testCompile 'junit:junit:4.12' compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar' }
AI 代码解读
假设在Androidmanifest.xml申请两个读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
AI 代码解读
上层Java代码:
package zhangfei.demo;
import android.Manifest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import com.tbruyelle.rxpermissions2.RxPermissions;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getPermissions();
}
});
}
private void getPermissions() {
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(granted -> {
if (granted) {
Toast.makeText(getApplicationContext(), "已经获取所需权限", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(getApplicationContext(), "未能获取所需权限", Toast.LENGTH_SHORT)
.show();
}
});
}
}
AI 代码解读
假设在APP运行时候拒绝,那么点击获取按钮,调用getPermissions后: