2015-05-07 24 views
19

在我們的應用程序中,我們想要集成android默認GPS對話框。當GPS關閉並且我們在谷歌地圖應用程序中按下我的位置按鈕時出現的對話框。還附加了我想要整合的對話框的圖像。在我的應用程序中使用Android默認GPS開 - 關對話框

  1. 點擊「否」選項將關閉對話框。
  2. 點擊「是」選項將直接激活設備的GPS。

對話框中出現OLA應用程序下面(ANDROID L):
enter image description here

對話框中出現OLA應用程序下面(ANDROID KIT_KAT):
enter image description here

對話框中出現谷歌地圖以下(ANDROID L):
enter image description here

我們現有的實現是當t他GPS關閉,我們正在將應用程序重定向到設備的默認位置設置屏幕,他/她可以打開該位置。

期待解答。 在此先感謝。

+0

我認爲你必須創建自定義對話框,允許通過ur控件在棒棒糖中打開/關閉。 –

+0

我在OLA駕駛室應用程序中看到過相同的對話框。我不認爲他們已經創建了自定義對話框。你的想法是什麼。 KIT-KAT版本與之相同。 – Balu

+0

查看:http://stackoverflow.com/questions/29801368/how-to-show-enable-location-dialog-like-google-maps –

回答

6

您需要使用最新版本的Google Play服務。最新版本有一個對話框來激活所有需要的東西來獲取GPS。

從Android開發者遊戲服務文檔,

位置設置 - 雖然FusedLocationProviderApi結合多個傳感器,給你最佳的位置,你的應用程序接收仍然定位的精度在很大程度上取決於上啓用的設置設備(GPS,wifi,飛行模式等)。使用新的SettingsApi類,您可以調出一個位置設置對話框,該對話框顯示一鍵控制,用戶無需離開您的應用即可更改設置。

Link指向Play服務版本文檔。 7.0版引入了這個新提示。

+4

https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi –

0

Ola Cabs使用新發布的設置API來實現此功能。根據新的API,用戶不需要導航到設置頁面以啓用位置服務,從而實現相同的無縫集成。請閱讀this瞭解更多詳情。

3

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' 
} 
+0

爲我工作感謝:) – shubomb

0

步驟按步驟

步驟1檢查hasGPSDevice支持或不

步驟2 hasGPSDevice真檢查棉花糖Permimssion

步驟3月3日shMallow Permimssion真實支票位置已經在或不

步驟4如果位置上,然後調用GPS定位追蹤器,並獲取Lat Long網

步驟5如果位置已關閉,然後調用位置對話框相同谷歌地圖

源代碼

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

添加依賴關係和網絡權限

編譯 'com.google.android.gms:發揮服務定位: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

相關問題