RxPermissions擷取動态權限
本文部落格基于Rxpermissions,具體使用,請自己檢視。
Rxjava擷取動态權限是通過Rxpermissions擷取動态權限的,在學習之前我封裝了一個工具類為你提供使用。先看看效果
雖然實作很簡單,但是要擷取很多權限的時候要寫的代碼比較多,而且特别難看,是以我封裝了一下,實作一行代碼實作。
擷取一個權限(不重複寫輪子)
//擷取 permissionsUtils 對象
RxPermissions permissionsUtils = RxUtils.getInstance(this);
//擷取xx權限
boolean camera1 = permissionsUtils.getPermissions1("xx");
就這簡單使用。不是一行嗎?(作弊一下)
boolean permissions1 = RxUtils.getInstance(this).getPermissions1("xx");
工具類在Demo裡或者建立一個工具類把下面複制:
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:[email protected]'
public class RxUtils {
private RxUtils() {
}
public static PermissionsUtils getInstance(Activity activity) {
return new PermissionsUtils(activity);
}
public static class PermissionsUtils {
private boolean returnvalue;
public void setToast(boolean toast) {
this.toast = toast;
}
private boolean toast;
private Activity activity;
private RxPermissions rxPermissions;
public PermissionsUtils(Activity activity) {
this.activity = activity;
rxPermissions = new RxPermissions(activity);
}
public boolean getPermissions1(String permissions) {
switch (permissions) {
case "相機":
request(Manifest.permission.CAMERA);
break;
case "月曆":
request(Manifest.permission.WRITE_CALENDAR);
break;
case "通訊錄":
request(Manifest.permission.READ_CONTACTS);
break;
case "位置":
request(Manifest.permission.LOCATION_HARDWARE);
break;
case "電話":
request(Manifest.permission.CALL_PHONE);
break;
case "短信":
request(Manifest.permission.READ_SMS);
break;
case "存儲":
request(Manifest.permission.READ_EXTERNAL_STORAGE);
break;
case "傳感器":
request(Manifest.permission.SEND_RESPOND_VIA_MESSAGE);
break;
case "麥克風":
request(Manifest.permission.DISABLE_KEYGUARD);
break;
default:
returnvalue = false;
Log.e("PermissionsUtils","沒次找到權限,請确認要擷取的權限");
if (returnvalue==false) {
throw new NullPointerException("沒次找到權限,請确認要擷取的權限");
}
}
return returnvalue;
}
/**
* rxPermissions擷取權限的核心方法
*/
@SuppressLint("CheckResult")
private void request(String permission) {
rxPermissions.request(permission)
.subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
returnvalue = aBoolean;
if (!returnvalue) {
if (toast) {
Toast.makeText(activity, "擷取" + "權限失敗", Toast.LENGTH_SHORT).show();
}
Log.e("PermissionsUtils", "擷取權限成功");
}
}
});
}
/**
* @return 傳回是否吐司
*/
public boolean isToast() {
return toast;
}
/**
* 設定吐司
*/
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
正題開始
很簡單接下看怎麼寫出來的,我拿打電話的代碼舉例,如果你需要測試能不能用,直接複制就可以了。(都寫好了幫你快速測試)
依賴
導入Rxjava2的依賴,注意Rxjava和Rxjava2的不同,下面依賴是必要的
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.16'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:[email protected]'
清單清單
所需要的權限:比如打電話(需要什麼權限,就寫什麼權限)
<uses-permission android:name="android.permission.CALL_PHONE" />
布局檔案
功能簡單就隻有一個按鈕
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".RxAndrod">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="電話"
/>
</LinearLayout>
代碼
初始化RxPermissions對象
rxPermissions = new RxPermissions(this);
這個最好寫個方法
rxPermissions.request(Manifest.permission.CALL_PHONE)
.subscribe(new Consumer<Boolean>() {
@SuppressLint("MissingPermission")
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
} else {
Toast.makeText(RxAndrod.this, "電話擷取權限", Toast.LENGTH_SHORT).show();
}
}
});
ok
以此類推所有權限都是這樣擷取,或者一組擷取
github上--- RxjavaDemo
如果你的測試手機榮耀10,安卓系統8.1的,有問題,請聯系我。