2012-12-07 11 views
42


しかし、問題は、ユーザーがボタンをクリックしたときにmyLocationを取得する方法です。 私は経度と緯度を取得したい。Google Maps Android API v2で現在地を取得するにはどうすればよいですか? myLocation層が有効に設定することができ</p> <pre><code>mMap.setMyLocationEnabled(true) </code></pre><p>を使用

+0

何が必要ですか?ユーザーが「Get My Location」のようなボタンをクリックしたときに、ユーザーが画面に触れるとき、またはユーザーの場所が必要なときにその場所を必要とするか? –

答えて

53

GoogleマップAPIの場所が機能するようになりました、でもあなたは、たとえば、という使用してそれを行うことができ、リスナーがあります。その後、

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() { 
    @Override 
    public void onMyLocationChange(Location location) { 
     LatLng loc = new LatLng(location.getLatitude(), location.getLongitude()); 
     mMarker = mMap.addMarker(new MarkerOptions().position(loc)); 
     if(mMap != null){ 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 
     } 
    } 
}; 

とは、マップのリスナーを設定します。

mMap.setOnMyLocationChangeListener(myLocationChangeListener); 

この地図が最初に場所を見つけると呼び出されます。

LocationServiceまたはLocationManagerはまったく必要ありません。

OnMyLocationChangeListenerインターフェイスは非推奨です。 代わりにcom.google.android.gms.location.FusedLocationProviderApiを使用してください。 FusedLocationProviderApiは改善された位置検索と電力使用を提供し、 "My Location"の青い点で使用されます。サンプルコードのサンプルアプリケーションフォルダ、または「Location Developer Guide」のMyLocationDemoActivityを参照してください。

+0

良い解決策ですが、新しい場所を追加する前にマーカーを削除する必要があります。すべての場所の変更で、Googleマップは今新しいマーカー –

+0

を追加しますが、問題はいくつかの遅延があるということです。 – jjLin

+11

"このインタフェースは廃止予定です。 代わりにcom.google.android.gms.location.FusedLocationProviderApiを使用してください。" https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMyLocationChangeListener – Eduardo

1

GoogleMap.getMyLocation()を試しましたか?

+0

残念ながら、更新情報は通知されません。報告によると、それも壊れています。 –

+4

**更新:** "このメソッドは非推奨です。 代わりにcom.google.android.gms.location.LocationClientを使用してください。" https://developers.google.com/maps/documentation/android/location、http:// developer.android.com/google/play-services/location.html – samosaris

0

は常にあらゆる状況下nullを返した瞬間GoogleMap.getMyLocation()で、この

public class MyLocationListener implements LocationListener 
{ 

@Override 

public void onLocationChanged(Location loc) 
{ 

loc.getLatitude(); 

loc.getLongitude(); 

String Text = “My current location is: ” + 

“Latitud = ” + loc.getLatitude() + 

“Longitud = ” + loc.getLongitude(); 

Toast.makeText(getApplicationContext(),Text, Toast.LENGTH_SHORT).show(); 



tvlat.setText(“”+loc.getLatitude()); 

tvlong.setText(“”+loc.getLongitude()); 

this.gpsCurrentLocation(); 

} 
31

を試してみてください。

Googleには、私が知っている、Issue 40932Issue 4644の2つのバグレポートがあります。

LocationListenerは、使用しようとしている新しいAPI内のLocationOverlayと同期していないため、以前のようにLocationListenerを実装すると正しくありません。

以前はPramod J GeorgeがリンクしていたVogellaのサイトのチュートリアルに続いて、古いGoogle Maps APIの使用法を説明します。

このようにして自分の場所を取得する方法を教えてくれないことをお詫びします。今のところ、LocationListenerが唯一の手段かもしれませんが、Googleが新しいAPI内で問題を修正する作業をしていると確信しています。

リンクを追加しないと申し訳ありませんが、私には担当者がいないため、StackOverlowは迷惑メールだと思います。 2月4日

----更新、2013 ----

Googleは問題がIssue 4644経由でGoogle MapsのAPIに次のアップデートで修正される予定と述べています。私は更新がいつ起こるかわからないが、いったんそれが再びこの投稿を編集するだろう。 4月10日に

----更新、2013 ----

Googleは問題がIssue 4644を介して固定されていると述べています。今はうまくいくはずです。ユーザーはまた、確認してボタンのコールにonClick-

void getCurrentLocation() { 
    Location myLocation = mMap.getMyLocation(); 
    if(myLocation!=null) 
    { 
     double dLatitude = myLocation.getLatitude(); 
     double dLongitude = myLocation.getLongitude(); 
     Log.i("APPLICATION"," : "+dLatitude); 
     Log.i("APPLICATION"," : "+dLongitude); 
     mMap.addMarker(new MarkerOptions().position(
       new LatLng(dLatitude, dLongitude)).title("My Location").icon(BitmapDescriptorFactory.fromBitmap(Utils.getBitmap("pointer_icon.png")))); 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8)); 

    } 
    else 
    { 
     Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show(); 
    } 

} 

