2015-12-16 40 views
9

我得到当前位置在23以下设备但在(23)模拟器设备中获得(0.0,0.0)纬度和经度。获取当前位置0在棉花糖中低于23 API API给出精确的当前位置使用融合位置

编辑 目前我使用一体化位置提供了获取当前位置

public class ContactUsFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.i("TAG", "OnCreate Called"); 
    locationManager = (LocationManager) getActivity() 
      .getSystemService(Context.LOCATION_SERVICE); 
    buildGoogleApiClient(); 


} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         final Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    view = inflater.inflate(R.layout.fragment_contact_us, container, false); 

    Log.i("TAG", "OnCreateView Called"); 
    setComponants(view); // **** Method For Set Componants Of Layout 

这是它的点击地图上的图片我想获取当前位置,并将它传递给本地谷歌地图应用装置的导航到目标位置

mapImage.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.i("TAG", "On ImageView Click"); 


      if (Build.VERSION.SDK_INT >= 23) { 

       if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getActivity().getApplicationContext(), getActivity())) { 

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
         navigateToGoogleMap(); 
        } else { 
         showSettingsAlert(); 
        } 
       } else { 
        requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, PERMISSION_REQUEST_CODE, getActivity().getApplicationContext(), getActivity()); 
       } 
      } else { 

       if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
        navigateToGoogleMap(); 
       } else { 
        showSettingsAlert(); 
       } 

      } 


     } 


    }); 
    return view; 
} 

下面是码f或者获取当前位置

private synchronized void buildGoogleApiClient() { 
    Log.i("TAG", "Building GoogleApiClient"); 
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    createLocationRequest(); 
} 

private void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    builder = new LocationSettingsRequest.Builder() 
      .addLocationRequest(mLocationRequest); 
    //************************** 
    builder.setAlwaysShow(true); //this is the key ingredient 
    //************************** 

} 
@Override 
public void onConnected(Bundle bundle) { 

    Location mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    // Note that this can be NULL if last location isn't already known. 
    if (mCurrentLocation != null) { 
     // Print current location if not null 
     Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); 
     currentlatitude = mCurrentLocation.getLatitude(); 
     currentlongitude = mCurrentLocation.getLongitude(); 
    } 
    // Begin polling for new location updates. 
    startLocationUpdates(); 
} 

private void startLocationUpdates() { 

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
      mLocationRequest, this); 
} 

private void stopLocationUpdates() { 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    if (i == CAUSE_SERVICE_DISCONNECTED) { 
     Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); 
    } else if (i == CAUSE_NETWORK_LOST) { 
     Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show(); 
    } 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    String msg = "Updated Location: " + 
      Double.toString(location.getLatitude()) + "," + 
      Double.toString(location.getLongitude()); 
    Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); 

    currentlatitude = location.getLatitude(); 
    currentlongitude = location.getLongitude(); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

*此代码工作正常,当我在使用下面API23设备,但是当我尝试棉花糖设备把它给当前位置0.0,0.0 *

下面是我的清单文件

<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<!-- Required to show current location --> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/> 

<uses-library android:name="com.google.android.maps" /> 

<!-- Required OpenGL ES 2.0. for Maps V2 --> 
<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".SplashActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/Theme.AppCompat.NoActionBar" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".HomeMainActivity" 
     android:label="@string/app_name" 
     android:windowSoftInputMode="adjustPan" 
     android:screenOrientation="portrait" 
     > 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@layout/searchable" /> 
    </activity> 
    <activity 
     android:name=".HomeActivity" 
     android:screenOrientation="portrait" /> 
    <activity 
     android:name=".DoctorsDetailsActivity" 
     android:screenOrientation="portrait" /> 
    <activity android:name=".ServiceActivity" /> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
+0

你的问题是什么呢?你的代码是什么样的,你到目前为止做了什么?请阅读[如何提出问题](http://stackoverflow.com/help/how-to-ask)的基础知识并更新你的。我现在投票结束,因为不清楚你要问什么。 –

+0

@VishalHalani你是否尝试过我在下面的回答中写的内容? – Abhishek

+0

@Abhishek我尝试过,但仍然给它0 latLng。 –

回答

6

我一些调试后,得到了确切的问题,寻找

GoogleAPIclient onConnected( )未调用,所以它调用onConnectionFailed()方法

在该方法中,我发现错误代码是2意思REQUIRED PLAY服务更新

所以我改变gradle这个文件相同的设备Playservice版本播放服务,所以我得到当前位置

我张贴一些代码在这里:

private synchronized void buildGoogleApiClient() { 
Log.i("TAG", "Building GoogleApiClient"); 
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    createLocationRequest();} 

private void createLocationRequest() { 
    Log.i("TAG", "CreateLocationRequest"); 
    mLocationRequest = new LocationRequest(); 
    long UPDATE_INTERVAL = 10 * 1000; 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    long FASTEST_INTERVAL = 10000; 
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    builder = new LocationSettingsRequest.Builder() 
      .addLocationRequest(mLocationRequest); 
    //************************** 
    builder.setAlwaysShow(true); //this is the key ingredient 
    //************************** 

} 

private void startLocationUpdates() { 

    Log.i("TAG", "StartLocationUpdates"); 

    if (Build.VERSION.SDK_INT >= 23) { 
     if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
        mLocationRequest, this); 

     } 
    } else { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
       mLocationRequest, this); 
    } 

} 

