【发布时间】:2019-11-10 19:21:21
【问题描述】:
我正在尝试从 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;
}
}
}
});
}
【问题讨论】:
-
我通过简单地将上下文和活动都传递给 LocationListener 来让它工作。
-
嗨鲁斯本。最好将完整的解决方案添加到下面的答案中并附上解释。然后,您可以接受自己的答案。最好的问候。
-
@Elletlar 嗨,好的,我会添加它。如果有好的解决方案或坏的解决方案,你能检查一下吗?它有效,但我不确定它是否安全?
-
@Elletlar 现在已发布。你认为这个解决方案安全吗?
标签: android methods nullpointerexception location