2016-08-30 7 views
0

Я разработал приложение, которое требует местоположения GPS, и я получаю его, но если это местоположение не включено, я перенаправляю пользователя к настройкам, чтобы включить его.Возвращение слишком быстро от предоставления разрешения на размещение не найдено.

Все работает нормально, если я не делаю это быстро, но если при открытии меню настроек я активирую его и сразу вернусь к приложению, это приведет к нулевому местоположению.

Возможно ли «дождаться появления приложения?»

EDIT

08-30 14:48:35.094 6878-6878/d.g.movida E/AndroidRuntime: FATAL EXCEPTION: main 
                 Process: d.g.movida, PID: 6878 
                 java.lang.RuntimeException: Unable to resume activity {d.g.movida/d.g.movida.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLongitude()' on a null object reference 
                  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156) 
                  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:158) 
                  at android.app.ActivityThread.main(ActivityThread.java:7229) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLongitude()' on a null object reference 
                  at d.g.movida.MainActivity.updateList(MainActivity.java:121) 
                  at d.g.movida.MainActivity.onResume(MainActivity.java:342) 
                  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1286) 
                  at android.app.Activity.performResume(Activity.java:6987) 
                  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145) 
                  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250)  
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839)  
                  at android.os.Handler.dispatchMessage(Handler.java:102)  
                  at android.os.Looper.loop(Looper.java:158)  
                  at android.app.ActivityThread.main(ActivityThread.java:7229)  
                  at java.lang.reflect.Method.invoke(Native Method)  
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  

проверить, если сеть/GPS включен, прежде чем читать расположение и это.

Затем я проверяю, имеет ли место значение null до его получения (отключено, чтобы получить эту ошибку).

+0

Может ли downvoter подробно остановиться на аргументации для -1? – DomeWTF

+1

, можете ли вы отправить код, в котором вы получаете пустое исключение? –

ответ

0

Ниже приведен код, который я использовал для решения этой проблемы. Он должен вызываться в отдельной функции, которая гарантирует, что он инициализируется до того, как на нем будут сделаны вызовы.

Например, мое приложение использует карту google и вызывает эту функцию в обратном вызове onMapReady.

Это лучший способ попросить местоположение включить, а не направлять пользователя с намерением активности настроек.

public void requestLocationPermissions() { 

    mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this).build(); 
    mGoogleApiClient.connect(); 

    LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
      .addLocationRequest(locationRequest); 
    builder.setAlwaysShow(true); 

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 

     @Override 
     public void onResult(LocationSettingsResult locationSettingsResult) { 
      final Status status = locationSettingsResult.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        Log.i(TAG, "All location settings are satisfied."); 
        //startLocationUpdates(); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + 
          "upgrade location settings "); 

        try { 
         // Show the dialog by calling startResolutionForResult(), and check the result 
         // in onActivityResult(). 
         status.startResolutionForResult(getActivity(), 1000); 

        } catch (IntentSender.SendIntentException e) { 
         Log.i(TAG, "PendingIntent unable to execute request."); 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + 
          "not created."); 
        break; 
      } 
     } 
    }); 
} 
+0

Я попробую и вернусь к вам, спасибо. – DomeWTF

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

  • Нет связанных вопросов^_^