2017-02-02 2 views
-1

Эй, ребята, я пытаюсь найти координаты текущего устройства с использованием 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.

+2

Возможный дубликат [Что такое NullPointerException, и как это исправить?] (HTTP: // StackOverflow .com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Marvin

+0

Спасибо, но я уже знаю, что такое NullPointerException. Но моя проблема заключается в том, что, несмотря на то, что в mGPS() и mNW() задано условие else, для обработки этого нулевого кода генерируется исключение. – pragam

+1

Добро пожаловать в StackOverflow. Этот «дублированный» комментарий означает, что вам нужно больше времени, чтобы узнать, что именно пусто, прежде чем размещать вопрос здесь, спрашивая, почему это может быть так. Как узнать? Если вы мало знаете о программировании, начните с чтения связанного сообщения. Если вы знаете, как отлаживать или как писать в Logcat, сейчас самое подходящее время для этого. Что является нулевым в вашем коде? – 0X0nosugar

ответ

2

Но моя проблема в том, что несмотря на то, учитывая условие еще в MGPS() и MNW() для обработки нулевого этого кода бросает исключение

Вашего исключением является бросить потому что if утверждения оцениваются, но переменная равна нулю.

if (locationManager.isProviderEnabled(provider)) { 

Это правильная нуль-чек.

if (locationManager != null && locationManager.isProviderEnabled(provider)) { 

} else { 

} 

Вы фактически должны инициализировать переменную и поместить строку, как это в OnCreate

locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); 
0

Вы не инициализирует ваш locationManager, поэтому при вызове locationManager.isProviderEnabled(provider) он не с NullPointerException

Это показано в вашем трассировки стека, здесь

Вызванный: java.lang.NullPointerException : Попытка вызвать виртуальный метод 'булево android.location.LocationManager.isProviderEnabled (java.lang.String)' на нулевой ссылки на объект

Смежные вопросы