【问题标题】:Turn on location services without navigating to settings page在不导航到设置页面的情况下打开位置服务
【发布时间】:2016-01-19 23:33:30
【问题描述】:

与提示用户转到设置页面并启用位置服务并再次返回的传统方法不同,我注意到在一些最新应用中执行相同操作的更简单方法。

参考下面的屏幕截图,它会提示用户一键启用位置服务的对话框,它适用于这些应用程序。

我怎样才能达到同样的效果?

【问题讨论】:

  • 反对者能否提供原因?
  • 感谢您提出这个问题。投票赞成
  • @GAMA 这就是 stackoverflow 的工作原理!人们不需要理由来拒绝投票。同时也是一个充满敌意和伟大的社区!
  • @GAMA 只有一张反对票。 :)

标签: android location


【解决方案1】:

此对话框由 Google Play 服务中的LocationSettingsRequest.Builder 创建。

你需要给你的应用添加一个依赖build.gradle:

compile 'com.google.android.gms:play-services-location:10.0.1'

然后你可以使用这个最小的例子:

private void displayLocationSettingsRequest(Context context) {
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
            .addApi(LocationServices.API).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(10000 / 2);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    Log.i(TAG, "All location settings are satisfied.");
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");

                    try {
                        // Show the dialog by calling startResolutionForResult(), and check the result
                        // in onActivityResult().
                        status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException e) {
                        Log.i(TAG, "PendingIntent unable to execute request.");
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                    break;
            }
        }
    });
}

你可以找到完整的例子here

【讨论】:

  • 很抱歉,前两行我没看懂:You need to add a dependency to your app build.gradle: compile 'com.google.android.gms:play-services:8.1.0'
  • 您可以找到更多关于如何设置 Google Play 服务的信息here
  • build.gradle 在哪里?
  • 在您的应用程序模块目录中。通常目录名是app
  • SettingsApi 现已弃用。
【解决方案2】:

按照下面提到的步骤进行

1) 根据您的意愿创建LocationRequest

LocationRequest mLocationRequest = LocationRequest.create()
           .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
           .setInterval(10 * 1000)
           .setFastestInterval(1 * 1000);

2)创建LocationSettingsRequest.Builder

LocationSettingsRequest.Builder settingsBuilder = new LocationSettingsRequest.Builder()
               .addLocationRequest(mLocationRequest);
settingsBuilder.setAlwaysShow(true);

3) 使用以下代码获取LocationSettingsResponse Task

Task<LocationSettingsResponse> result = LocationServices.getSettingsClient(this)
              .checkLocationSettings(settingsBuilder.build());

注意: LocationServices.SettingsApi 已弃用,因此请改用 SettingsClient

4) 添加OnCompleteListener 以从Task 中获取结果。当Task 完成时,客户端可以通过查看LocationSettingsResponse 中的状态码来检查位置设置目的。

result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
    @Override
    public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
    try {
        LocationSettingsResponse response = 
                          task.getResult(ApiException.class);
        } catch (ApiException ex) {
            switch (ex.getStatusCode()) {
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        ResolvableApiException resolvableApiException = 
                                 (ResolvableApiException) ex;
                            resolvableApiException
                                   .startResolutionForResult(MapsActivity.this, 
                                         LOCATION_SETTINGS_REQUEST);
                    } catch (IntentSender.SendIntentException e) {

                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

                    break;
            }
        }
    }
});  

案例 1: LocationSettingsStatusCodes.RESOLUTION_REQUIRED :位置未启用,但我们可以通过提示用户使用对话框打开位置来要求用户启用位置(通过调用 startResolutionForResult) .

案例 2: LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE :不满足位置设置。但是,我们无法修复设置,因此我们不会显示对话框。

5) OnActivityResult 我们可以在位置设置对话框中获取用户操作。 RESULT_OK => 用户打开了位置。 RESULT_CANCELLED - 用户拒绝了位置设置请求。

【讨论】:

  • 您从哪里获得 LOCATION_SETTINGS_REQUEST?
  • @hayasiiiint,它是一个局部常量。稍后应在OnActivityResult 中使用。例如,请参阅 Ketan Ramani 在这里回答或github.com/android/location-samples/blob/…
【解决方案3】:

其工作原理类似于谷歌地图

在 build.gradle 文件中添加依赖

compile 'com.google.android.gms:play-services:8.3.0'

这个或那个

compile 'com.google.android.gms:play-services-location:10.0.1'

import android.content.Context;
import android.content.IntentSender;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;

import java.util.List;

public class LocationOnOff_Similar_To_Google_Maps extends AppCompatActivity {

    protected static final String TAG = "LocationOnOff";

