Android动态获取运行时权限RxPermissions
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:[email protected]'
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:[email protected]'
}
假设在Androidmanifest.xml申请两个读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上层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();
}
});
}
}
假设在APP运行时候拒绝,那么点击获取按钮,调用getPermissions后:
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:[email protected]'
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:[email protected]'
}
假设在Androidmanifest.xml申请两个读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上层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();
}
});
}
}
假设在APP运行时候拒绝,那么点击获取按钮,调用getPermissions后: