先贴使用:
import android.Manifest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; public class MainActivity extends AppCompatActivity { RxPermissions rxPermissions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (rxPermissions == null) { rxPermissions = new RxPermissions(this); } /** * requset 中写所需要的权限 */ rxPermissions.request(Manifest.permission.READ_PHONE_STATE, Manifest.permission .WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA) .subscribe(new Observer<Boolean>() { @Override public void onSubscribe(Disposable d) { Log.e("--->","Disposable"); } @Override public void onNext(Boolean aBoolean) { Log.e("--->","onNext->"+aBoolean.toString()); //TODO 权限全部申请之后执行,ture表示全部申请成功 } @Override public void onError(Throwable e) { Log.e("--->","onError"); } @Override public void onComplete() { Log.e("--->","onComplete"); } }); } }
什么太长?都省去了onRequestPermissionsResult耶!emmm...我也觉得长,什么吊onSubscribe,再封一下:
简单写了个,大家根据自己的需求改吧
Per per=new Per(this,Manifest.permission.READ_PHONE_STATE, Manifest.permission .WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA) { @Override public void dodo() { Log.e("--->","dodo"); } @Override public void eldo() { Log.e("--->","eldo"); } };
全部代码:一共三个类
public class Permission { public final String name; public final boolean granted; public final boolean shouldShowRequestPermissionRationale; Permission(String name, boolean granted) { this(name, granted, false); } Permission(String name, boolean granted, boolean shouldShowRequestPermissionRationale) { this.name = name; this.granted = granted; this.shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale; } @Override @SuppressWarnings("SimplifiableIfStatement") public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final Permission that = (Permission) o; if (granted != that.granted) return false; if (shouldShowRequestPermissionRationale != that.shouldShowRequestPermissionRationale) return false; return name.equals(that.name); } @Override public int hashCode() { int result = name.hashCode(); result = 31 * result + (granted ? 1 : 0); result = 31 * result + (shouldShowRequestPermissionRationale ? 1 : 0); return result; } @Override public String toString() { return "Permission{" + "name='" + name + '\'' + ", granted=" + granted + ", shouldShowRequestPermissionRationale=" + shouldShowRequestPermissionRationale + '}'; }
public class RxPermissions { public static final String TAG = "RxPermissions"; public static final Object TRIGGER = new Object(); public RxPermissionsFragment mRxPermissionsFragment; public RxPermissions(@NonNull Activity activity) { mRxPermissionsFragment = getRxPermissionsFragment(activity); } private RxPermissionsFragment getRxPermissionsFragment(Activity activity) { RxPermissionsFragment rxPermissionsFragment = null; try { rxPermissionsFragment = findRxPermissionsFragment(activity); boolean isNewInstance = rxPermissionsFragment == null; if (isNewInstance) { rxPermissionsFragment = new RxPermissionsFragment(); FragmentManager fragmentManager = activity.getFragmentManager(); fragmentManager .beginTransaction() .add(rxPermissionsFragment, TAG) .commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); } } catch (Exception e) { e.printStackTrace(); } return rxPermissionsFragment; } private RxPermissionsFragment findRxPermissionsFragment(Activity activity) { return (RxPermissionsFragment) activity.getFragmentManager().findFragmentByTag(TAG); } public void setLogging(boolean logging) { mRxPermissionsFragment.setLogging(logging); } /** * Map emitted items from the source observable into {@code true} if permissions in parameters * are granted, or {@code false} if not. * <p> * If one or several permissions have never been requested, invoke the related framework method * to ask the user if he allows the permissions. */ @SuppressWarnings("WeakerAccess") public <T> ObservableTransformer<T, Boolean> ensure(final String... permissions) { return new ObservableTransformer<T, Boolean>() { @Override public ObservableSource<Boolean> apply(Observable<T> o) { return request(o, permissions) // Transform Observable<Permission> to Observable<Boolean> .buffer(permissions.length) .flatMap(new Function<List<Permission>, ObservableSource<Boolean>>() { @Override public ObservableSource<Boolean> apply(List<Permission> permissions) throws Exception { if (permissions.isEmpty()) { // Occurs during orientation change, when the subject receives onComplete. // In that case we don't want to propagate that empty list to the // subscriber, only the onComplete. return Observable.empty(); } // Return true if all permissions are granted. for (Permission p : permissions) { if (!p.granted) { return Observable.just(false); } } return Observable.just(true); } }); } }; } /** * Map emitted items from the source observable into {@link Permission} objects for each * permission in parameters. * <p> * If one or several permissions have never been requested, invoke the related framework method * to ask the user if he allows the permissions. */ @SuppressWarnings("WeakerAccess") public <T> ObservableTransformer<T, Permission> ensureEach(final String... permissions) { return new ObservableTransformer<T, Permission>() { @Override public ObservableSource<Permission> apply(Observable<T> o) { return request(o, permissions); } }; } /** * Request permissions immediately, <b>must be invoked during initialization phase * of your application</b>. */ @SuppressWarnings({"WeakerAccess", "unused"}) public Observable<Boolean> request(final String... permissions) { return Observable.just(TRIGGER).compose(ensure(permissions)); } /** * Request permissions immediately, <b>must be invoked during initialization phase * of your application</b>. */ @SuppressWarnings({"WeakerAccess", "unused"}) public Observable<Permission> requestEach(final String... permissions) { return Observable.just(TRIGGER).compose(ensureEach(permissions)); } private Observable<Permission> request(final Observable<?> trigger, final String... permissions) { if (permissions == null || permissions.length == 0) { throw new IllegalArgumentException("RxPermissions.request/requestEach requires at least one input permission"); } return oneOf(trigger, pending(permissions)) .flatMap(new Function<Object, Observable<Permission>>() { @Override public Observable<Permission> apply(Object o) throws Exception { return requestImplementation(permissions); } }); } private Observable<?> pending(final String... permissions) { for (String p : permissions) { if (!mRxPermissionsFragment.containsByPermission(p)) { return Observable.empty(); } } return Observable.just(TRIGGER); } private Observable<?> oneOf(Observable<?> trigger, Observable<?> pending) { if (trigger == null) { return Observable.just(TRIGGER); } return Observable.merge(trigger, pending); } @TargetApi(Build.VERSION_CODES.M) private Observable<Permission> requestImplementation(final String... permissions) { List<Observable<Permission>> list = new ArrayList<>(permissions.length); List<String> unrequestedPermissions = new ArrayList<>(); // In case of multiple permissions, we create an Observable for each of them. // At the end, the observables are combined to have a unique response. for (String permission : permissions) { mRxPermissionsFragment.log("Requesting permission " + permission); if (isGranted(permission)) { // Already granted, or not Android M // Return a granted Permission object. list.add(Observable.just(new Permission(permission, true, false))); continue; } if (isRevoked(permission)) { // Revoked by a policy, return a denied Permission object. list.add(Observable.just(new Permission(permission, false, false))); continue; } PublishSubject<Permission> subject = mRxPermissionsFragment.getSubjectByPermission(permission); // Create a new subject if not exists if (subject == null) { unrequestedPermissions.add(permission); subject = PublishSubject.create(); mRxPermissionsFragment.setSubjectForPermission(permission, subject); } list.add(subject); } if (!unrequestedPermissions.isEmpty()) { String[] unrequestedPermissionsArray = unrequestedPermissions.toArray(new String[unrequestedPermissions.size()]); requestPermissionsFromFragment(unrequestedPermissionsArray); } return Observable.concat(Observable.fromIterable(list)); } /** * Invokes Activity.shouldShowRequestPermissionRationale and wraps * the returned value in an observable. * <p> * In case of multiple permissions, only emits true if * Activity.shouldShowRequestPermissionRationale returned true for * all revoked permissions. * <p> * You shouldn't call this method if all permissions have been granted. * <p> * For SDK < 23, the observable will always emit false. */ @SuppressWarnings("WeakerAccess") public Observable<Boolean> shouldShowRequestPermissionRationale(final Activity activity, final String... permissions) { if (!isMarshmallow()) { return Observable.just(false); } return Observable.just(shouldShowRequestPermissionRationaleImplementation(activity, permissions)); } @TargetApi(Build.VERSION_CODES.M) private boolean shouldShowRequestPermissionRationaleImplementation(final Activity activity, final String... permissions) { for (String p : permissions) { if (!isGranted(p) && !activity.shouldShowRequestPermissionRationale(p)) { return false; } } return true; } @TargetApi(Build.VERSION_CODES.M) void requestPermissionsFromFragment(String[] permissions) { mRxPermissionsFragment.log("requestPermissionsFromFragment " + TextUtils.join(", ", permissions)); mRxPermissionsFragment.requestPermissions(permissions); } /** * Returns true if the permission is already granted. * <p> * Always true if SDK < 23. */ @SuppressWarnings("WeakerAccess") public boolean isGranted(String permission) { return !isMarshmallow() || mRxPermissionsFragment.isGranted(permission); } /** * Returns true if the permission has been revoked by a policy. * <p> * Always false if SDK < 23. */ @SuppressWarnings("WeakerAccess") public boolean isRevoked(String permission) { return isMarshmallow() && mRxPermissionsFragment.isRevoked(permission); } boolean isMarshmallow() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } void onRequestPermissionsResult(String permissions[], int[] grantResults) { mRxPermissionsFragment.onRequestPermissionsResult(permissions, grantResults, new boolean[permissions.length]); }
public class RxPermissionsFragment extends Fragment { private static final int PERMISSIONS_REQUEST_CODE = 42; // Contains all the current permission requests. // Once granted or denied, they are removed from it. private Map<String, PublishSubject<Permission>> mSubjects = new HashMap<>(); private boolean mLogging; public RxPermissionsFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @TargetApi(Build.VERSION_CODES.M) void requestPermissions(@NonNull String[] permissions) { requestPermissions(permissions, PERMISSIONS_REQUEST_CODE); } @TargetApi(Build.VERSION_CODES.M) public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode != PERMISSIONS_REQUEST_CODE) return; boolean[] shouldShowRequestPermissionRationale = new boolean[permissions.length]; for (int i = 0; i < permissions.length; i++) { shouldShowRequestPermissionRationale[i] = shouldShowRequestPermissionRationale(permissions[i]); } onRequestPermissionsResult(permissions, grantResults, shouldShowRequestPermissionRationale); } void onRequestPermissionsResult(String permissions[], int[] grantResults, boolean[] shouldShowRequestPermissionRationale) { for (int i = 0, size = permissions.length; i < size; i++) { log("onRequestPermissionsResult " + permissions[i]); // Find the corresponding subject PublishSubject<Permission> subject = mSubjects.get(permissions[i]); if (subject == null) { // No subject found Log.e(RxPermissions.TAG, "RxPermissions.onRequestPermissionsResult invoked but didn't find the corresponding permission request."); return; } mSubjects.remove(permissions[i]); boolean granted = grantResults[i] == PackageManager.PERMISSION_GRANTED; subject.onNext(new Permission(permissions[i], granted, shouldShowRequestPermissionRationale[i])); subject.onComplete(); } } @TargetApi(Build.VERSION_CODES.M) boolean isGranted(String permission) { return getActivity().checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; } @TargetApi(Build.VERSION_CODES.M) boolean isRevoked(String permission) { return getActivity().getPackageManager().isPermissionRevokedByPolicy(permission, getActivity().getPackageName()); } public void setLogging(boolean logging) { mLogging = logging; } public PublishSubject<Permission> getSubjectByPermission(@NonNull String permission) { return mSubjects.get(permission); } public boolean containsByPermission(@NonNull String permission) { return mSubjects.containsKey(permission); } public PublishSubject<Permission> setSubjectForPermission(@NonNull String permission, @NonNull PublishSubject<Permission> subject) { return mSubjects.put(permission, subject); } void log(String message) { if (mLogging) { Log.d(RxPermissions.TAG, message); } }
什么这不是自己写的??那是当然,你看那英文注释怎么可能是楼主自己写的,当然还有自己写的一点点哈哈哈哈:
public abstract class Per { RxPermissions rxPermissions; Activity activity; public Per(Activity activity,String...S) { this.activity = activity; setS(S); } private void setS(String...S){ if (rxPermissions == null) { rxPermissions = new RxPermissions(activity); } rxPermissions.request(S) .subscribe(new Observer<Boolean>() { @Override public void onSubscribe(Disposable d) { Log.e("--->","Disposable"); } @Override public void onNext(Boolean aBoolean) { Log.e("--->","onNext->"+aBoolean.toString()); //TODO 权限全部申请之后执行,ture表示全部申请成功 if (aBoolean) dodo(); else eldo(); } @Override public void onError(Throwable e) { Log.e("--->","onError"); } @Override public void onComplete() { Log.e("--->","onComplete"); } }); } public abstract void dodo(); public abstract void eldo();