    private GoogleApiClient googleApiClient;
    final static int REQUEST_LOCATION = 199;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setFinishOnTouchOutside(true);

        // Todo Location Already on  ... start
        final LocationManager manager = (LocationManager) LocationOnOff_Similar_To_Google_Maps.this.getSystemService(Context.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
            finish();
        }
        // Todo Location Already on  ... end

        if(!hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)){
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not Supported",Toast.LENGTH_SHORT).show();
        }

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not enabled",Toast.LENGTH_SHORT).show();
            enableLoc();
        }else{
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
        }
    }


    private boolean hasGPSDevice(Context context) {
        final LocationManager mgr = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (mgr == null)
            return false;
        final List<String> providers = mgr.getAllProviders();
        if (providers == null)
            return false;
        return providers.contains(LocationManager.GPS_PROVIDER);
    }

    private void enableLoc() {

        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(LocationOnOff_Similar_To_Google_Maps.this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle bundle) {

                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            googleApiClient.connect();
                        }
                    })
                    .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(ConnectionResult connectionResult) {

                            Log.d("Location error","Location error " + connectionResult.getErrorCode());
                        }
                    }).build();
            googleApiClient.connect();

            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(30 * 1000);
            locationRequest.setFastestInterval(5 * 1000);
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);

            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            try {
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                status.startResolutionForResult(LocationOnOff_Similar_To_Google_Maps.this, REQUEST_LOCATION);

                                finish();
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            }
                            break;
                    }
                }
            });
        }
    }

}

【讨论】:

【解决方案4】:
implementation 'com.google.android.gms:play-services-location:16.0.0'

变量声明

private SettingsClient mSettingsClient;
private LocationSettingsRequest mLocationSettingsRequest;
private static final int REQUEST_CHECK_SETTINGS = 214;
private static final int REQUEST_ENABLE_GPS = 516;

使用以下代码打开对话框

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(new LocationRequest().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY));
builder.setAlwaysShow(true);
mLocationSettingsRequest = builder.build();

mSettingsClient = LocationServices.getSettingsClient(YourActivity.this);

mSettingsClient
    .checkLocationSettings(mLocationSettingsRequest)
    .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            //Success Perform Task Here
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            int statusCode = ((ApiException) e).getStatusCode();
            switch (statusCode) {
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        ResolvableApiException rae = (ResolvableApiException) e;
                        rae.startResolutionForResult(YourActivity.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException sie) {
                        Log.e("GPS","Unable to execute request.");
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    Log.e("GPS","Location settings are inadequate, and cannot be fixed here. Fix in Settings.");
            }
        }
    })
    .addOnCanceledListener(new OnCanceledListener() {
        @Override
        public void onCanceled() {
            Log.e("GPS","checkLocationSettings -> onCanceled");
        }
    });

onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CHECK_SETTINGS) {
        switch (resultCode) {
            case Activity.RESULT_OK:
                //Success Perform Task Here
                break;
            case Activity.RESULT_CANCELED:
                Log.e("GPS","User denied to access location");
                openGpsEnableSetting();
                break;
        }
    } else if (requestCode == REQUEST_ENABLE_GPS) {
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        if (!isGpsEnabled) {
            openGpsEnableSetting();
        } else {
            navigateToUser();
        }
    }
}

private void openGpsEnableSetting() {
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivityForResult(intent, REQUEST_ENABLE_GPS);
}   

【讨论】:

  • 谢谢!如果您在片段中使用此代码,请参阅stackoverflow.com/a/39579124/2914140: 而不是rae.startResolutionForResult(activity, REQUEST_CHECK_SETTINGS) 调用startIntentSenderForResult(rae.getResolution().getIntentSender(), REQUEST_CHECK_SETTINGS, null, 0, 0, 0, null),否则不会调用onActivityResult()
  • @CoolMindThanks 可能用于需要此片段的人
  • @CoolMind,是否可以在openGpsEnableSetting()方法中使用类似于startIntentSenderForResult的东西?
  • @AlitonOliveira,你能详细描述一下吗?在代码openGpsEnableSetting() 中,只需启动一个对话框以启用 GPS 设置。完成后,onActivityResult() 会以 requestCode == REQUEST_ENABLE_GPS 调用。
  • onActivityResult() 是从 Activity 调用的,我想知道是否可以像 startIntentSenderForResult 一样将结果返回到 Fragment
【解决方案5】:

感谢 Mattia Maestrini +1

Xamarin 解决方案:

using Android.Gms.Common.Apis;
using Android.Gms.Location;

public const int REQUEST_CHECK_SETTINGS = 0x1;

