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