Android 从另一个类调用方法时获取null?

Android 从另一个类调用方法时获取null?,android,methods,nullpointerexception,location,Android,Methods,Nullpointerexception,Location,我试图从侦听器类调用一个方法,但即使我为该类声明了一个对象,它也会抛出nullpointexception。我真的不明白为什么 我尝试向该方法发送一个参数,但也没有成功 我收到的错误是由于方法checkGpsStat()中的调用引起的: 错误: 尝试调用虚拟方法“android.content.Context” 空对象上的android.content.Context.getApplicationContext() 参考文献 类别:-LocationReceiver public class L

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

我尝试向该方法发送一个参数,但也没有成功

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

错误:

尝试调用虚拟方法“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");
            }
        }

    }
        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");
                }
            }

        }
    }
方法:-检查gpsstate()

public void checkGpsState(){
Log.d(标记“checkGpsState start…”);
LocationRequest LocationRequest=LocationRequest.create();
locationRequest.setPriority(locationRequest.PRIORITY\u高精度);
LocationSettingsRequest.Builder=新建LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
//下面的代码是从“mainactivity.this”引发错误的代码。
任务结果=
LocationServices.getSettingsClient(MainActivity.this).checkLocationSettings(builder.build());
result.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
试一试{
LocationSettingsResponse-response=task.getResult(ApiException.class);
//满足所有位置设置。客户端可以初始化位置
//请求在这里。
createLocationRequest();//开始更新位置!
}捕获(ApiException异常){
开关(异常。getStatusCode()){
案例位置设置StatusCodes.RESOLUTION_要求:
//不满足位置设置。但可以通过显示
//用户创建一个对话框。
试一试{
//强制转换为可解决的异常。
ResolvableApiException resolvable=(ResolvableApiException)异常;
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
Resolveable.StartResult解决方案(
这个,,
定位请求。优先级(高精度);
}catch(IntentSender.sendtintentexe){
//忽略错误。
}catch(ClassCastException e){
//忽略,应该是一个不可能的错误。
}
打破
案例位置设置StatusCodes.SETTINGS\u CHANGE\u不可用:
//位置设置不满意。但是,我们无法修复此问题
//设置,这样我们就不会显示对话框。
打破
}
}
}
});
}

哇,终于!我能解决这个问题。非常高兴

我不确定这是不是最好的解决方案,还是安全的。但它对我有效,我希望它对其他面临这个问题的人有效

所以,解决办法来了! 代码左侧的数字是我实现的使其工作的步骤。希望有帮助

类别:-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");
            }
        }

    }
        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");
                }
            }

        }
    }
方法:-检查gpsstate()

//检查GPS
5 public void checkGpsState(Context mContext,Activity mActivity){//这里我们需要接收参数。
Log.d(标记“checkGpsState start…”);
LocationRequest LocationRequest=LocationRequest.create();
locationRequest.setPriority(locationRequest.PRIORITY\u高精度);
LocationSettingsRequest.Builder=新建LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
//MARK:-从参数传递上下文!
6任务结果=
LocationServices.getSettingsClient(mContext.checkLocationSettings(builder.build());//下面是我们作为参数传递的上下文的用法!
result.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
试一试{
LocationSettingsResponse-response=task.getResult(ApiException.class);
//满足所有位置设置。客户端可以初始化位置
//请求在这里。
createLocationRequest();//开始更新位置!
}捕获(ApiException异常){
开关(异常。getStatusCode()){
案例位置设置StatusCodes.RESOLUTION_要求:
//不满足位置设置。但可以通过显示
//用户创建一个对话框。
试一试{
//强制转换为可解决的异常。
ResolvableApiException resolvable=(ResolvableApiException)异常;
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
//MARK:-这里我们通过参数传递活动!
7可解析的。开始解决结果(
活动性,
LocationRequest.PRIORITY_HIGH_Accurance);//下面是ac的用法
    //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;
                    }
                }
            }
        });
    }