2016-11-07 70 views
0

我使用CheckLocationSettings来检查位置是否启用。这在我的Galaxy S5上工作正常。但是,在模拟器android kitkat 4.4中,LocationSettingsResult始终为6(ResolutionRequired),无论位置是启用还是禁用。 另外,如果我回答位置请求弹出用YES,则OnActivityResult总是RESULT_CANCELEDLocationSettings kitkat模拟器结果取消

我使用xamarin,所以一些地方寻找不同:

protected void buildGoogleApiClient() 
     { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .AddConnectionCallbacks(this) 
      .AddOnConnectionFailedListener(this) 
      .AddApi(LocationServices.API) 
      .Build(); 
     } 

     protected void createLocationRequest() 
     { 
      mLocationRequest = new LocationRequest(); 

      mLocationRequest.SetInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 

      mLocationRequest.SetFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

      mLocationRequest.SetPriority(LocationRequest.PriorityLowPower); 
     } 

     protected void buildLocationSettingsRequest() 
     { 
      LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
      builder.AddLocationRequest(mLocationRequest); 
      builder.SetAlwaysShow(true); 
      mLocationSettingsRequest = builder.Build(); 
     } 

     protected async Task CheckLocationSettings() 
     { 
      var result = await LocationServices.SettingsApi.CheckLocationSettingsAsync(
       mGoogleApiClient, mLocationSettingsRequest); 
      await HandleResult(result); 
     } 


     public async Task HandleResult(LocationSettingsResult locationSettingsResult) 
     { 
      var status = locationSettingsResult.Status; 
      switch (status.StatusCode) 
      { 
       case CommonStatusCodes.Success: 
        await getlastknownlocation(); 
        break; 
       case CommonStatusCodes.ResolutionRequired: 

        try 
        { 
         status.StartResolutionForResult(this, REQUEST_CHECK_SETTINGS); 
        } 
        catch (IntentSender.SendIntentException) 
        { 

        } 
        break; 
       case LocationSettingsStatusCodes.SettingsChangeUnavailable: 
        break; 
      } 
     } 


       protected override async void OnActivityResult(int requestCode, Result resultCode, Intent data) 
     { 
      switch (requestCode) 
      { 
       case REQUEST_CHECK_SETTINGS: 
        switch (resultCode) 
        { 
         case Result.Ok: 
          await getlastknownlocation(); 
          break; 
         case Result.Canceled: 
          break; 
        } 
        break; 
      } 
     } 

THX

回答

0

如果你得到一个RESOLUTION_REQUIRED (C#:ResolutionRequired),您需要询问用户的许可。

RESOLUTION_REQUIRED的状态代码表示必须更改设置。要提示用户修改位置设置的权限,请调用startResolutionForResult(Activity,int)。此方法会弹出一个对话框,询问用户是否有权修改位置设置。

呼叫StartResolutionForResult一个结果代码,你可以在OnActivityResult检查,以确定用户是否准予许可或不:

if (status.StatusCode == LocationSettingsStatusCodes.ResolutionRequired) 
{ 
    status.StartResolutionForResult(this, 9999); 
} 

编号:https://developer.android.com/training/location/change-location-settings.html

+0

喜,THX你的答案。然而,这已经在上面的代码中实现了...尝试 status.StartResolutionForResult(this,REQUEST_CHECK_SETTINGS); } catch(IntentSender.SendIntentException) { } – markus

+0

现在也尝试使用android 5.0仿真器,结果相同。接受权限请求后,结果始终为RESULT_CANCELED,并且无论位置是启用还是禁用,都会显示权限请求消息。和android 4.4一样 – markus