private void stopLocationUpdates() { 
    Log.i("TAG", "StopLocationUpdates"); 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 

} 
@Override 
public void onConnectionSuspended(int i) { 
    Log.i("TAG", "onConnectionSuspended"); 
    if (i == CAUSE_SERVICE_DISCONNECTED) { 
     Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); 
    } else if (i == CAUSE_NETWORK_LOST) { 
     Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show(); 
    } 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    Log.i("TAG", "OnLocationChanged"); 
    Log.i("TAG", "Current Location==>" + location); 
    currentlatitude = location.getLatitude(); 
    currentlongitude = location.getLongitude(); 
} 


    @Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
if (connectionResult.hasResolution()) { 
     try { 
      // Start an Activity that tries to resolve the error 
      connectionResult.startResolutionForResult(getActivity(), connectionResult.RESOLUTION_REQUIRED); 
     } catch (IntentSender.SendIntentException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Log.e("TAG", "Location services connection failed with code==>" + connectionResult.getErrorCode()); 
     Log.e("TAG", "Location services connection failed Because of==> " + connectionResult.getErrorMessage()); 
    } 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mGoogleApiClient != null) 
     mGoogleApiClient.disconnect(); 
} 
@Override 
public void onConnected(Bundle bundle) { 
    Location mCurrentLocation; 

    Log.i("TAG", "OnConnected"); 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

      // Note that this can be NULL if last location isn't already known. 
      if (mCurrentLocation != null) { 
       // Print current location if not null 
       Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); 
       currentlatitude = mCurrentLocation.getLatitude(); 
       currentlongitude = mCurrentLocation.getLongitude(); 
      } else { 
       startLocationUpdates(); 
      } 


     } 
    } else { 
     mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

     // Note that this can be NULL if last location isn't already known. 
     if (mCurrentLocation != null) { 
      // Print current location if not null 
      Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); 
      currentlatitude = mCurrentLocation.getLatitude(); 
      currentlongitude = mCurrentLocation.getLongitude(); 
     } 
     // Begin polling for new location updates. 
     startLocationUpdates(); 
    } 
} 

欲了解更多请参考官方文档https://developers.google.com/android/guides/setup

1

AndroidManifest.xml中添加这些权限

然后去设置----->应用----->您的应用程序--->捐赠位置的权限

<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/> 

你也可以添加运行时权限。 http://developer.android.com/intl/es/training/permissions/requesting.html

GPSTacker.java

import android.Manifest; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.util.Log; 
import java.security.Provider; 

public class GPSTracker extends Activity 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; 
      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 
*/ 
@TargetApi(Build.VERSION_CODES.M) 
public void stopUsingGPS() { 
    if (locationManager != null) { 
     if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       // TODO: Consider calling 
      // public void requestPermissions(@NonNull String[] permissions, int requestCode) 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for Activity#requestPermissions for more details. 
      return; 
     } 
     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 currentLocation) { 
// TODO Auto-generated method stub 
    this.location = currentLocation; 
    getLatitude(); 
    getLongitude(); 

} 

@Override 
public void onProviderDisabled(String provider) { 
// TODO Auto-generated method stub 
} 

@Override 
public void onProviderEnabled(String provider) { 
// TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
// TODO Auto-generated method stub 
} 
} 

DirectionsJSONParser。java的

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.google.android.gms.maps.model.LatLng; 

