RxPermissions icon indicating copy to clipboard operation
RxPermissions copied to clipboard

Attempt to invoke virtual method 'int android.content.ContextWrapper.checkSelfPermission(java.lang.String)' on a null object reference

Open cat1024 opened this issue 8 years ago • 10 comments

cat1024 avatar May 09 '17 02:05 cat1024

@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.

epool avatar May 09 '17 02:05 epool

@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$

croitor-ivan avatar May 24 '17 13:05 croitor-ivan

@cat1024 @croitor-ivan Where did you instantiate RxPermission? Before super.onCreate or after?

douo avatar Jun 08 '17 08:06 douo

In my case, seems like it is before...

croitor-ivan avatar Jun 11 '17 07:06 croitor-ivan

@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

douo avatar Jun 12 '17 02:06 douo

you may use Lazy with Dagger

RKuanysh avatar Nov 10 '17 19:11 RKuanysh

completing the answer using Lazy with Dagger in kotlin looked like this:

@Inject lateinit var rxPermissions: Lazy<RxPermissions>

ruiter avatar Jan 23 '18 11:01 ruiter

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)

YesilHilalYazilim avatar Apr 01 '18 12:04 YesilHilalYazilim

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 avatar Aug 02 '18 08:08 YuxiangZhu

@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.

mrArtCore avatar Dec 07 '18 20:12 mrArtCore