2014-08-28 5 views
0

Я пытаюсь получить текущее местоположение в android google maps v2. Это мой код:Как получить текущее местоположение в android google maps api V2?

package android.arin; 

import java.util.List; 
import location.Location; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesClient; 
import com.google.android.gms.location.LocationClient; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import fish.Species; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MapScreen extends FragmentActivity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { 

    private Species selectedfish = null; 
    private GoogleMap map = null; 
    private LocationClient locationClient = null; 

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

     setUpScreen(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.map_screen, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     switch (id) { 

     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setUpScreen() { 
     selectedfish = (Species) NavigationScreen.FishWhosOptionsClicked; 
     map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
     map.setMyLocationEnabled(true); 


     List<Location> locations = selectedfish.getLocations(); 
     for(int i=0; i<locations.size(); i+=1) { 
      Location location = locations.get(i); 
      LatLng latlong = new LatLng(location.getLatitude(), location.getLongitude()); 

      map.addMarker(new MarkerOptions() 
      .title(location.getAddress()) 
      .snippet(location.getComment()) 
      .position(latlong)); 
     } 

     locationClient = new LocationClient(this, this, this); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     android.location.Location location = locationClient.getLastLocation(); 

     LatLng latlong = new LatLng(location.getLatitude(), location.getLongitude()); 
     map.moveCamera(CameraUpdateFactory.newLatLngZoom(latlong, 10)); 
    } 

    @Override 
    public void onDisconnected() { 
     // TODO Auto-generated method stub 

    } 
} 

Но он не работает. Это не сбой, но он не перемещается туда, где я ...

Кто-нибудь знает, как это исправить?

Спасибо.

+1

включен ли GPS? – Simas

+0

не включен. – omega

+0

Когда я включаю его, он все равно не работает, но когда я нажимаю значок в правом верхнем углу, он отображает синюю точку, где я нахожусь на карте. – omega

ответ

-1

Почему вы не запрашиваете разрешение на местоположение и не пытаетесь запросить местонахождениеUpdates?

В манифесте:

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

В вашей деятельности:

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 2500f, this); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 2500f, this); 

Тогда вам просто необходимо реализовать LocationListener:

@Override 
public void onLocationChanged(Location location) { 
    mLocation = location; 
} 

Я надеюсь, что это поможет вам!

+0

Я сделал это, но он не переместится в мое местоположение, пока я не нажму кнопку в правом верхнем углу. Я хочу, чтобы он переместился в мое местоположение по умолчанию. – omega

+0

@omega, вы можете взять это местоположение и сосредоточить свою карту на нем, используя: 'CameraPosition camPos = new CameraPosition.Builder(). Target (latLng) .zoom (16) .tilt (20) .build(); CameraUpdate camUp = CameraUpdateFactory.newCameraPosition (camPos); map.moveCamera (camUp); ' Вам просто нужно преобразовать это местоположение в LatLng: ' открытое статический LatLng convertLocationToLatLng (Место нахождение) { \t \t возвращение нового LatLng (location.getLatitude(), location.getLongitude ()); \t} ' – MartinCR

0

Я разработал этот класс, чтобы легко использовать GPS, возможно, он вам поможет.

Вы должны создать экземпляр только одного экземпляра на своем корне Activity и синхронизироваться с методами onStart и onStop, после чего вы можете делать статические вызовы из любого класса для извлечения местоположения.

// Использование

public class MainActivity extends Activity {  

private GPSTracker gpsTracker; 

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

    gpsTracker = new GPSTracker(context); 
    Location location = GPSTracker.getLocation(); 
} 


@Override 
protected void onStart() { 
    gpsTracker.connectToApi(); 
    super.onStart(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    if(gpsTracker != null) 
     gpsTracker.disconnectToApi(); 
} 

} 

// GPSTracker

public class GPSTracker extends Service implements ConnectionCallbacks, LocationListener, OnConnectionFailedListener { 

private static final int MILLISECONDS_PER_SECOND = 1000; 
private static final int UPDATE_INTERVAL_IN_SECONDS = 10; 
private static final long UPDATE_INTERVAL = MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS; 
private static final int FASTEST_INTERVAL_IN_SECONDS = 5; 
private static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS; 

private static Context mContext; 
private static Location mLocation; 
private LocationRequest locationRequest; 
private static LocationClient locationClient; 
private static boolean isGoogleServiceAvailable; 

public GPSTracker(Context context){ 
    mContext = context; 
    locationClient = new LocationClient(mContext, this, this); 
    configureLocationRequest(); 
    connectToApi(); 
} 

public void connectToApi(){ 
    locationClient.connect(); 
} 

public void disconnectToApi(){ 
    locationClient.disconnect(); 
} 

private void configureLocationRequest(){ 
    locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(UPDATE_INTERVAL); 
    locationRequest.setFastestInterval(FASTEST_INTERVAL); 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    locationClient.requestLocationUpdates(locationRequest, this); 
    isGoogleServiceAvailable = true; 
    //Toast.makeText(mContext, "Connected", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onDisconnected() { 
    isGoogleServiceAvailable = false; 
    //Toast.makeText(mContext, "Disconnected", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onLocationChanged(Location location) { 
    mLocation = location; 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    isGoogleServiceAvailable = false; 
} 

public static Location getLocation(){ 
    //String sourceGPS = "New api current location ->"; 
    try { 
     if(!isGoogleServiceAvailable){ 
      mLocation = getLastKnownLocationWithDeprecatedApi(); 
      //sourceGPS = "Old api last know location ->"; 
     }else if (isCurrentLocationEqualsTodefaultGPSLocation()){ 
      //sourceGPS = "New api last know location ->"; 
      mLocation = locationClient.getLastLocation(); 
     } 
    } catch (Exception e) {mLocation = null;} 

    if(mLocation == null) { 
     mLocation = getDefaultLocation(); 
     //sourceGPS = "Default location ->"; 
    } 


    return mLocation; 
} 

private static Location getLastKnownLocationWithDeprecatedApi(){ 
    LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 
    Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    return location; 
} 

private static boolean isCurrentLocationEqualsTodefaultGPSLocation(){ 
    Location defaultLocation = getDefaultLocation(); 
    if(mLocation.getLatitude() == defaultLocation.getLatitude() 
      && mLocation.getLongitude() == defaultLocation.getLongitude()) 
     return true; 
    else return false; 
} 

private static Location getDefaultLocation(){ 
    Location location = new Location(""); 
    location.setLatitude(39.5693900); 
    location.setLongitude(2.6502400); 
    return location; 
} 

} 
Смежные вопросы