Получение нулевого значения при вызове метода из другого класса? - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь вызвать метод из класса Listener, но даже если я объявляю объект для класса, он выдает nullpointexception. Я не очень понимаю, почему на самом деле.

Я пытался отправить параметр методу, но это тоже не сработало.

Я получаю ошибку из-за вызова метода checkGpsStat ():

LocationServices.getSettingsClient(MainActivity.this).checkLocationSettings(builder.build())

Ошибка:

Попытка вызвать виртуальный метод 'android.content.Context android.content.Context.getApplicationContext () 'для нулевого объекта ссылка

КЛАСС: - LocationReceiver

public class LocationReceiver extends BroadcastReceiver {

    private static final String TAG = "LocationReceiver";
    private Context mContext;
    private Snackbar snackbar;
    private MainActivity mActicity = new MainActivity();

    public LocationReceiver(Context context, Snackbar snackbar){
        this.mContext = context;
        this.snackbar = snackbar;

    }

    @Override
    public void onReceive(Context context, Intent intent) {

        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            if(gpsEnabled && networkEnabled) {
                if (snackbar != null) {
                    snackbar.dismiss();
                }
                Log.d(TAG, "GPS enabled");
            } else {

                View view = snackbar.getView();
                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
                params.gravity = Gravity.TOP;
                view.setLayoutParams(params);
                view.setBackgroundColor(Color.parseColor("#123123"));
                snackbar.show();

                mActicity.checkGpsState(); // This call causes crash!

                Log.d(TAG, "GPS disabled");
            }
        }

    }

МЕТОД: - checkGpsState ()

public void checkGpsState(){

        Log.d(TAG,"checkGpsState started...");

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        // Below code is where the error is firing from! "mainactivity.this". 
        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(MainActivity.this).checkLocationSettings(builder.build());


        result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
            public void onComplete(@NonNull Task<LocationSettingsResponse> task) {

                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.

                    createLocationRequest();        // Start updating location!

                } catch (ApiException exception) {
                    switch (exception.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try {
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                resolvable.startResolutionForResult(
                                        MainActivity.this,
                                        LocationRequest.PRIORITY_HIGH_ACCURACY);


                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            } catch (ClassCastException e) {
                                // Ignore, should be an impossible error.
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            break;
                    }
                }
            }
        });
    }

1 Ответ

1 голос
/ 29 июня 2019

Ух ты, наконец! Я был в состоянии решить это. Очень рад этому!

Я не уверен, является ли это лучшим решением или безопасным. Но это работает для меня, и я надеюсь, что это работает для всех остальных, кто сталкивается с этой проблемой.

Итак, вот решение! Цифры слева в коде - это шаги, которые я реализовал, чтобы заставить это работать. Надеюсь, это поможет!

КЛАСС: - LocationReceiver

        public class LocationReceiver extends BroadcastReceiver {

        private static final String TAG = "LocationReceiver";
        private Context mContext;
        private Snackbar snackbar;
1       private MainActivity mainActivity;  // Declare activity object

        //NOTE: In the constructor, we pass the activity that fires for this listener, in this case MainActivity.

2        public LocationReceiver(Context context, MainActivity mActivity, Snackbar snackbar){  // Add activity to constructor parameter
            this.mContext = context;
            this.snackbar = snackbar;
3            mainActivity = mActivity;    // set activity with the passed activity.
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
                boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                if(gpsEnabled && networkEnabled) {
                    if (snackbar != null) {
                        snackbar.dismiss();
                    }
                    Log.d(TAG, "GPS is enabled");
                } else {

                    View view = snackbar.getView();
                    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
                    params.gravity = Gravity.TOP;
                    view.setLayoutParams(params);
                    view.setBackgroundColor(Color.parseColor("#123123"));
                    snackbar.show();

                    // If user turned off location, pass both context, AND activity to the method that handles the gps-dialog.

                    //MARK: - pass both context and activity that we receieved from constructor!
4                   mainActivity.checkGpsState(mContext, mainActivity); // Call method in another activity, pass both context and activity (both is for certain calls in the method in the other activity)

                    Log.d(TAG, "GPS is disabled");
                }
            }

        }
    }

МЕТОД: - checkGpsState ()

    //checkGps
5    public void checkGpsState(Context mContext, Activity mActivity){  // Here we need to receive the parameter.

        Log.d(TAG,"checkGpsState started...");

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        //MARK: - pass the context from parameter!
6        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(mContext).checkLocationSettings(builder.build());   // Here comes the usage of the context we passed as parameter!


        result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
            public void onComplete(@NonNull Task<LocationSettingsResponse> task) {

                try {
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.

                    createLocationRequest();        // Start updating location!

                } catch (ApiException exception) {
                    switch (exception.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try {
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                // MARK: - Here we pass the activity from parameter!
7                               resolvable.startResolutionForResult(
                                        mActivity,
                                        LocationRequest.PRIORITY_HIGH_ACCURACY);  // And here comes the usage for the activity we passed as parameter


                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            } catch (ClassCastException e) {
                                // Ignore, should be an impossible error.
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                            break;
                    }
                }
            }
        });
    }
...