でこのメソッドをクリックしたときに

+0

リンクされたスレッドにはこれが修正された旨の投稿があります。あなたはあなたの答えを更新したいかもしれません。 +1 – Mzn

+0

私はまだ「ヌル」になっているようです。私はonCreateで 'setMyLocationEnabled(true)'を呼び出し、 'onPostCreate'で' getMyLocation() 'を試みます。 – theblang

+0

私はonPostCreateメソッドでもnullを取得しました –

19

場所を取得するには、この

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
String provider = service.getBestProvider(criteria, false); 
Location location = service.getLastKnownLocation(provider); 
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude()); 
+2

getLastKnownLocationはnullを返す可能性がありますので、信頼性が十分ではありません – AFD

+0

そのコードは私にとって役に立ちました。ありがとうございます –

+4

これはLAstの既知の場所を取得しますが、現在の場所は取得しません。 –

2

を試してみてください

こと

setMyLocationEnabled

は、真のに設定されます。

これが動作するか試してみてください...

+4

Mylocationは常にnullです – Sami

+1

mMap.getMyLocation()は推奨されていません – sdelvalle57

0

現在の場所が表示されます。

mMap.setMyLocationEnabled(true); 
Location userLocation = mMap.getMyLocation(); 
     LatLng myLocation = null; 
     if (userLocation != null) { 
      myLocation = new LatLng(userLocation.getLatitude(), 
        userLocation.getLongitude()); 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 
        mMap.getMaxZoomLevel()-5)); 
3

デバイス上のロケーションサービスがオンになっていることを確認してください。 これ以外の場所に関連する情報はありません。

これは私の作品、

map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.setMyLocationEnabled(true); 
    GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() { 
     @Override 
     public void onMyLocationChange (Location location) { 
      LatLng loc = new LatLng (location.getLatitude(), location.getLongitude()); 
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 
     } 
    }; 
    map.setOnMyLocationChangeListener(myLocationChangeListener); 

}

1

私はちょうどこのコードは、 試してシンプルで機能的なスニペットが見つかりました:

public class MainActivity extends ActionBarActivity implements 
    ConnectionCallbacks, OnConnectionFailedListener { 
... 
@Override 
public void onConnected(Bundle connectionHint) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude())); 
     mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude())); 
    } 
}} 

は、ここでは、チュートリアルのリンクです:Getting the Last Known Location

0

条件は1つのみで、私はあなたが「私の場所を取得する」レイヤーボタンをタッチするのに十分な時間をユーザに許せば、それはヌル値を取得しませんでした。

1

この

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
    mMap.setMyLocationEnabled(true); 
} else { 
    // Show rationale and request permission. 
} 
0

受け入れ答えの作品を試すが、使用方法のいくつかは、今では、私は更新された方法でこの質問に答えるならば、それが最善だと思い廃止されました。

これが答えですので、ここでthis guide on google developers

