从另一个类调用方法时得到null?

时间:2019-06-28 22:04:46

标签: android methods nullpointerexception location

我试图从侦听器类中调用一个方法,但是即使我为该类声明一个对象,它也会抛出nullpointexception。我真的不明白为什么。

我尝试向该方法发送参数,但这都不起作用。

我收到的错误是由于方法checkGpsStat()中的调用引起的:

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

错误:

  

试图调用虚拟方法'android.content.Context   空对象上的android.content.Context.getApplicationContext()'   参考

CLASS:-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 个答案:

答案 0 :(得分:1)

哇,终于!我能够解决这个问题。对此感到非常高兴!

我不确定这是否是最佳解决方案,或者它是否安全。但这对我有用,我希望对其他遇到此问题的人也有用。

因此,解决方案来了! 代码左侧的数字是我实现此步骤所要执行的步骤。希望对您有帮助!

CLASS:-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;
                    }
                }
            }
        });
    }