但在我使用googleapi对话框启用GPS之后,我仍然总是在onActivityResult中得到结果\u失败。
有人能告诉我吗
为什么LocationManager位置更新停止工作,如果我使用谷歌Api对话框启用GPS,也如果我手动启用GPS?谢谢!
我需要一些关于这个问题的信息和帮助。
public class EnableLocationCallback implements OnCompleteListener<LocationSettingsResponse> {
// Millis Interval
private static final long MILLIS_FASTEST_INTERVAL = 1000L;
private static final long MILLIS_INTERVAL = MILLIS_FASTEST_INTERVAL * 0xA;
private Activity mActivity;
private int mRequestCode;
public static void requestEnableLocation(Activity activity, int requestCode){
new EnableLocationCallback(activity, requestCode).requestEnableLocation();
}
private EnableLocationCallback(Activity activity, int requestCode){
mActivity = activity;
mRequestCode = requestCode;
}
/** Override OnCompleteListener<LocationSettingsResponse> Methods **/
@Override
public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
try {
task.getResult(ApiException.class);
} catch (ApiException ex){
switch (ex.getStatusCode()){
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
((ResolvableApiException) ex).startResolutionForResult(mActivity, mRequestCode);
} catch (IntentSender.SendIntentException e) {
openGpsEnabledSettings();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
openGpsEnabledSettings();
break;
}
}
}
/** Private Methods **/
private void requestEnableLocation(){
getSettingsClient(mActivity)
.checkLocationSettings(getLocationSettingsRequest())
.addOnCompleteListener(this);
}
private LocationRequest getLocationRequest(){
return LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(MILLIS_INTERVAL)
.setFastestInterval(MILLIS_FASTEST_INTERVAL);
}
private LocationSettingsRequest getLocationSettingsRequest(){
return new LocationSettingsRequest.Builder()
.addLocationRequest(getLocationRequest())
.setAlwaysShow(true)
.build();
}
private void openGpsEnabledSettings(){
mActivity.startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), mRequestCode);
}
}
我还尝试将这个类改为:
public class EnableLocationCallback implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
// Millis Interval
private static final long MILLIS_FASTEST_INTERVAL = Constants.MILLIS_ONE_SECOND * 0x5;
private static final long MILLIS_INTERVAL = Constants.TIMEOUT_GET_POSITION;
private GoogleApiClient mGoogleApiClient;
private Activity mActivity;
private int mRequestCode;
public static void requestEnableLocation(Activity activity, int requestCode){
EnableLocationCallback instance = new EnableLocationCallback(activity, requestCode);
instance.initGoogleApiClient();
instance.initLocationSettingResultCallback();
}
private EnableLocationCallback(Activity activity, int requestCode){
mActivity = activity;
mRequestCode = requestCode;
}
/** Override GoogleApiClient.ConnectionCallbacks Methods **/
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
/** Override GoogleApiClient.OnConnectionFailedListener Methods **/
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
/** Private Methods **/
private void initGoogleApiClient(){
mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.build();
mGoogleApiClient.connect();
}
private void initLocationSettingResultCallback(){
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, getLocationSettingsRequest()).setResultCallback(
result -> {
final Status status = result.getStatus();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(mActivity, mRequestCode);
} catch (IntentSender.SendIntentException e) {
openGpsEnabledSettings();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
openGpsEnabledSettings();
break;
}
}
);
}
private void requestEnableLocation(){
getSettingsClient(mActivity)
.checkLocationSettings(getLocationSettingsRequest());
}
private LocationRequest getLocationRequest(){
return LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(MILLIS_INTERVAL)
.setFastestInterval(MILLIS_FASTEST_INTERVAL);
}
private LocationSettingsRequest getLocationSettingsRequest(){
return new LocationSettingsRequest.Builder()
.addLocationRequest(getLocationRequest())
.setAlwaysShow(true)
.build();
}
private void openGpsEnabledSettings(){
mActivity.startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), mRequestCode);
}
}
在我的活动“onActivityResult”中,我总是得到resultCode==-0x1(所以失败)。
我还看到,在我开始使用此代码后,我使用此代码进行位置更新的所有部分(单个更新或多个更新):
mLocationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mUserPositionListener, null);
所有这些部分都停止工作了。
我还想看看关于“Google SettingsClient”、“GoogleApi<Api.ApiOptions.NoOptions>".
我找过了,但没找到好医生。
例如。。。google page只是告诉你一点,我没有告诉你在扩展了超级构造函数的类之后应该传递给超级构造函数什么,还有很多其他的东西:/
祝你有一个美好的编码和美好的一天:D
我修复了LocationManager更新,改为使用“FusedLocationManager”,并使用正确的LocationListener进行位置更新。
public class EnableLocationCallback implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener {
public interface OnLocationUpdateCallback {
void onLocationUpdate();
}
private static final String TAG = EnableLocationCallback.class.getSimpleName();
// Millis Interval
private static final long MILLIS_FASTEST_INTERVAL = Constants.MILLIS_ONE_SECOND * 0x5;
private static final long MILLIS_INTERVAL = Constants.TIMEOUT_GET_POSITION;
private OnLocationUpdateCallback mCallback;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private LocationSettingsRequest mLocationSettingsRequest;
private Activity mActivity;
private int mRequestCode;
public static EnableLocationCallback requestEnableLocation(Activity activity, int requestCode){
EnableLocationCallback mInstance = new EnableLocationCallback(activity, requestCode);
mInstance.initGoogleApiClient();
mInstance.initLocationSettingResultCallback();
return mInstance;
}
public static EnableLocationCallback initInstance(Activity activity){
EnableLocationCallback mInstance = new EnableLocationCallback(activity);
mInstance.initGoogleApiClient();
return mInstance;
}
private EnableLocationCallback(Activity activity, int requestCode){
this(activity);
mRequestCode = requestCode;
}
private EnableLocationCallback(Activity activity){
mActivity = activity;
initGoogleApiClient();
initLocationRequest();
initLocationSettingsRequest();
}
/** Override GoogleApiClient.ConnectionCallbacks Methods **/
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
/** Override GoogleApiClient.OnConnectionFailedListener Methods **/
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
/** Override Methods **/
@Override
public void onLocationChanged(Location location) {
PositionUtils.setLastUserPosition(new Position(location.getLatitude(), location.getLongitude()));
if(mCallback != null){
mCallback.onLocationUpdate();
}
}
/** Public Methods **//** Getter Methods **/
public GoogleApiClient getGoogleApiClient(){
return mGoogleApiClient;
}
public LocationRequest getLocationRequest(){
return mLocationRequest;
}
/** Setter Methods **/
public EnableLocationCallback setCallback(OnLocationUpdateCallback callback){
mCallback = callback;
return this;
}
public EnableLocationCallback setRequestCode(int requestCode){
mRequestCode = requestCode;
return this;
}
/** Check Methods **/
public boolean isGoogleApiClientConnected(){
return mGoogleApiClient != null && mGoogleApiClient.isConnected();
}
/** Location Methods **/
public void requestEnableLocation(int requestCode){
setRequestCode(requestCode);
initLocationSettingResultCallback();
}
public void startLocationUpdates(){
try {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
} catch (SecurityException sE){
EMaxLogger.onException(TAG, sE);
} catch (Exception e){
EMaxLogger.onException(TAG, e);
}
}
public void stopLocationUpdates(){
try {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
} catch (SecurityException sE){
EMaxLogger.onException(TAG, sE);
} catch (Exception e){
EMaxLogger.onException(TAG, e);
}
}
/** Private Methods **/
private void initGoogleApiClient(){
mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.build();
mGoogleApiClient.connect();
}
private void initLocationRequest(){
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(MILLIS_INTERVAL)
.setFastestInterval(MILLIS_FASTEST_INTERVAL);
}
private void initLocationSettingsRequest(){
mLocationSettingsRequest = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest)
.setAlwaysShow(true)
.build();
}
private void initLocationSettingResultCallback(){
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest).setResultCallback(
result -> {
final Status status = result.getStatus();
final LocationSettingsStates state = result.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(mActivity, mRequestCode);
} catch (IntentSender.SendIntentException e) {
openGpsEnabledSettings();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
openGpsEnabledSettings();
break;
}
}
);
}
/** Location Methods **/
private void requestEnableLocation(){
getSettingsClient(mActivity)
.checkLocationSettings(mLocationSettingsRequest);
}
private void openGpsEnabledSettings(){
mActivity.startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), mRequestCode);
}
}
Janishar Ali Answer Link