Эй, ребята, я пытаюсь найти координаты текущего устройства с использованием GPS и сети. Я тестирую этот код для API 23. Но этот код возвращает исключение NullPointerException. Кодекс приведен ниже:Выброс нулевого указателя Исключение при поиске текущих координат устройства
public class AndroidLocationActivity extends Activity {
Button btnGPSShowLocation;
Button btnNWShowLocation;
private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 2;
protected LocationManager locationManager;
Location location;
private static final long MIN_DISTANCE_FOR_UPDATE = 10;
private static final long MIN_TIME_FOR_UPDATE = 1000 * 60 * 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_android_location);
btnGPSShowLocation = (Button) findViewById(R.id.btnGPSShowLocation);
btnNWShowLocation = (Button) findViewById(R.id.btnNWShowLocation);
}
public void mGPS(View view){
Location gpsLocation = getLocation(LocationManager.GPS_PROVIDER);
if (gpsLocation != null) {
double latitude = gpsLocation.getLatitude();
double longitude = gpsLocation.getLongitude();
Toast.makeText(getApplicationContext(), "Mobile Location (GPS): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
}
else {
showSettingsAlert("GPS");
}
}
public void mNW(View view){
Location nwLocation =getLocation(LocationManager.NETWORK_PROVIDER);
if (nwLocation != null) {
double latitude = nwLocation.getLatitude();
double longitude = nwLocation.getLongitude();
Toast.makeText(getApplicationContext(), "Mobile Location (NW): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
}
else {
showSettingsAlert("NETWORK");
}
}
public void showSettingsAlert(String provider) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
AndroidLocationActivity.this);
alertDialog.setTitle(provider + " SETTINGS");
alertDialog.setMessage(provider + " is not enabled! Want to go to settings menu?");
alertDialog.setPositiveButton("Settings",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
AndroidLocationActivity.this.startActivity(intent);
}
});
alertDialog.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public Location getLocation(String provider) {
if (locationManager.isProviderEnabled(provider)) {
if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
else {
locationManager.requestLocationUpdates(provider, MIN_TIME_FOR_UPDATE, MIN_DISTANCE_FOR_UPDATE, (LocationListener) this);
if (locationManager != null) {
location = locationManager.getLastKnownLocation(provider);
return location;
}
}
}
return null;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
}
else if(grantResults[0]==PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(this, "Never Ask Again", Toast.LENGTH_SHORT).show();
}
}
return;
}
}
}
}
код возвращает следующие ошибки:
FATAL ИСКЛЮЧЕНИЕ: главный процесса: com.cetpainfotech.locationtrackerapplication, PID: 29068 java.lang.IllegalStateException: Не удалось выполнить метод для android: onClick на android.view.View $ DeclaredOnClickListener.onClick (View.java:4461) на android.view.View.performClick (View.java:5207) на android.view.View $ PerformClick.run (View.java:21177) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:148) at android.app.ActivityThread.main (ActivityThread.java:5441) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:738) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:628) Вызванный: java.lang.reflect.InvocationTargetException на java.lang.reflect.Method.invoke (нативный метод) на андроид .view.View $ DeclaredOnClickListener.onClick (View.java:4456) на android.vi ew.View.performClick (View.java:5207) на android.view.View $ PerformClick.run (View.java:21177) на android.os.Handler.handleCallback (Handler.java:739) на android. os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java:5441) на java.lang. reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:738) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:628) Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean android.location.Loc ationManager.isProviderEnabled (java.lang.String)»на нулевой ссылки на объект на com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.getLocation (AndroidLocationActivity.java:108) в com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.mGPS (AndroidLocationActivity.java: 52) at java.lang.reflect.Method.invoke (собственный метод) на android.view.View $ DeclaredOnClickListener.onClick (View.java:4456) на android.view.View.performClick (View.java: 5207) на android.view.View $ PerformClick.run (View.java:21177) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java: 95) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java:5441) на java.lang.reflect.Method.invoke (собственный метод) at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:738) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 628)
Я выполнил условие, что если функция getLocation() возвращает значение null, то она отобразит диалоговое окно предупреждения. Вместо этого он отображает исключение Null Pointer Exception, когда я нажимаю кнопку.
Я уже зарегистрировал методы onClick (mGPS и mNW) в файле XML.
Возможный дубликат [Что такое NullPointerException, и как это исправить?] (HTTP: // StackOverflow .com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Marvin
Спасибо, но я уже знаю, что такое NullPointerException. Но моя проблема заключается в том, что, несмотря на то, что в mGPS() и mNW() задано условие else, для обработки этого нулевого кода генерируется исключение. – pragam
Добро пожаловать в StackOverflow. Этот «дублированный» комментарий означает, что вам нужно больше времени, чтобы узнать, что именно пусто, прежде чем размещать вопрос здесь, спрашивая, почему это может быть так. Как узнать? Если вы мало знаете о программировании, начните с чтения связанного сообщения. Если вы знаете, как отлаживать или как писать в Logcat, сейчас самое подходящее время для этого. Что является нулевым в вашем коде? – 0X0nosugar