private void DisplayLocationSettingsRequest()
{
    var googleApiClient = new GoogleApiClient.Builder(this).AddApi(LocationServices.API).Build();
    googleApiClient.Connect();

    var locationRequest = LocationRequest.Create();
    locationRequest.SetPriority(LocationRequest.PriorityHighAccuracy);
    locationRequest.SetInterval(10000);
    locationRequest.SetFastestInterval(10000 / 2);

    var builder = new LocationSettingsRequest.Builder().AddLocationRequest(locationRequest);
    builder.SetAlwaysShow(true);

    var result = LocationServices.SettingsApi.CheckLocationSettings(googleApiClient, builder.Build());
    result.SetResultCallback((LocationSettingsResult callback) =>
    {
        switch (callback.Status.StatusCode)
        {
            case LocationSettingsStatusCodes.Success:
                {
                    DoStuffWithLocation();
                    break;
                }
            case LocationSettingsStatusCodes.ResolutionRequired:
                {
                    try
                    {
                        // Show the dialog by calling startResolutionForResult(), and check the result
                        // in onActivityResult().
                        callback.Status.StartResolutionForResult(this, REQUEST_CHECK_SETTINGS);
                    }
                    catch (IntentSender.SendIntentException e)
                    {
                    }

                    break;
                }
            default:
                {
                    // If all else fails, take the user to the android location settings
                    StartActivity(new Intent(Android.Provider.Settings.ActionLocationSourceSettings));
                    break;
                }
        }
    });
}

protected override void OnActivityResult(int requestCode, Android.App.Result resultCode, Intent data)
{
    switch (requestCode)
    {
        case REQUEST_CHECK_SETTINGS:
            {
                switch (resultCode)
                {
                    case Android.App.Result.Ok:
                        {
                            DoStuffWithLocation();
                            break;
                        }
                    case Android.App.Result.Canceled:
                        {
                            //No location
                            break;
                        }
                }
                break;
            }
    }
}

注意:

这不适用于华为或其他未安装谷歌服务的设备。

