studio proyecto implement google example ejemplo java android google-maps snapshot

java - proyecto - ¿Cómo recuperar una instantánea del mapa de la actividad del selector de lugar?



proyecto google maps android (5)

Estoy creando una aplicación que selecciona lugares de los mapas de Google y almacena la dirección en la base de datos. También quiero almacenar la instantánea del lugar elegido en el almacenamiento, para poder mostrar los datos con la instantánea correspondiente.

Cuando selecciono un lugar del mapa, la actividad del selector de lugar muestra el siguiente diálogo:

Aquí, en el cuadro de diálogo, se muestran la dirección, la latitud y la longitud, y también la instantánea . Sé cómo obtener la dirección y el latLng. pero no sé cómo almacenar esa instantánea mostrada.

Aquí está mi método que recupera todo lo que no sea esa imagen:

//opening place picker activity. protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PLACE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) { final Place place = PlacePicker.getPlace(this, data); final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); String attributions = (String) place.getAttributions(); if (attributions == null) { attributions = ""; } tv4.setText(place.getLatLng().toString()+"/n"+name+"/n"+address+"/n"+attributions); } else { super.onActivityResult(requestCode, resultCode, data); } }

No sé cómo obtener la imagen y almacenarla en almacenamiento externo o interno. ¿Es posible? Tengo que tomar una instantánea como se explica en este enlace?

EDITAR

Tengo la siguiente actividad, que se llama actividad de selector de lugar:

Main2Activity.java:

import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.NavUtils; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepairableException; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.ui.PlacePicker; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import android.database.Cursor; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.maps.OnMapReadyCallback; import java.io.File; import java.io.FileOutputStream; import java.util.Date; public class Main2Activity extends AppCompatActivity implements OnMapReadyCallback{ private static final int PLACE_PICKER_REQUEST = 1; private TextView mName; private TextView mAddress; private TextView mAttributions; private GoogleApiClient mGoogleApiClient; public TextView tv4; private static final LatLngBounds BOUNDS_MOUNTAIN_VIEW = new LatLngBounds( new LatLng(37.398160, -122.180831), new LatLng(37.430610, -121.972090)); private Toolbar toolbar; private GoogleMap mMap; private boolean flag = false; DatabaseHelper myDb; EditText newevent; Button submit; Button viewremainders; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); myDb =new DatabaseHelper(this); newevent=(EditText)findViewById(R.id.newEvent); submit=(Button)findViewById(R.id.submit); viewremainders=(Button)findViewById(R.id.view); toolbar = (Toolbar)findViewById(R.id.app_bar0); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); //for back button to main activity. getSupportActionBar().setDisplayHomeAsUpEnabled(true); Button pickerButton = (Button) findViewById(R.id.pickerButton); tv4 = (TextView)findViewById(R.id.textView4); pickerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder(); intentBuilder.setLatLngBounds(BOUNDS_MOUNTAIN_VIEW); Intent intent = intentBuilder.build(Main2Activity.this); startActivityForResult(intent, PLACE_PICKER_REQUEST); } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) { e.printStackTrace(); } } }); AddData(); viewremainders(); } @Override public void onMapReady(GoogleMap map) { mMap = map; } //method for adding data in Database. public void AddData(){ submit.setOnClickListener( new View.OnClickListener(){ @Override public void onClick(View v){ boolean isInserted =myDb.insertData(newevent.getText().toString(),tv4.getText().toString()); if(isInserted==true) Toast.makeText(Main2Activity.this,"Data Inserted",Toast.LENGTH_LONG).show(); else Toast.makeText(Main2Activity.this,"Data not Inserted",Toast.LENGTH_LONG).show(); } } ); } //Method for view all data from database. public void viewremainders(){ viewremainders.setOnClickListener( new View.OnClickListener(){ @Override public void onClick(View v){ Cursor res= myDb.getAllData(); if(res.getCount()==0) { Showmessage("Error","No remainders found"); return; } StringBuffer buffer=new StringBuffer(); while(res.moveToNext()) { buffer.append("Id : " +res.getString(0)+"/n"); buffer.append("Event : " +res.getString(1)+"/n"); buffer.append("Location : " +res.getString(2)+"/n"); } Showmessage("Data",buffer.toString()); } } ); } public void Showmessage(String title,String message) { AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setCancelable(true); builder.setTitle(title); builder.setMessage(message); builder.show(); } //opening place picker activity. protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PLACE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) { final Place place = PlacePicker.getPlace(this, data); final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); String attributions = (String) place.getAttributions(); if (attributions == null) { attributions = ""; } // tv4.setText(place.getLatLng().toString()+"/n"+name+"/n"+address+"/n"+attributions); To get latitide and longitudes. tv4.setText(address+"/n"+attributions); /* LatLngBounds selectedPlaceBounds = PlacePicker.getLatLngBounds(data); // move camera to selected bounds CameraUpdate camera = CameraUpdateFactory.newLatLngBounds(selectedPlaceBounds,0); mMap.moveCamera(camera); // take snapshot and implement the snapshot ready callback mMap.snapshot(new GoogleMap.SnapshotReadyCallback() { Bitmap bitmap=null; public void onSnapshotReady(Bitmap snapshot) { // handle snapshot here bitmap = snapshot; try { FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory().toString()+"/ing.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); Toast.makeText(Main2Activity.this,"dsfds",Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(Main2Activity.this,e.toString(),Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } });*/ } else { super.onActivityResult(requestCode, resultCode, data); } } private void capture(){ try { // image naming and path to include sd card appending name you choose for file String mPath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_MOVIES).toString(); // create bitmap screen capture View v1 = getWindow().getDecorView().getRootView(); v1.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false); File imageFile = new File(Environment.getExternalStorageDirectory().toString()+"/"+"lllll.jpg"); FileOutputStream outputStream = new FileOutputStream(imageFile); int quality = 100; bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); outputStream.flush(); outputStream.close(); openScreenshot(imageFile); } catch (Throwable e) { // Several error may come out with file handling or OOM e.printStackTrace(); } } private void openScreenshot(File imageFile) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); Uri uri = Uri.fromFile(imageFile); intent.setDataAndType(uri, "image/*"); startActivity(intent); } //Methods for toolbar @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main2, 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(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } if(id == android.R.id.home){ NavUtils.navigateUpFromSameTask(this); } return super.onOptionsItemSelected(item); } }


