【问题标题】:Use the Android Default GPS ON-OFF dialog in My application在我的应用程序中使用 Android Default GPS ON-OFF 对话框
【发布时间】:2015-05-07 06:40:11
【问题描述】:

在我们的应用程序中,我们想要集成 android 默认 GPS 对话框。当 GPS 关闭并且我们在谷歌地图应用程序中按下我的位置按钮时出现的相同对话框。还附上了我要集成的对话框的图像。

  1. 单击“否”选项将关闭对话框。
  2. 点击“是”选项将直接激活设备的 GPS。

以下 (ANDROID L) 的 OLA 应用出现对话框:

以下 (ANDROID KIT_KAT) 的 OLA 应用出现对话框:

Google Map below (ANDROID L) 的对话框出现:

我们现有的实现是当 GPS 关闭时,我们将应用程序重定向到设备的默认位置设置屏幕,他/她可以从那里打开位置。

期待答案。 提前致谢。

【问题讨论】:

  • 我认为您必须创建自定义对话框,允许通过您的控制在棒棒糖中打开/关闭。
  • 我在 OLA cab 应用程序中看到了相同的对话框。我认为他们没有创建自定义对话框。你的想法是什么。与 KIT-KAT 版本相同。
  • @Balu 有同样的问题。如果你得到你的答案,请帮助我
  • @AnjaliTripathi:它还在等待中吗?你检查过这个:stackoverflow.com/questions/29801368/….

标签: android gps action android-alertdialog


【解决方案1】:

您需要使用最新版本的 Google Play 服务。最新版本有一个对话框来激活获取 GPS 所需的所有内容。

来自 Android Developer Play Service 文档,

位置设置 - 虽然 FusedLocationProviderApi 结合了多个传感器为您提供最佳位置,但您的应用接收到的位置的准确性仍然很大程度上取决于设备上启用的设置(GPS、wifi、飞行模式等)。使用新的 SettingsApi 类,您可以调出位置设置对话框,该对话框显示一键式控件,用户无需离开您的应用即可更改其设置。

Link 指向 Play Service 版本文档。 7.0 版引入了这个新提示。

【解决方案2】:

import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
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;

public class LocSettingsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {

    protected GoogleApiClient mGoogleApiClient;
    protected LocationRequest locationRequest;
    int REQUEST_CHECK_SETTINGS = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loc_settings);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).build();
        mGoogleApiClient.connect();

        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);
        PendingResult result =
                LocationServices.SettingsApi.checkLocationSettings(
                        mGoogleApiClient,
                        builder.build()
                );

        result.setResultCallback(this);

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
        final Status status = locationSettingsResult.getStatus();
        switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:

                // NO need to show the dialog;

                break;

            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                //  Location settings are not satisfied. Show the user a dialog

                try {
                    // Show the dialog by calling startResolutionForResult(), and check the result
                    // in onActivityResult().

                    status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS);

                } catch (IntentSender.SendIntentException e) {

                    //failed to show
                }
                break;

            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are unavailable so not possible to show any dialog now
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CHECK_SETTINGS) {

            if (resultCode == RESULT_OK) {

                Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
            } else {

                Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
            }

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.google.android.gms:play-services-location:8.4.0'
}