【讨论】:

  • 它不工作!!你能分享完整的代码吗
  • 我正在尝试从 Android Activity 的 OnCreate 方法调用 DisplayLocationSettingsRequest() 方法。但不幸的是,我无法查看打开位置的 locationsettingrequest 弹出窗口。你能帮帮我吗?
  • @Omkar 您是否通过 Nuget 安装了 Xamarin.GooglePlayServices.Location?您是否包括using android.Gms.Common.Apis; using Android.Gms.Location; 上面的两行?致电LocationServices.SettingsApi.CheckLocationSettings 后,您是否在result.SetResultCallback( 内收到回调?在其中的每一个处放置一个断点并检查代码在做什么
  • 是的,我添加了所有先决条件。我收到的结果是 Id = 1,Status = WaitingForActivation,Method = (null)。但是这个等待时间是无限的,因为等了很久,没有收到结果。
【解决方案6】:

Android Marshmallow 6 支持运行时权限。运行时权限仅适用于 Marshmallow,并且在预 Marshmallow 上仍然可以使用旧方式。

您可以在此 Android 开发者官方视频中了解更多信息:

https://www.youtube.com/watch?v=C8lUdPVSzDk

并请求许可:http://developer.android.com/training/permissions/requesting.html

【讨论】:

  • Marshmallow API 是否可用于开发目的?
  • 那是否意味着通过截图显示的工作流只能实现 Marshmallow 和更高版本?
  • 是的,如文档中所述,它的 API 级别为 23,因此它仅适用于 Marshmallow 和更新版本。
  • 在我自己的自定义对话框中实现相同行为的任何方式
【解决方案7】:

感谢 Mattia Maestrini 的回答,我想补充一下

compile 'com.google.android.gms:play-services-location:8.1.0'

就够了。这可以防止您的应用包含不必要的库,并有助于减少方法数量。

【讨论】:

    【解决方案8】:

    Kotlin 解决方案

    添加build.gradle(Module:app)

    implementation 'com.google.android.gms:play-services-location:17.0.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    

    然后创建这个函数

    fun enablegps() {
    
        val mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(2000)
            .setFastestInterval(1000)
    
        val settingsBuilder = LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest)
        settingsBuilder.setAlwaysShow(true)
    
        val result = LocationServices.getSettingsClient(this).checkLocationSettings(settingsBuilder.build())
        result.addOnCompleteListener { task ->
    
            //getting the status code from exception
            try {
                task.getResult(ApiException::class.java)
            } catch (ex: ApiException) {
    
                when (ex.statusCode) {
    
                    LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {
    
                        Toast.makeText(this,"GPS IS OFF",Toast.LENGTH_SHORT).show()
    
                        // Show the dialog by calling startResolutionForResult(), and check the result
                        // in onActivityResult().
                        val resolvableApiException = ex as ResolvableApiException
                        resolvableApiException.startResolutionForResult(this,REQUEST_CHECK_SETTINGS
                        )
                    } catch (e: IntentSender.SendIntentException) {
                        Toast.makeText(this,"PendingIntent unable to execute request.",Toast.LENGTH_SHORT).show()
    
                    }
    
                    LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
    
                        Toast.makeText(
                            this,
                            "Something is wrong in your GPS",
                            Toast.LENGTH_SHORT
                        ).show()
    
                    }
    
    
                }
            }
    
    
    
        }
    
    
    }
    

    【讨论】:

      【解决方案9】:

      在最近的 Marshmallow 更新中,即使启用了位置设置,您的应用也需要明确请求许可。推荐的方法是显示应用程序的权限部分,用户可以在其中根据需要切换权限。执行此操作的代码 sn-p 如下:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
          if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    
              final AlertDialog.Builder builder = new AlertDialog.Builder(this);
              builder.setTitle("Location Permission");
              builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app.");
              builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialogInterface, int i) {
                      requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
    
                  }
              });
              builder.setNegativeButton(android.R.string.no, null);
              builder.show();
          }
      } else {
          // do programatically as show in the other answer 
      }
      

      并重写onRequestPermissionsResult方法如下:

      @Override
      public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
              switch (requestCode) {
                  case PERMISSION_REQUEST_COARSE_LOCATION: {
                      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                          Log.d(TAG, "coarse location permission granted");
                      } else {
                          Intent intent = new Intent();
                          intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                          Uri uri = Uri.fromParts("package", getPackageName(), null);
                          intent.setData(uri);
                          startActivity(intent);
                      }
                  }
              }
          }
      

      另一种方法是您也可以使用SettingsApi 来查询启用了哪些位置提供程序。如果没有启用,您可以提示一个对话框从应用程序内更改设置。

      【讨论】:

        【解决方案10】:

        如果您想替换 Fragment 中已弃用的 onActivityResultstartResolutionForResult,请参阅 https://stackoverflow.com/a/65816646/2914140

        val checkLocationSettings = 
            registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
                if (result.resultCode == RESULT_OK) {
                    // GPS is turned on in system settings.
                }
        }
        
        ...
        
        val intentSenderRequest = IntentSenderRequest.Builder(resolvable.resolution).build()
        checkLocationSettings.launch(intentSenderRequest)
        

        【讨论】:

          【解决方案11】:

          我在研究中发现的最简单的方法是为这个位置请求进程创建一个 Util 类,然后调用它来为我们打开 gps。

          Please check this blog!它讲述了整个故事。

          【讨论】:

          • 投反对票,因为链接可能会失效,请在 SO 上添加解决方案以确保未来的安全
          【解决方案12】:
           private void openDeviceLocationRequest() {
                  if (!locationPermissionGranted)
                      return;
          
                  LocationRequest locationRequest = LocationRequest.create();
                  locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                  LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                          .addLocationRequest(locationRequest);
                  builder.setAlwaysShow(true); //this is the key ingredient
          
                  Task<LocationSettingsResponse> result =
                          LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
                  result.addOnCompleteListener(task -> {
                      try {
                          LocationSettingsResponse response = task.getResult(ApiException.class);
                          // All location settings are satisfied. The client can initialize location
                          // requests here.
                          if(lastKnownLocation == null)
                          getDeviceLocation();
          
                      } catch (ApiException exception) {
                          switch (exception.getStatusCode()) {
                              case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                  // Location settings are not satisfied. But could be fixed by showing the
                                  // user a dialog.
                                  try {
                                      // Cast to a resolvable exception.
                                      ResolvableApiException resolvable = (ResolvableApiException) exception;
                                      // Show the dialog by calling startResolutionForResult(),
                                      // and check the result in onActivityResult().
                                      resolvable.startResolutionForResult(
                                              MapAddressActivity.this,
                                              REQUEST_CHECK_SETTINGS);
                                  } catch (IntentSender.SendIntentException e) {
                                      // Ignore the error.
                                  } catch (ClassCastException e) {
                                      // Ignore, should be an impossible error.
                                  }
                                  break;
                              case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                  // Location settings are not satisfied. However, we have no way to fix the
                                  // settings so we won't show the dialog.
                                  break;
                          }
                      }
                  });
              }
          

          【讨论】:

            猜你喜欢
            • 2019-06-21
            • 1970-01-01
            • 2021-06-21
            • 2013-04-07
            • 2013-07-18
            • 1970-01-01
            • 2018-03-28
            • 2020-05-06
            • 2018-12-04
            相关资源
            最近更新 更多