RxPermissions
RxPermissions copied to clipboard
Attempt to invoke virtual method 'int android.content.ContextWrapper.checkSelfPermission(java.lang.String)' on a null object reference
@cat1024 could you please provide us more information about this issue? some pieces of code, stack trace and steps to reproduce it could be helpful.
@cat1024 I can add some details here. Start the app, allow permission. Send app to background (Home button). Open settings, go to app details and disable permission. Resume the application.
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.app.Activity.checkSelfPermission(java.lang.String)' on a null object reference at com.tbruyelle.rxpermissions2.RxPermissionsFragment.isGranted(RxPermissionsFragment.java:71) at com.tbruyelle.rxpermissions2.RxPermissions.isGranted(RxPermissions.java:251) at com.tbruyelle.rxpermissions2.RxPermissions.requestImplementation(RxPermissions.java:177) at com.tbruyelle.rxpermissions2.RxPermissions.access$100(RxPermissions.java:33) at com.tbruyelle.rxpermissions2.RxPermissions$3.apply(RxPermissions.java:147) at com.tbruyelle.rxpermissions2.RxPermissions$3.apply(RxPermissions.java:144) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:121) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmitScalar(ObservableFlatMap.java:234) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:146) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107) at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableBuffer.subscribeActual(ObservableBuffer.java:44) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162) at io.reactivex.internal.operators.observable.ObservableFlatMap$
@cat1024 @croitor-ivan Where did you instantiate RxPermission? Before super.onCreate or after?
In my case, seems like it is before...
@croitor-ivan Maybe you should try instantiated after super.onCreate, this cause by RxPermissionsFragment.setRetainInstance(true) Activity will replace the new RxPermissionsFragment with old one in super.onCreate. So your fragment became isolated and getActivity returne null
If after super.onCreate, RxPermissions will use existed Fragment instead of create new Fragment see RxPermissions/RxPermissions.java#L42
you may use Lazy with Dagger
completing the answer using Lazy with Dagger in kotlin looked like this:
@Inject lateinit var rxPermissions: Lazy<RxPermissions>
I have same crash with some situation ı have initialize rxpermission in activity I think cause activity class changed... What is best solution for this? It is stability problem.. It works on general user...but one user had this crash
Here is my code:
in Actitivity
rxPermissions = new RxPermissions(this);
in fragment checking permission
(((MainActivity)context)).getApplication()).rxPermissions.request(Manifest.permission.RECORD_AUDIO)
.subscribe(granted -> {
` @Override public void onAttach(Context context) { super.onAttach(context); this.context = context; }
@Override
public void onDetach() {
super.onDetach();
Crashlytics.log("OnDetach called");
} `
log:
com.tbruyelle.rxpermissions2.RxPermissionsFragment.isGranted (RxPermissionsFragment.java:71)
| com.tbruyelle.rxpermissions2.RxPermissions.isGranted (RxPermissions.java:251) | com.tbruyelle.rxpermissions2.RxPermissions.requestImplementation (RxPermissions.java:177) | com.tbruyelle.rxpermissions2.RxPermissions.access$100 (RxPermissions.java:33) | com.tbruyelle.rxpermissions2.RxPermissions$3.apply (RxPermissions.java:147) | com.tbruyelle.rxpermissions2.RxPermissions$3.apply (RxPermissions.java:144) | io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext (ObservableFlatMap.java:121) | io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmitScalar (ObservableFlatMap.java:233) | io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner (ObservableFlatMap.java:146) | io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext (ObservableFlatMap.java:139) | io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run (ObservableFromArray.java:105) | io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual (ObservableFromArray.java:35) | io.reactivex.Observable.subscribe (Observable.java:10179) | io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual (ObservableFlatMap.java:55) | io.reactivex.Observable.subscribe (Observable.java:10179) | io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual (ObservableFlatMap.java:55) | io.reactivex.Observable.subscribe (Observable.java:10179) | io.reactivex.internal.operators.observable.ObservableBuffer.subscribeActual (ObservableBuffer.java:44) | io.reactivex.Observable.subscribe (Observable.java:10179) | io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual (ObservableFlatMap.java:55) | io.reactivex.Observable.subscribe (Observable.java:10179) | io.reactivex.Observable.subscribe (Observable.java:10165) | io.reactivex.Observable.subscribe (Observable.java:10071)
E/XgStat: io.reactivex.exceptions.OnErrorNotImplementedException: Attempt to invoke virtual method 'int android.app.Activity.checkSelfPermission(java.lang.String)' on a null object reference at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704) at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701) at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77) at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onError(ObservableFlatMap.java:288) at io.reactivex.internal.operators.observable.ObservableBuffer$BufferExactObserver.onError(ObservableBuffer.java:124) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onError(ObservableFlatMap.java:288) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:125) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmitScalar(ObservableFlatMap.java:234) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:146) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107) at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36) at io.reactivex.Observable.subscribe(Observable.java:10955) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10955) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10955) at io.reactivex.internal.operators.observable.ObservableBuffer.subscribeActual(ObservableBuffer.java:44) at io.reactivex.Observable.subscribe(Observable.java:10955) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10955) at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96) at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:179) at android.app.ActivityThread.main(ActivityThread.java:5769) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.app.Activity.checkSelfPermission(java.lang.String)' on a null object reference at com.tbruyelle.rxpermissions2.RxPermissionsFragment.isGranted(RxPermissionsFragment.java:71) at com.tbruyelle.rxpermissions2.RxPermissions.isGranted(RxPermissions.java:251) at com 08-02 15:10:49.545 8932-8932/com.tongcheng.cardriver E/AndroidRuntime: FATAL EXCEPTION: main Process: com.tongcheng.cardriver, PID: 8932 io.reactivex.exceptions.OnErrorNotImplementedException: Attempt to invoke virtual method 'int android.app.Activity.checkSelfPermission(java.lang.String)' on a null object reference
@YuxiangZhu, @YesilHilalYazilim, @cat1024 @croitor-ivan Guys. Maybe you doing it wrong ? From README.md
final RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity or Fragment instance
So RxPermission instance should be created whitin Activity only when that activity will use it, or in Fragment if that Fragment want check permissions and react on request somehow.
Create RxPermission instance in activity and work with it from inner/nested fragment (escpecially retained fragment) extremely wrong way! It really could cause such crashes.