public class DirectionsJSONParser { 

/** Receives a JSONObject and returns a list of lists containing latitude and longitude */ 
public List<List<HashMap<String,String>>> parse(JSONObject jObject){ 

    List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ; 
    JSONArray jRoutes = null; 
    JSONArray jLegs = null; 
    JSONArray jSteps = null; 

    try { 

     jRoutes = jObject.getJSONArray("routes"); 

     /** Traversing all routes */ 
     for(int i=0;i<jRoutes.length();i++){ 
      jLegs = ((JSONObject)jRoutes.get(i)).getJSONArray("legs"); 
      List path = new ArrayList<HashMap<String, String>>(); 

      /** Traversing all legs */ 
      for(int j=0;j<jLegs.length();j++){ 
       jSteps = ((JSONObject)jLegs.get(j)).getJSONArray("steps"); 

       /** Traversing all steps */ 
       for(int k=0;k<jSteps.length();k++){ 
        String polyline = ""; 
        polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points"); 
        List<LatLng> list = decodePoly(polyline); 

        /** Traversing all points */ 
        for(int l=0;l<list.size();l++){ 
         HashMap<String, String> hm = new HashMap<String, String>(); 
         hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude)); 
         hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude)); 
         path.add(hm); 
        } 
       } 
       routes.add(path); 
      } 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    }catch (Exception e){ 
    } 

    return routes; 
} 
/** 
* Method to decode polyline points 
* Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java 
* */ 
private List<LatLng> decodePoly(String encoded) { 

    List<LatLng> poly = new ArrayList<LatLng>(); 
    int index = 0, len = encoded.length(); 
    int lat = 0, lng = 0; 

    while (index < len) { 
     int b, shift = 0, result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lat += dlat; 

     shift = 0; 
     result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lng += dlng; 

     LatLng p = new LatLng((((double) lat/1E5)), 
       (((double) lng/1E5))); 
     poly.add(p); 
    } 

    return poly; 
} 
} 

现在在任何你想设置在活动您的位置添加此

// create class object 
    gps = new GPSTracker(ImageUpload.this); 
    // check if GPS enabled 
    if (gps.canGetLocation()) { 
     double latitude = gps.getLatitude(); 
     double longitude = gps.getLongitude(); 

     tv.setText("Latitude:" + latitude + ", Longitude:" + longitude); 

    } else { 
     // can't get location 
     // GPS or Network is not enabled 
     // Ask user to enable GPS/network in settings 
     gps.showSettingsAlert(); 
    } 
+0

** android.permission.ACCESS_FINE_LOCATION **这个权限不够啊? 你为什么给两个权限? –

+0

我无法解决这个问题?你如何解决这些问题? – seon

10

使用下面的代码。希望这是有用的。

请确保您仅将此代码运行到真实设备中。

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment"/> 

</LinearLayout> 

MainActivity.java

import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Build; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener 
{ 
    GoogleMap mGoogleMap; 
    SupportMapFragment mapFrag; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    LocationManager locationManager; 

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

     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
     { 
      checkLocationPermission(); 
     } 
     else 
     { 
      if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
      { 
       showGPSDisabledAlertToUser(); 
      } 
     } 

     mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFrag.getMapAsync(this); 
    } 

    private void showGPSDisabledAlertToUser() 
    { 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
     alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?") 
       .setCancelable(false) 
       .setPositiveButton("Settings", new DialogInterface.OnClickListener() 
       { 
        public void onClick(DialogInterface dialog, int id) 
        { 
         Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         startActivity(callGPSSettingIntent); 

         mapFrag.getMapAsync(MainActivity.this); 
        } 
       }); 
     alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); 
      } 
     }); 
     AlertDialog alert = alertDialogBuilder.create(); 
     alert.show(); 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 

     //stop location updates when Activity is no longer active 
     if (mGoogleApiClient != null) 
     { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) 
    { 
     mGoogleMap=googleMap; 
     mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 

     //Initialize Google Play Services 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
     { 
      if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
      { 
       buildGoogleApiClient(); 
       mGoogleMap.setMyLocationEnabled(true); 
      } 
     } 
     else 
     { 
      buildGoogleApiClient(); 
      mGoogleMap.setMyLocationEnabled(true); 
     } 
    } 

    protected synchronized void buildGoogleApiClient() 
    { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) 
    { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(1000); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

     if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
     { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) {} 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) {} 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     mLastLocation = location; 
     if (mCurrLocationMarker != null) 
     { 
      mCurrLocationMarker.remove(); 
     } 

     //Place current location marker 
     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("Current Position"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
     mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 

     //move map camera 
     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

     //stop location updates 
     if (mGoogleApiClient != null) 
     { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

    public boolean checkLocationPermission() 
    { 
     if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
     { 
      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) 
      { 
       // Show an expanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

       //Prompt the user once explanation has been shown 
       ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
      else 
      { 
       // No explanation needed, we can request the permission. 
       ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
         MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
      return false; 
     } 
     else 
     { 
      if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
      { 
       showGPSDisabledAlertToUser(); 
      } 

      return true; 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 
    { 
     switch (requestCode) 
     { 
      case MY_PERMISSIONS_REQUEST_LOCATION: 
      { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
       { 
        // permission was granted, yay! Do the 
        // contacts-related task you need to do. 
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
        { 

         if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
         { 
          showGPSDisabledAlertToUser(); 
         } 

         if (mGoogleApiClient == null) 
         { 
          buildGoogleApiClient(); 
         } 
         mGoogleMap.setMyLocationEnabled(true); 
        } 
       } 
       else 
       { 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 
      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
} 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.sneha.mymapdemo"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="YOUR API KEY"/> 

    </application> 

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 

</manifest>