2015-06-16 2 views
0

Я сделал приложение, которое дает вам текущую широту и долготу с помощью GPS-сервиса. Теперь я планирую показать местоположение на карте на основе этих координатОсновано на координатах показать местоположение на MAP в android

Я хочу создать 2 мероприятия. 1-й уже создан, в котором я показываю широту и долготу в TextView. во втором действии я хочу отобразить карту, в которой будет отображаться местоположение. чтобы перейти от одной активности к другой, я буду использовать кнопку в 1-й деятельности.

вот мой код (не полный)

protected LocationManager locMan; 
protected LocationListener locLis; 
protected Context contex; 
TextView txtview; 
String lat,provider; 
protected String latitude,longtitude; 
protected boolean gps_enable,network_enable; 


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

    ActionBar bar = getActionBar(); 
    bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#F44336"))); 

    txtview = (TextView)findViewById(R.id.locView); 

    locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

} 

@Override 
public void onLocationChanged(Location loc){ 

    txtview = (TextView)findViewById(R.id.locView); 
    txtview.setText("Latitude = "+loc.getLatitude()+", Longitude = "+ loc.getLongitude()); 
} 

Примечание: - У меня есть смотрите сайт javapapers для моего текущего приложения

С уважением

+0

брат он уже отображаются на карте, и имеющего проблемы в но моя проблема - это diff. У меня есть координаты, и я хочу отображать на MAP на основе координат, которые у меня есть. – user3384581

ответ

0

Create Map активность и передать местоположение с помощью пучка или сохранить его в sharedpreference

public class MapActivity extends ActionBarActivity{ 

private GoogleMap googleMap; 
FragmentManager fm; 
private Location mLocation; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    fm = getSupportFragmentManager(); 

    // get location from bundle or sharedprefs 
    // mLocation = ... 

    try { 
     if (googleMap == null) { 
      googleMap = ((SupportMapFragment) fm.findFragmentById(R.id.map)).getMap(); 
      googleMap.getUiSettings().setZoomGesturesEnabled(true); 
     } 
     googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    MarkerOptions TP = new MarkerOptions().title("title").position(new LatLng(mLocation.getLatitude(), mLocation.getLongitude())).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_map_marker)); 
    googleMap.addMarker(TP); 

}}  

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 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

0

Вы должны использовать MapView и MyLocationOverLay на карту, так как Android будет обрабатывать отображения местоположения пользователя для вас.

map=(MapView)findViewById(R.id.whatever_your_mapview_id_is); 
map.getOverlays().add(new MyLocationOverlay(this, map)); 

См: display google maps using coordinates obtained using gps

+0

Обратите внимание, что этот код очень устарел, с Google Maps API v2 все, что вам нужно сделать, это вызвать 'map.setMyLocationEnabled (true);' –

0

Вы можете передать местоположение в Картах деятельности с использованием LatLng объекта, так как это parcelable см this answer.

Затем вы можете создать маркер в своем приложении MapsActivity и использовать класс CameraPosition для перемещения вида карты в указанное место.

Во-первых, убедитесь, что у вас есть двойные значения с текущим местоположением в существующей деятельности:

//instance variables: 
double lat; 
double lon; 

Set Lat/Lon в вашем onLocationChanged() обратного вызова:

@Override 
public void onLocationChanged(Location loc){ 

    lat = loc.getLatitude(); //added 
    lon = loc.getLongitude(); //added 

    txtview = (TextView)findViewById(R.id.locView); 
    txtview.setText("Latitude = "+loc.getLatitude()+", Longitude = "+ loc.getLongitude()); 
} 

создать кнопку в вашем макета в вашей существующей деятельности, а в прослушивателе кликов вы должны создать объект LatLng и отправить его в намерении в действие Карты:

Button b = (Button) findViewById(R.id.button); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LatLng fromPostion = new LatLng(lat, lon); 

      Bundle args = new Bundle(); 
      args.putParcelable("location", fromPostion); 

      Intent i = new Intent(this, MapsActivity.class); 
      i.putExtras(args); 
      startActivity(i); 
     } 
    }); 

Тогда в вашей Карты деятельности, вы получите LatLng объект в onCreate() из Bundle:

LatLng latlng; //Create as instance variable 

В onCreate():

