Java android应用程序在最后一次位置检查时停止
我正在尝试将设备的位置输入我的android应用程序。我曾尝试使用android开发者网站上概述的指南,但每当我在手机上运行代码时,应用程序就会立即停止。我的代码是:Java android应用程序在最后一次位置检查时停止,java,android,geolocation,location,Java,Android,Geolocation,Location,我正在尝试将设备的位置输入我的android应用程序。我曾尝试使用android开发者网站上概述的指南,但每当我在手机上运行代码时,应用程序就会立即停止。我的代码是: public class MainActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener{ protected static final String TAG = "MainActivity
public class MainActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener{
protected static final String TAG = "MainActivity";
protected GoogleApiClient mGoogleApiClient;
protected Location mLastLocation;
protected Double lonValue;
protected Double latValue;
protected String mLatitudeLabel;
protected String mLongitudeLabel;
protected TextView mLatitudeText;
protected TextView mLongitudeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView lonView = (TextView) findViewById(R.id.lon);
buildGoogleApiClient();
//connect to parse backend
Parse.initialize(this, "xxxx", "xxxx");
ParseInstallation.getCurrentInstallation().saveInBackground();
Log.d("myInstallation Id", ParseInstallation.getCurrentInstallation().getInstallationId());
//get location
lonValue = mLastLocation.getLatitude();
latValue = mLastLocation.getLongitude();
//text update
}
public void openLocation(View v){
startActivity(new Intent(MainActivity.this, LocationActivity.class));
}
@Override
public void onConnected(Bundle bundle) {
//check build version on phone
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//check that app has permission to access data
if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//get information from location service
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
Log.d(TAG,mLatitudeLabel);
}
}
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
// Provides a simple way of getting a device's location and is well suited for
// applications that do not require a fine-grained location and that do not need location
// updates. Gets the best and most recent location currently available, which may be null
// in rare cases when a location is not available.
buildGoogleApiClient();
Toast.makeText(MainActivity.this, "Should have network", Toast.LENGTH_SHORT).show();
}
/**
* Builds a GoogleApiClient. Uses the addApi() method to request the LocationServices API.
*/
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
@Override
public void onConnectionFailed(ConnectionResult result) {
// Refer to the javadoc for ConnectionResult to see what error codes might be returned in
// onConnectionFailed.
Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
}
@Override
public void onConnectionSuspended(int cause) {
// The connection to Google Play services was lost for some reason. We call connect() to
// attempt to re-establish the connection.
Log.i(TAG, "Connection suspended");
mGoogleApiClient.connect();
}
}
logcat
02-28 18:45:08.848
4048-4048/com.worcestercomputing.ryanlambert.toletstall
E/AndroidRuntime:致命异常:主
进程:com.worcestercomputing.ryanlambert.toiletsall,PID:4048
java.lang.RuntimeException:无法启动活动
ComponentInfo{com.worcestercomputing.ryanlambert.toletstall/com.worcestercomputing.ryanlambert.toletstall.MainActivity}:
java.lang.NullPointerException:尝试调用虚拟方法
空对象上的“double android.location.location.getLatitude()”
参考
在
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
在
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
位于android.app.ActivityThread.-wrap11(ActivityThread.java)
在
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
原因:java.lang.NullPointerException:尝试调用虚拟机
方法“double android.location.location.getLatitude()”在空
对象引用
在
com.worcestercomputing.ryanlambert.toletstall.MainActivity.onCreate(MainActivity.java:63)
位于android.app.Activity.performCreate(Activity.java:6251)
在
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
在
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
在
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
位于android.app.ActivityThread.-wrap11(ActivityThread.java)
在
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
很明显,问题是你打电话
//get location
lonValue = mLastLocation.getLatitude();
latValue = mLastLocation.getLongitude();
在Activity.onCreate()
中。
但是当时mLastLocation
仍然是null
请注意,
onCreate(Bundle)
是活动生命周期回调,您可以在其中初始化活动-这是创建活动的新实例时首先调用的。您是否也可以发布日志猫..您是否在模拟器上运行它?您必须分别通过纬度和经度才能在模拟器上工作。此外,在现实生活中,getLastLocation有时会返回null(用户可能从购买手机的那天起就禁用了location),因此您应该在物理设备上运行null check.im。我如何实现对这个的空检查?(很抱歉,只是学习一些技巧)使用简单的if/else语句就可以了。检查mLastLocat是否正确