2017-10-11 48 views
0

我正在制作一个需要设备位置的应用程序。我对权限没有任何问题,位置正在存储在Location对象中。对象的纬度和经度也在文本视图中显示。但是,当我写:无法在位置对象的字符串中存储经度或纬度

double d = mLastLocation.getLatitude(); 

该应用程序崩溃。

我写的代码是:

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); 
          } 
         }); 
      } 
     } 
    } 

} 

这是真的开始阻挠我,我不能找出的错误是什么。

在日志猫的错误是:提前

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)  

谢谢!

+0

从double转换为字符串将String.valueOf(mLastLocation.getLatitude()) – Rajasekhar

+0

我试图做的是,它仍然崩溃 –

+0

发表您的崩溃日志 – Rajasekhar

回答

1

您的方法getLastLocation()异步更新您的mLastLocation变量。你可以看到它是异步的,因为你必须使用OnCompleteListener

这意味着,当你写:

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

机会是非常mLastLocation仍是空在这一点上,所以您的应用程序将与NullPointerException崩溃。

你必须移动任何东西依赖于mLastLocation步入回调,或提供低保您尝试使用mLastLocation前的回调已经执行的一些其他的方式。

+0

因此,如果我在onStart()或onResume()中写入语句,它会起作用吗? –

+0

不一定。它很可能会工作,但在那时它可能仍然是“空”。 –

+0

5秒或10秒的延迟功能可以正常工作吗? –

0

你可以double转换成字符串这样

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