Bundle b = getIntent().getExtras(); 
    if (b != null){ 
     latlng = (LatLng) b.getParcelable("location"); 
    } 

Затем добавьте маркер в этом месте и установить положение камеры и увеличение:

private void setUpMap() { 

    mMap.getUiSettings().setMapToolbarEnabled(true); 
    mMap.getUiSettings().setZoomControlsEnabled(true); 
    mMap.setMyLocationEnabled(true); 


    MarkerOptions marker = new MarkerOptions().position(latlng).title("My Location"); 

    // Changing marker icon 
    marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); 

    Marker m = mMap.addMarker(marker); 

    //move camera position and zoom to specified location 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
      .target(latlng).zoom(8).build(); 

    mMap.animateCamera(CameraUpdateFactory 
      .newCameraPosition(cameraPosition)); 

} 

Ваш полный карт активности может выглядеть примерно так:

public class MapsActivity extends ActionBarActivity implements 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, OnMapReadyCallback { 

    private GoogleMap mMap; 
    LatLng latlng; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    LocationManager manager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_maps); 

     Bundle b = getIntent().getExtras(); 
     if (b != null){ 
      latlng = b.getParcelable("location"); 
     } 

     manager =(LocationManager) getSystemService(Context.LOCATION_SERVICE); 


     setUpMapIfNeeded(); 

     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 


     if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) || 
       !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this) 
        .setTitle("Location is disabled") 
        .setMessage("Please enable your location") 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), 100); 
         } 
        }); 

      AlertDialog dialog = builder.create(); 
      dialog.show(); 

     } else { 
      Log.v("Connection Status", String.valueOf(mGoogleApiClient.isConnected())); 
      mGoogleApiClient.connect(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK && requestCode == 100) { 
      Toast.makeText(this, "location enabled", Toast.LENGTH_LONG).show(); 
      if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) || 
        manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 

       Toast.makeText(this, "location enabled", Toast.LENGTH_LONG).show(); 
       //At least one provider enabled, connect GoogleApiClient 
       mGoogleApiClient.connect(); 

      } 
     } 
    } 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 
    } 


    protected synchronized void buildGoogleApiClient() { 
     Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     Toast.makeText(this,"onConnected", Toast.LENGTH_SHORT).show(); 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10); 
     mLocationRequest.setFastestInterval(10); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     mLocationRequest.setSmallestDisplacement(0.1F); 

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


    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the map. 
     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 

      // Check if we were successful in obtaining the map. 
      if (mMap != null) { 
       setUpMap(); 
      } 

     } 
    } 

    private void setUpMap() { 

     mMap.getUiSettings().setMapToolbarEnabled(true); 
     mMap.getUiSettings().setZoomControlsEnabled(true); 
     mMap.setMyLocationEnabled(true); 


     MarkerOptions marker = new MarkerOptions().position(latlng).title("My Location"); 

     // Changing marker icon 
     marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)); 

     Marker m = mMap.addMarker(marker); 

     //move camera position and zoom to specified location 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(latlng).zoom(8).build(); 

     mMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 


    } 


    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     Log.d("locationtesting", "lat: " + location.getLatitude() + " lon: " + location.getLongitude()); 

    } 

} 

макет XML для MapsActivity:

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

Обратите внимание, что вам также необходимо включить Google Maps в Застройщика Google консоли, и включают в Google Play Услуги в вашем build.gradle файле (версия обновления с версии, которую вы используете):

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.google.android.gms:play-services:7.3.0' 
} 

последняя вещь, чтобы настроить AndroidManifest.xml для АНИ v2 Google Maps:

разрешения:

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <!-- 
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use 
     Google Maps Android API v2, but are recommended. 
    --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

теги мета-данные, убедитесь, что они находятся внутри тега приложения:

<meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="Your-API-Key" /> 
+0

Спасибо брату. Я буду работать над вашим кодом. – user3384581

+0

брат, я показал progressDialog spinner, но хочу только до тех пор, пока он не выберет место. Если координаты найдены, они должны перестать отображаться. – user3384581

+0

@ user3384581 просто отмените диалог в onLocationChanged(). Кроме того, если вам нужно только одно обновление местоположения, обязательно отмените регистрацию для обратных вызовов в этот момент. –

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