Como puede obtener las coordenadas largas y lat, puede obtener la imagen del mapa usando la API de Google Maps.

Aquí está el enlace con ejemplos y documentos:

https://developers.google.com/maps/documentation/static-maps/intro

Supongo que esto es lo que el diálogo está haciendo en segundo plano.

Si eso no funciona, o si quiere algo más exacto, le sugiero que use Wireshark para controlar exactamente qué datos se envían y reciben.

Acabo de ejecutar una prueba con las ubicaciones de tu mapa y con esta url:

https://maps.googleapis.com/maps/api/staticmap?center=37.430610,%20-121.972090&zoom=17&size=400x400&key=[myAPIKey]

Tengo esta imagen:

Usando los coords de tu diálogo:

Usando https://maps.googleapis.com/maps/api/staticmap?markers=37.414333,-122.076444&zoom=17&size=400x250&key=[myKey]


Enfrenté el mismo problema. Lo he intentado con la clave de la API y la clave del Servidor en ambos casos me enfrenté al mismo error como "El servidor API de Google Maps rechazó su solicitud ...". Finalmente noté que "Google Static Maps API" se deshabilitaba desde la consola. Simplemente habilito y todo funciona bien.


Puede mirar en los mapas Lite. Utiliza la API api y vistas de mapa, pero trata cada una de manera similar a una imagen en lugar de un mapa interactivo. Aún puede elegir su nivel de zoom y agregar marcadores al mapa.

declare el mapa en su xml como lo haría con un fragmento de mapa de google normal, pero incluya el mapa de etiquetas: liteMode = "true"

<fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:name="com.google.android.gms.maps.MapFragment" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" map:cameraZoom="13" map:mapType="normal" map:liteMode="true"/>

o si está creando el mapa mediante programación, puede usar

GoogleMapOptions options = new GoogleMapOptions().liteMode(true);

se ve desde tu código de actividad como si supieras cómo configurar un mapa de google, para que luego puedas modificar tu onActivityResult para que se vea así

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PLACE_PICKER_REQUEST && resultCode == Activity.RESULT_OK) { final Place place = PlacePicker.getPlace(this, data); final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); String attributions = (String) place.getAttributions(); if (attributions == null) { attributions = ""; } tv4.setText(place.getLatLng().toString()+"/n"+name+"/n"+address+"/n"+attributions); // Add this line to make the lite map show the location you just chose // and set the zoom level (10f is arbitrary) mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 10f)); } else { super.onActivityResult(requestCode, resultCode, data); } }

Más información y citas:

Puedes comenzar aquí si estás buscando más información, hay toneladas de buenos enlaces en esta página https://developers.google.com/maps/documentation/android-api/lite

También puede consultar la Actividad de demostración de Google Lite Maps aquí: https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/LiteDemoActivity.java

Y aquí hay un gran video que explica Lite Maps muy bien: https://youtu.be/N0N1Xkc_1pU


Puede usar la interfaz GoogleMap.SnapshotReadyCallback .

Aquí hay un ejemplo de código sobre cómo usarlo:

SnapshotReadyCallback callback = new SnapshotReadyCallback() { Bitmap bitmap; @Override public void onSnapshotReady(Bitmap snapshot) { bitmap = snapshot; try { FileOutputStream out = new FileOutputStream("/some/where/to/save/it/thesnapshot.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); } catch (Exception e) { e.printStackTrace(); } } }; map.snapshot(callback);

Puede agregar esto en su código cuando muestra el cuadro de diálogo y, al mismo tiempo, guardar la instantánea. Lea más sobre esto en el enlace de arriba.

Espero que esto sea de alguna ayuda para ti y buena suerte.


Si desea mostrar una instantánea del lugar elegido en el diálogo primero, debe guardar la pantalla de vista de mapa en mapa de bits.

Consulte este código para convertir su vista de mapa en mapa de bits

Bitmap screen; View v1 = MyView.getRootView(); v1.setDrawingCacheEnabled(true); screen= Bitmap.createBitmap(v1.getDrawingCache()); v1.setDrawingCacheEnabled(false);

Desde el código anterior, puede obtener un mapa de bits que puede usar en su cuadro de diálogo configurando este mapa de bits en la vista de imagen. Pero tenga en cuenta que debe realizar todas las operaciones antes de generar el diálogo y en el hilo de trabajo.