Android 三星Note 2 can';t到达onLocationChanged()
除Galaxy Note 2外,它适用于大多数设备。它连接到Google客户端,但无法访问实现Android 三星Note 2 can';t到达onLocationChanged(),android,samsung-mobile,android-location,Android,Samsung Mobile,Android Location,除Galaxy Note 2外,它适用于大多数设备。它连接到Google客户端,但无法访问实现LocationListener的onLocationChanged()。有人知道这是什么原因,为什么只有在这个设备上 @Override public void onLocationChanged(Location location) { mLastLocation = location; if (mLastLocation != null) { lat = mLa
LocationListener
的onLocationChanged()
。有人知道这是什么原因,为什么只有在这个设备上
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
if (mLastLocation != null) {
lat = mLastLocation.getLatitude();
lng = mLastLocation.getLongitude();
Toast.makeText(getApplicationContext(), String.valueOf(lat) + "/" + String.valueOf(lng), Toast.LENGTH_LONG).show();
serverUrl = "http://(my server)/offers?lat=" + String.valueOf(mLastLocation.getLatitude())
+ "&lng=" + String.valueOf(mLastLocation.getLongitude()) + "&distance=1";
// save
makeTag(serverUrl);
// after getting location data - unregister listener
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mFusedLocationCallback);
new GetBackgroundUpdate().execute();
} else {
// get data from server and update GridView
new GetBackgroundUpdate().execute();
Toast.makeText(getApplicationContext(), R.string.no_location_detected, Toast.LENGTH_LONG).show();
}
/**
Location methods
*/
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
/**
* Runs when a GoogleApiClient object successfully connects.
*/
@Override
public void onConnected(Bundle connectionHint) {
// 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.
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(500);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mFusedLocationCallback);
}
@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());
if (mResolvingError) {
// Already attempting to resolve an error.
return;
} else if (result.hasResolution()) {
try {
mResolvingError = true;
result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
} catch (IntentSender.SendIntentException e) {
// There was an error with the resolution intent. Try again.
mGoogleApiClient.connect();
}
} else {
// Show dialog using GooglePlayServicesUtil.getErrorDialog()
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(String.valueOf(result.getErrorCode()))
.setCancelable(false)
.setNegativeButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
mResolvingError = true;
}
//new GetBackgroundUpdate().execute();
}
@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();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
编辑:从注释中发生
NullPointerException
的那一行,只需确保mLastLocation
不为空即可
if (mLastLocation != null){
address = server + String.valueOf(mLastLocation.getLatitude()) + "&lng=" + String.valueOf(mLastLocation.getLongitude()) + "&distance=" + distance;
}
另一件需要注意的事情是,在使用之前,您应该始终确保mgoogleapclient
不为null且未连接
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()){
//..... use mGoogleApiClient.....
}
您还应该添加一项检查,查看Google Play服务是否可用,因为有时设备上可用的版本低于您编译应用程序时使用的版本。如果是这样,您可以显示一个对话框
下面是如何检查Google Play服务是否可用
private boolean isGooglePlayServicesAvailable() {
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == status) {
return true;
} else {
GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
return false;
}
}
请注意,getLastLocation()
具有返回null的高趋势,因此,如果第一次调用getLastLocation()
见此帖: 以下是如何注册
LocationListener
的指南:
创建侦听器:
LocationCallback mFusedLocationCallback = new LocationCallback();
类别定义:
private class LocationCallback implements LocationListener {
public LocationCallback() {
}
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
lat = String.valueOf(mLastLocation.getLatitude());
lng = String.valueOf(mLastLocation.getLongitude());
}
};
然后只需注册LocationListener
:
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(minTime);
mLocationRequest.setFastestInterval(fastestTime);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setSmallestDisplacement(distanceThreshold);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mFusedLocationCallback);
编辑:在注册位置回调之前,应该等待API连接,它应该是这样的:
/**
* Runs when a GoogleApiClient object successfully connects.
*/
@Override
public void onConnected(Bundle connectionHint) {
// 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.
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
lat = String.valueOf(mLastLocation.getLatitude());
lng = String.valueOf(mLastLocation.getLongitude());
} else {
Toast.makeText(this, R.string.no_location_detected, Toast.LENGTH_LONG).show();
}
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(500);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mFusedLocationCallback);
}
文件:和
最后一件事,请确保您的AndroidManifest.xml中的应用程序标记中有以下内容:
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
distance filter.java中的第90行是什么?address=server+String.valueOf(mLastLocation.getLatitude())+“&lng=“+String.valueOf(mLastLocation.getLongitude())+”&distance=“+distance;您尚未发布该代码..请也发布相关代码..当您引用它时,mLastLocation
似乎为null。我是否应该使用if(mgoogleapclient!=null&&mgoogleapclient.isConnected()&&mLastLocation!=null)?它会随时检查一切once@jeand“这取决于你在做什么。您不希望在此行之前同时检查所有三个:mLastLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient)
请注意,getLastLocation()
具有返回null的高趋势,因此更好的方法是在获得null值时注册位置侦听器。请参阅本文:我将尝试使用location listener,因为我的应用程序完全依赖于位置。@jeand'arme请确保您的兄弟拥有更新版本的Google Play Services。如果需要升级,他应该从getErrorDialog()
调用中得到升级提示。关于维护状态的事情我不太清楚,等我有时间的时候再查。@jeand'arme是的,那肯定是问题所在。现在的问题是,问题的根本原因是什么,是什么阻止了它正常工作!