2017-10-11 1 views
0

Je crée une application qui nécessite l'emplacement du périphérique. Je n'ai aucun problème avec les autorisations et l'emplacement est stocké dans l'objet Location. Les latitudes et les longitudes de l'objet sont également affichées dans les vues de texte. Cependant, quand j'écris:Impossible de stocker la latitude ou la longitude dans la chaîne à partir de l'objet Emplacement

double d = mLastLocation.getLatitude(); 

l'application se bloque.

Le code que je l'ai écrit est:

import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.annotation.NonNull; 

import android.support.design.widget.Snackbar; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 

import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.google.android.gms.location.FusedLocationProviderClient; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.database.ChildEventListener; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import java.util.ArrayList; 
import java.util.Map; 

public class NodeList extends AppCompatActivity { 

    private static final String TAG = MainActivity.class.getSimpleName(); 
    private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34; 
    private FusedLocationProviderClient mFusedLocationClient; 
    private Location mLastLocation; 
    private TextView lat; 
    private TextView lon; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_node_list); 
     mListView = (ListView)findViewById(R.id.listView); 
     myRef = FirebaseDatabase.getInstance().getReference().child("Users"); 
     arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, latitudes); 
     mListView.setAdapter(arrayAdapter); 
     mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 
     lat = (TextView)findViewById(R.id.recLat); 
     lon = (TextView)findViewById(R.id.recLon); 
     getLastLocation(); 
     double d = mLastLocation.getLatitude(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     if (!checkPermissions()) { 
      requestPermissions(); 
     } 
    } 



    private void startLocationPermissionRequest() { 
     ActivityCompat.requestPermissions(NodeList.this, 
       new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, 
       REQUEST_PERMISSIONS_REQUEST_CODE); 
    } 

    private void requestPermissions() { 
     boolean shouldProvideRationale = 
       ActivityCompat.shouldShowRequestPermissionRationale(this, 
         android.Manifest.permission.ACCESS_COARSE_LOCATION); 
     if (shouldProvideRationale) { 
      Log.i(TAG, "Displaying permission rationale to provide additional context."); 

      showSnackbar(R.string.permission_rationale, android.R.string.ok, 
        new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          // Request permission 
          startLocationPermissionRequest(); 
         } 
        }); 
     } else { 
      Log.i(TAG, "Requesting permission"); 
      startLocationPermissionRequest(); 
     } 
    } 

    @SuppressWarnings("MissingPermission") 
    private void getLastLocation() { 
     mFusedLocationClient.getLastLocation() 
       .addOnCompleteListener(this, new OnCompleteListener<Location>() { 
        @Override 
        public void onComplete(@NonNull Task<Location> task) { 
         if (task.isSuccessful() && task.getResult() != null) { 
          mLastLocation = task.getResult(); 
          lat.setText("Latitude: " + Double.toString(mLastLocation.getLatitude())); 

          lon.setText("Longitude: "+Double.toString(mLastLocation.getLongitude())); 
         } else { 
          Log.w(TAG, "getLastLocation:exception", task.getException()); 
          showSnackbar(getString(R.string.no_location_detected)); 
         } 
        } 
       }); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
              @NonNull int[] grantResults) { 
     Log.i(TAG, "onRequestPermissionResult"); 
     if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) { 
      if (grantResults.length <= 0) { 
       Log.i(TAG, "User interaction was cancelled."); 
      } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       getLastLocation(); 
      } else { 
       showSnackbar(R.string.permission_denied_explanation, R.string.settings, 
         new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           // Build intent that displays the App settings screen. 
           Intent intent = new Intent(); 
           intent.setAction(
             Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
           Uri uri = Uri.fromParts("package", 
             BuildConfig.APPLICATION_ID, null); 
           intent.setData(uri); 
           intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
           startActivity(intent); 
          } 
         }); 
      } 
     } 
    } 

} 

Cela commence vraiment à me frustrer car je ne peux pas comprendre ce que l'erreur est.

L'erreur dans le chat journal est:

10-11 12:58:51.817 9285-9285/com.mohana.pdc E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mohana.pdc/com.mohana.pdc.NodeList}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
                    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6123) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 
                    at com.mohana.pdc.NodeList.onCreate(NodeList.java:83) 
                    at android.app.Activity.performCreate(Activity.java:6672) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)  
                    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)  
                    at android.os.Handler.dispatchMessage(Handler.java:102)  
                    at android.os.Looper.loop(Looper.java:154)  
                    at android.app.ActivityThread.main(ActivityThread.java:6123)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)  
10-11 12:58:52.048 9285-9285/com.mohana.pdc E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.mohana.pdc, PID: 9285 
                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mohana.pdc/com.mohana.pdc.NodeList}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
                    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6123) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference 
                    at com.mohana.pdc.NodeList.onCreate(NodeList.java:83) 
                    at android.app.Activity.performCreate(Activity.java:6672) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)  
                    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)  
                    at android.os.Handler.dispatchMessage(Handler.java:102)  
                    at android.os.Looper.loop(Looper.java:154)  
                    at android.app.ActivityThread.main(ActivityThread.java:6123)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)  

Merci à l'avance!

+0

Conversion de la double chaîne à String.valueOf (mLastLocation.getLatitude()) – Rajasekhar

+0

J'ai essayé de faire cela, il est encore écraser –

+0

votre journal de publier accident – Rajasekhar

Répondre

1

Votre méthode getLastLocation() met à jour votre variable mLastLocationde façon asynchrone. Vous pouvez voir que c'est asynchrone par le fait que vous deviez utiliser un OnCompleteListener.

Ce que cela signifie est que lorsque vous écrivez:

getLastLocation(); 
double d = mLastLocation.getLatitude(); 

chances sont extrêmement élevé que mLastLocation est encore nulle à ce point, et que votre application va planter avec un NullPointerException.

Vous devrez déplacer tout ce qui dépend de mLastLocation dans le rappel, ou fournir un autre moyen de garantir que le rappel a été exécuté avant d'essayer d'utiliser mLastLocation.

+0

Ainsi cela fonctionnera-t-il si j'écris l'instruction dans onStart() ou onResume()? –

+0

Pas nécessairement. Il est plus probable que cela fonctionne, mais il pourrait facilement encore être «nul» à ce moment-là. –

+0

Une fonction de délai pour une période de 5 ou 10 secondes fonctionnerait correctement? –

0

vous pouvez convertir Double à cordes comme ce

String latitudeStr=String.valueOf(mLastLocation.getLatitude());