【讨论】:

    【解决方案3】:

    Ola Cabs 正在使用新发布的设置 API 来实现此功能。根据新 API,用户无需导航到设置页面即可启用位置服务,从而实现无缝集成。请阅读this了解更多详情。

    【讨论】:

      【解决方案4】:

      一步一步

      第 1 步检查是否支持 GPS 设备

      第 2 步有 GPS 设备真校验 MarshMallow Permimssion

      第 3 步 MarshMallow Permimssion 真实检查位置是否已打开

      第 4 步如果 Location 开启,则调用 Gps Tracker 并获取 Lat Long

      第 5 步如果 Location of Off 则 CAll Location Dialog 与 Google Maps 相同

      源代码

      https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE

      添加依赖和 Internet 权限

      编译'com.google.android.gms:play-services-location:8.4.0'

      package com.keshav.locationenabledorcancelwithoutoutsideclick;
      
      import android.Manifest;
      import android.content.Context;
      import android.content.Intent;
      import android.content.IntentSender;
      import android.content.pm.PackageManager;
      import android.location.Address;
      import android.location.Geocoder;
      import android.location.LocationManager;
      import android.os.Build;
      import android.os.Bundle;
      import android.support.annotation.NonNull;
      import android.support.annotation.Nullable;
      import android.support.v4.app.ActivityCompat;
      import android.support.v4.content.ContextCompat;
      import android.support.v7.app.AppCompatActivity;
      import android.util.Log;
      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.Result;
      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.LocationSettingsStatusCodes;
      import com.keshav.locationenabledorcancelwithoutoutsideclick.gps.GPSTracker;
      
      import java.io.IOException;
      import java.util.List;
      import java.util.Locale;
      
      public class LocSettingsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback {
      
          protected GoogleApiClient mGoogleApiClient;
          protected LocationRequest locationRequest;
          int REQUEST_CHECK_SETTINGS = 100;
      
          GPSTracker gps;
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              //Step 1
              checkPermission();
      
          }
      
          @Override
          public void onConnected(@Nullable Bundle bundle) {
      
              LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                      .addLocationRequest(locationRequest);
              builder.setAlwaysShow(true);
              PendingResult result =
                      LocationServices.SettingsApi.checkLocationSettings(
                              mGoogleApiClient,
                              builder.build()
                      );
      
              result.setResultCallback(this);
          }
      
          @Override
          public void onConnectionSuspended(int i) {
      
          }
      
          @Override
          public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
      
          }
      
          @Override
      //    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
          public void onResult(@NonNull Result locationSettingsResult) {
              final Status status = locationSettingsResult.getStatus();
              switch (status.getStatusCode()) {
                  case LocationSettingsStatusCodes.SUCCESS:
      
                      // NO need to show the dialog;
      
                      break;
      
                  case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                      //  Location settings are not satisfied. Show the user a dialog
      
                      try {
                          // Show the dialog by calling startResolutionForResult(), and check the result
                          // in onActivityResult().
      
                          status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS);
      
                      } catch (IntentSender.SendIntentException e) {
      
                          //failed to show
                      }
                      break;
      
                  case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                      // Location settings are unavailable so not possible to show any dialog now
                      break;
              }
          }
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              if (requestCode == REQUEST_CHECK_SETTINGS) {
      
                  if (resultCode == RESULT_OK) {
                      Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
                      Log.e("Keshav", "..........GPS enabled..............");
      
                      //TODO Important When Gps Enable Just Now Need Some Time ..........otherwise lat long 0.0 fetch
                      // TODO Need Some time to call GPS Tracker Service
                      new Thread(new Runnable() {
                          @Override
                          public void run() {
                              try {
                                  Thread.sleep(2000);     //Todo dummy delay for 2 second
                              } catch (InterruptedException e) {
                                  e.printStackTrace();
                              }
      
                              //update ui on UI thread
                              runOnUiThread(new Runnable() {
                                  @Override
                                  public void run() {
                                      callLocationGpsTracker();
                                  }
                              });
                          }
                      }).start();
      
      
                  } else {
                      callLocationDialog();
                      Log.e("Keshav", "..........GPS not enabled..............");
                      Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
                  }
      
              }
          }
      
          @Override
          public void onPointerCaptureChanged(boolean hasCapture) {
      
          }
      
          private void checkPermission(){
              if (!hasGPSDevice(LocSettingsActivity.this)) {
                  Log.e("keshav", "Gps not Supported");
                  Toast.makeText(LocSettingsActivity.this, "Gps not Supported", Toast.LENGTH_SHORT).show();
              } else {
                  Log.e("keshav", "Gps Supported ---hasGPSDevice return true--Step 1 Pass...........");
                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                      int permissionCheck = ContextCompat.checkSelfPermission(LocSettingsActivity.this,
                              Manifest.permission.CAMERA);
      
                      if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                          Log.e("permission", "granted");
                          locationEnabled_or_Not();
                      } else {
                          ActivityCompat.requestPermissions(LocSettingsActivity.this,
                                  new String[]{Manifest.permission.CAMERA,
                                          Manifest.permission.READ_EXTERNAL_STORAGE,
                                          Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                          Manifest.permission.ACCESS_FINE_LOCATION,
                                          Manifest.permission.ACCESS_COARSE_LOCATION,}, 1);
                      }
                  } else {
                      Log.e("MainActivity", "Lower Than MarshMallow");
                      locationEnabled_or_Not();
                  }
              }
          }
      
      
          //TODO Step 1
          public 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);
          }
      
      
          //TODO Step 2
          // TODO When Location not enabled show popup
          // TODO When Location already Enabled CAll GPS Tracker
          private void locationEnabled_or_Not() {
              Log.e("keshav", "locationEnabled_or_Not Step 2 Pass...........");
              final LocationManager manager = (LocationManager) LocSettingsActivity.this.getSystemService(Context.LOCATION_SERVICE);
              if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocSettingsActivity.this)) {
                  Log.e("keshav", "Gps not enabled");
                  callLocationDialog();
              } else {
                  Log.e("keshav", "Gps already enabled");
                  callLocationGpsTracker();           // TODO When Gps already enabled call direct GPS Tracker
              }
          }
      
          //TODO Step 3 when hasGPSDevice return true
      
          private void callLocationDialog() {
      
              Log.e("keshav", "callLocationDialog Step 3 Popup called ...........");
      
              mGoogleApiClient = new GoogleApiClient.Builder(this)
                      .addApi(LocationServices.API)
                      .addConnectionCallbacks(this)
                      .addOnConnectionFailedListener(this).build();
              mGoogleApiClient.connect();
      
              locationRequest = LocationRequest.create();
              locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
              locationRequest.setInterval(30 * 1000);
              locationRequest.setFastestInterval(5 * 1000);
          }
      
          //TODO Step 4 when location on fetch GPS Tracker Through Latitude Longitude
      
          private void callLocationGpsTracker() {
      
              Log.e("keshav", "callLocationGpsTracker Step 4 Called ... fetch Location");
      
              gps = new GPSTracker(LocSettingsActivity.this);
      
              // check if GPS enabled
              if (gps.canGetLocation()) {
      
                  double latitude = gps.getLatitude();
                  double longitude = gps.getLongitude();
      
                  Log.e("MainActivity", "latitude -> " + latitude);
                  Log.e("MainActivity", "longitude -> " + longitude);
      
                  getAddress(latitude, longitude);
      
      //            LocationAddress locationAddress = new LocationAddress();
      //            locationAddress.getAddressFromLocation(latitude, longitude,
      //                    getApplicationContext(), new GeocoderHandler());
      
              } else {
                  // TODO can't get location
                  // TODO GPS or Network is not enabled
                  // TODO Ask user to enable GPS/network in settings
      
                  //TODO need again call Locaton Dialog
                  callLocationDialog();
              }
          }
      
          private void getAddress(double lat, double lon) {
              String cityName = "";
              String stateName = "";
              String postalCode = "";
              String countryName = "";
      
              StringBuilder finalAddress = new StringBuilder();
      
              try {
                  Geocoder geocoder = new Geocoder(LocSettingsActivity.this, Locale.getDefault());
                  List<Address> addresses = geocoder.getFromLocation(lat, lon, 1);
      
                  if (addresses != null) {
      
                      try {
                          cityName = addresses.get(0).getLocality();
                          stateName = addresses.get(0).getAdminArea();
                          countryName = addresses.get(0).getCountryName();
                          postalCode = addresses.get(0).getPostalCode();
      
                          if (addresses.get(0).getAddressLine(0) != null)
                              finalAddress.append(addresses.get(0).getAddressLine(0));
                          if (addresses.get(0).getAddressLine(1) != null)
                              finalAddress.append(" " + addresses.get(0).getAddressLine(1));
                          if (addresses.get(0).getAddressLine(2) != null)
                              finalAddress.append(" " + addresses.get(0).getAddressLine(2));
                          if (addresses.get(0).getAddressLine(3) != null)
                              finalAddress.append(" " + addresses.get(0).getAddressLine(3));
      
                          Log.e("keshav", "addres 0   ->  " + addresses.get(0).getAddressLine(0));
                          Log.e("keshav", "addres 1   ->  " + addresses.get(0).getAddressLine(1));
                          Log.e("keshav", "addres 2   ->  " + addresses.get(0).getAddressLine(2));
                          Log.e("keshav", "addres 3   ->  " + addresses.get(0).getAddressLine(3));
                          Log.e("keshav", "addres final   ->  " + finalAddress);
      
                      } catch (Exception e) {
                          Log.e("keshav", "Exception occurd    ->  " + e.getMessage());
                          e.printStackTrace();
                      }
                      Log.e("keshav", "cityName   ->  " + cityName);
                      Log.e("keshav", "stateName ->  " + stateName);
                      Log.e("keshav", "countryName ->  " + countryName);
                      Log.e("keshav", "PostalCode ->  " + postalCode);
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
          @Override
          protected void onResume() {
              super.onResume();
              checkPermission();
          }
      }
      ===============================GPSTracker===================================
      
      package com.keshav.locationenabledorcancelwithoutoutsideclick.gps;
      
      import android.app.AlertDialog;
      import android.app.Service;
      import android.content.Context;
      import android.content.DialogInterface;
      import android.content.Intent;
      import android.location.Location;
      import android.location.LocationListener;
      import android.location.LocationManager;
      import android.os.Bundle;
      import android.os.IBinder;
      import android.provider.Settings;
      import android.util.Log;
      
      public class GPSTracker extends Service implements LocationListener {
      
          private final Context mContext;
      
          // flag for GPS status
          boolean isGPSEnabled = false;
      
          // flag for network status
          boolean isNetworkEnabled = false;
      
          // flag for GPS status
          boolean canGetLocation = false;
      
          Location location; // location
          double latitude; // latitude
          double longitude; // longitude
      
          // The minimum distance to change Updates in meters
          private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
      
          // The minimum time between updates in milliseconds
          private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
      
          // Declaring a Location Manager
          protected LocationManager locationManager;
      
          public GPSTracker(Context context) {
              this.mContext = context;
              getLocation();
          }
      
          public Location getLocation() {
              try {
                  locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
      
                  // getting GPS status
                  isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
      
                  // getting network status
                  isNetworkEnabled = locationManager
                          .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
      
                  if (!isGPSEnabled && !isNetworkEnabled) {
                      // no network provider is enabled
                  } else {
                      this.canGetLocation = true;
                      // First get location from Network Provider
                      if (isNetworkEnabled) {
                          locationManager.requestLocationUpdates(
                                  LocationManager.NETWORK_PROVIDER,
                                  MIN_TIME_BW_UPDATES,
                                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      
                          Log.d("Network", "Network");
                          if (locationManager != null) {
                              location = locationManager
                                      .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
      
                              if (location != null) {
                                  latitude = location.getLatitude();
                                  longitude = location.getLongitude();
                              }
                          }
                      }
      
                      // if GPS Enabled get lat/long using GPS Services
                      if (isGPSEnabled) {
                          if (location == null) {
                              locationManager.requestLocationUpdates(
                                      LocationManager.GPS_PROVIDER,
                                      MIN_TIME_BW_UPDATES,
                                      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      
                              Log.d("GPS Enabled", "GPS Enabled");
                              if (locationManager != null) {
                                  location = locationManager
                                          .getLastKnownLocation(LocationManager.GPS_PROVIDER);
      
                                  if (location != null) {
                                      latitude = location.getLatitude();
                                      longitude = location.getLongitude();
                                  }
                              }
                          }
                      }
                  }
      
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              return location;
          }
      
          /**
           * Stop using GPS listener
           * Calling this function will stop using GPS in your app
           */
      
          public void stopUsingGPS() {
              if (locationManager != null) {
                  locationManager.removeUpdates(GPSTracker.this);
              }
          }
      
          /**
           * Function to get latitude
           */
      
          public double getLatitude() {
              if (location != null) {
                  latitude = location.getLatitude();
              }
      
              // return latitude
              return latitude;
          }
      
          /**
           * Function to get longitude
           */
      
          public double getLongitude() {
              if (location != null) {
                  longitude = location.getLongitude();
              }
      
              // return longitude
              return longitude;
          }
      
          /**
           * Function to check GPS/wifi enabled
           *
           * @return boolean
           */
      
          public boolean canGetLocation() {
              return this.canGetLocation;
          }
      
          /**
           * Function to show settings alert dialog
           * On pressing Settings button will lauch Settings Options
           */
      
          public void showSettingsAlert() {
              AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
      
              // Setting Dialog Title
              alertDialog.setTitle("GPS is settings");
      
              // Setting Dialog Message
              alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
      
              // On pressing Settings button
              alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      mContext.startActivity(intent);
                  }
              });
      
              // on pressing cancel button
              alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                      dialog.cancel();
                  }
              });
      
              // Showing Alert Message
              alertDialog.show();
          }
      
          @Override
          public void onLocationChanged(Location location) {
          }
      
          @Override
          public void onProviderDisabled(String provider) {
          }
      
          @Override
          public void onProviderEnabled(String provider) {
          }
      
          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
          }
      
          @Override
          public IBinder onBind(Intent arg0) {
              return null;
          }
      }
      

      源代码

      https://drive.google.com/open?id=0BzBKpZ4nzNzUMnVLTGpWcTk2QUE

      【讨论】:

        猜你喜欢
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2016-01-22
        • 2017-08-01
        相关资源
        最近更新 更多