1. 程式人生 > >android開發--RxPermissions的簡單使用

android開發--RxPermissions的簡單使用

1.RxPermissions的好處

RxPermissions是幫助開發者簡化requestPermissions()相關的處理。

(1) 開發者不用擔心Android執行環境的版本,如果系統是Android 6.0之前的版本,RxPermissions返回的結果是,app請求的每個許可權都被允許(granted)。 
RxPermissions內部已經對Android版本進行了判斷:
    boolean isMarshmallow() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
    }

    public boolean isGranted(String permission) {
        // 如果是Android 6.0 (Api 23)之前,則許可權被允許使用。
        return !isMarshmallow() || mRxPermissionsFragment.isGranted(permission);
    }
(2) 將許可權申請的程式碼(requestPermissions())和請求結果的程式碼(onRequestPermissionsResult())放在一起管理,避免了程式碼的分散。

(3) RxPermissions具備Rx(RxJava)的特性,例如可以使用鏈式操作,可以執行filter操作,transform操作,等等。

2.RxPermissions的使用

1.先新增依賴

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
}

2.程式碼使用例項

final PermissionListener permissionListener = new PermissionListener() {
    @Override
    public void onPermissionGranted() {
        //獲取許可權
    }

    @Override
    public void onPermissionDenied(ArrayList<String> deniedPermissions) {
        //拒絕許可權
    }
};
new RxPermissions(this)
        .request(Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS)
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean aBoolean) {
                if (permissionListener == null) return;
                if (aBoolean) {
                    permissionListener.onPermissionGranted();
                } else {
                    permissionListener.onPermissionDenied(null);
                }
            }
        });

3.app內有很多許可權需要呼叫,為了方便使用封裝工具類TedPermissionUtils,以便於app內呼叫。

封裝類例項:

public class TedPermissionUtils {
/**
 * 檢查定位許可權
 *
 * @param context
 * @param permissionListener
 */
public static void checkLocation(final Context context, final PermissionListener permissionListener) {
    new RxPermissions((Activity) context)
            .request(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS)
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    if(permissionListener == null)
                        return;
                    if (aBoolean) {
                        permissionListener.onPermissionGranted();
                    } else {
                        permissionListener.onPermissionDenied(null);
                    }
                }
            });
}
}

app呼叫例項:

TedPermissionUtils.checkLocation(context, new PermissionListener() {
    @Override
    public void onPermissionGranted() {
        if (location == null)
            mLocationClient.start();
    }

    @Override
    public void onPermissionDenied(ArrayList<String> deniedPermissions) {
        //這裡拒絕許可權可以做你想要的操作
        //toast.shortToast("您拒絕了位置許可權");
      //  appManager.finishActivity();
    }
});

3.參考