gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:53:51 28 4
gpt4 key购买 nike

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

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

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

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

错误:

Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

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

最佳答案

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

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

那么,解决方案来了!代码左侧的数字是我为使其正常工作而实现的步骤。希望对您有所帮助!

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

关于android - 从另一个类调用方法时获取 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com