から完全にステップバイステップガイドです:

  1. は、地図の活動にごonCreate

    MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks

  2. をすべてこれを実装します:

    あなたのonConnected
    private GoogleMap mMap; 
    private Context context; 
    private TextView txtStartPoint,txtEndPoint; 
    private GoogleApiClient mGoogleApiClient; 
    private Location mLastKnownLocation; 
    private LatLng mDefaultLocation; 
    private CameraPosition mCameraPosition; 
    private boolean mLocationPermissionGranted; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    context = this; 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
         .enableAutoManage(this /* FragmentActivity */, 
           this /* OnConnectionFailedListener */) 
         .addConnectionCallbacks(this) 
         .addApi(LocationServices.API) 
         .addApi(Places.GEO_DATA_API) 
         .addApi(Places.PLACE_DETECTION_API) 
         .build(); 
    mGoogleApiClient.connect(); 
    } 
    
  3. あなたonMapReady
    SupportMapFragment mapFragment = (SupportMapFragment)  getSupportFragmentManager() 
         .findFragmentById(map); 
    mapFragment.getMapAsync(this); 
    
  4. @Override 
    public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    
    // Do other setup activities here too, as described elsewhere in this tutorial. 
    
    // Turn on the My Location layer and the related control on the map. 
    updateLocationUI(); 
    
    // Get the current location of the device and set the position of the map. 
    getDeviceLocation(); 
    } 
    
  5. 、これら二つはonMapReadyのメソッドです:

    private void updateLocationUI() { 
        if (mMap == null) { 
        return; 
    } 
    
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
         android.Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 
        mLocationPermissionGranted = true; 
    } 
    
    if (mLocationPermissionGranted) { 
        mMap.setMyLocationEnabled(true); 
        mMap.getUiSettings().setMyLocationButtonEnabled(true); 
    } else { 
        mMap.setMyLocationEnabled(false); 
        mMap.getUiSettings().setMyLocationButtonEnabled(false); 
        mLastKnownLocation = null; 
    } 
    } 
    
    private void getDeviceLocation() { 
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
         android.Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 
        mLocationPermissionGranted = true; 
    } 
    
    if (mLocationPermissionGranted) { 
        mLastKnownLocation = LocationServices.FusedLocationApi 
          .getLastLocation(mGoogleApiClient); 
    } 
    
    // Set the map's camera position to the current location of the device. 
    float DEFAULT_ZOOM = 15; 
    if (mCameraPosition != null) { 
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition)); 
    } else if (mLastKnownLocation != null) { 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
          new LatLng(mLastKnownLocation.getLatitude(), 
            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM)); 
    } else { 
        Log.d("pouya", "Current location is null. Using defaults."); 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM)); 
        mMap.getUiSettings().setMyLocationButtonEnabled(false); 
    } 
    } 
    

これは非常に速く、滑らかで効果的です。これが役に立ったらいいですか

0

FusedLocationApiというよりOnMyLocationChangeListenerが廃止されました。

private LocationRequest mLocationRequest; 
private GoogleApiClient mGoogleApiClient; 
private LocationListener mLocationListener; 

定義方法:

まず、これらの3つの変数宣言

private void initGoogleApiClient(Context context) 
{ 
    mGoogleApiClient = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() 
    { 
     @Override 
     public void onConnected(Bundle bundle) 
     { 
      mLocationRequest = LocationRequest.create(); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      mLocationRequest.setInterval(1000); 

      setLocationListener(); 
     } 

     @Override 
     public void onConnectionSuspended(int i) 
     { 
      Log.i("LOG_TAG", "onConnectionSuspended"); 
     } 
    }).build(); 

    if (mGoogleApiClient != null) 
     mGoogleApiClient.connect(); 

} 

private void setLocationListener() 
{ 
    mLocationListener = new LocationListener() 
    { 
     @Override 
     public void onLocationChanged(Location location) 
     { 
      String lat = String.valueOf(location.getLatitude()); 
      String lon = String.valueOf(location.getLongitude()); 
      Log.i("LOG_TAG", "Latitude = " + lat + " Longitude = " + lon); 
     } 
    }; 

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

private void removeLocationListener() 
{ 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener); 
} 
  • initGoogleApiClient()セットアップ位置変更リスナーに使用さGoogleApiClientオブジェクト
  • setLocationListener()を初期化するために使用され
  • removeLocationListener()は、メモリリークの問題を回避するために最後にリスナー(mLocationListener)を削除することを忘れないでください:)作業コードを開始するために、リスナーに

コールinitGoogleApiClient方法を削除するために使用されます。

関連する問題

 関連する問題