Android 三星Note 2 can';t到达onLocationChanged()

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

除Galaxy Note 2外,它适用于大多数设备。它连接到Google客户端,但无法访问实现
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是的,那肯定是问题所在。现在的问题是,问题的根本原因是什么,是什么阻止了它正常工作!