方法1(參考資料1):
double lat, lng; LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); // 設定定位資訊由 GPS提供 lat = location.getLatitude(); // 取得經度 lng = location.getLongitude(); // 取得緯度 LatLng HOME = new LatLng(lat, lng); map.moveCamera(CameraUpdateFactory.newLatLngZoom(HOME, 15.0f));//數字越大放越大
有更精準的類別可以使用↓
方法2:
package com.example.user.exgooglemap;
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;
/**
* Created by user on 2016/5/31.
*/
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;
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 latitude/longitude 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/Wi-Fi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog.
* On pressing the Settings button it will launch 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 the 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 the 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;
}
}
參考資料:
1.Android - Google maps V2 將目前所在地點置中顯示於畫面(GPS)
文章標籤
全站熱搜

您好 請問這些程式碼是直接放在 main_activity.java 嗎???
您好,方法一是,方法二不是
請問一下 這樣是不是只是顯示目前經緯度 有在地圖上顯示目前位置嗎? 謝謝
LatLng HOME = new LatLng(lat, lng); mMap.moveCamera(CameraUpdateFactory.newLatLng(HOME)); //關鍵句應該是這個,讓地圖定位到現在位置 不知有沒解決你的問題@@
Firebase和Google Play Services庫的版本必須相同。您可以降級到10.0.1: compile 'com.google.firebase:firebase-database:10.0.1' compile 'com.google.android.gms:play-services-maps:10.0.1' 或升級到10.2.1: compile 'com.google.firebase:firebase-database:10.2.1' compile 'com.google.android.gms:play-services-maps:10.2.1' 在更新時,使用最新的約束佈局lib可能是明智的: compile 'com.android.support.constraint:constraint-layout:1.0.2'
用實機跑
public class MapGPS extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener { protected GoogleApiClient mGoogleApiClient; protected Location mLastLocation; protected String mLatitudeLabel; protected String mLongitudeLabel; private GoogleMap mMap; private static final int FINE_LOCATION_PERMISSION_REQUEST = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps2); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); buildGoogleApiClient(); } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case FINE_LOCATION_PERMISSION_REQUEST: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } } } if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == grantResults[0]) { mMap.setMyLocationEnabled(true); } } // 當 GoogleApiClient 連上 Google Play Service 後要執行的動作 @Override public void onConnected(Bundle connectionHint) { // 這行指令在 IDE 會出現紅線,不過仍可正常執行,可不予理會 mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation == null) { ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSION_REQUEST); } } @Override public void onConnectionFailed(ConnectionResult result) { } @Override public void onConnectionSuspended(int cause) { mGoogleApiClient.connect(); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; GPSTracker gps = new GPSTracker(MapGPS.this); if (gps.canGetLocation()) { LatLng sydney = new LatLng(gps.getLatitude(), gps.getLongitude()); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney , 15.0f)); } } }
public class MapGPS extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener , LocationListener { protected GoogleApiClient mGoogleApiClient; protected Location mLastLocation; private LocationRequest locationRequest; private GoogleMap mMap; private static final int FINE_LOCATION_PERMISSION_REQUEST = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps2); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); buildGoogleApiClient(); // 建立Location請求物件 configLocationRequest(); } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } private void configLocationRequest() { locationRequest = new LocationRequest(); // 設定讀取位置資訊的間隔時間為一秒(1000ms) locationRequest.setInterval(1000); // 設定讀取位置資訊最快的間隔時間為一秒(1000ms) locationRequest.setFastestInterval(1000); // 設定優先讀取高精確度的位置資訊(GPS) locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); } @Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case FINE_LOCATION_PERMISSION_REQUEST: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { } } } if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == grantResults[0]) { mMap.setMyLocationEnabled(true); } } // 當 GoogleApiClient 連上 Google Play Service 後要執行的動作 @Override public void onConnected(Bundle connectionHint) { // 這行指令在 IDE 會出現紅線,不過仍可正常執行,可不予理會 LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, locationRequest, MapGPS.this); mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation == null) { ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSION_REQUEST); } } @Override public void onConnectionFailed(ConnectionResult result) { } @Override public void onConnectionSuspended(int cause) { mGoogleApiClient.connect(); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; GPSTracker gps = new GPSTracker(MapGPS.this); if (gps.canGetLocation()) { LatLng sydney = new LatLng(gps.getLatitude(), gps.getLongitude()); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney , 15.0f)); Log.i("Mytest","change?"); } } @Override public void onLocationChanged(Location location) { Log.i("Mytest","change!!!"); String msg = "經度: " + location.getLongitude() + ", 緯度: " + location.getLatitude(); Log.i("Mytest",msg); } }
想請問這兩個方法的使用方法 因嘗試貼上及修改都無法使用