web-dev-qa-db-fra.com

Comment récupérer un instantané de la carte à partir d'une activité de sélecteur de lieu?

Je crée une application qui sélectionne des lieux dans Google Maps et stocke l'adresse dans la base de données. Je souhaite également stocker l'instantané de l'endroit choisi dans le stockage, afin de pouvoir afficher les données avec l'instantané correspondant.

Lorsque je sélectionne un lieu sur la carte, l'activité de sélecteur de lieu affiche la boîte de dialogue suivante:

 enter image description here

Ici, dans la boîte de dialogue, l’adresse, la latitude et la longitude et l’instantané est également affiché. Je sais comment obtenir l'adresse et la latLng. mais je ne sais pas comment stocker cet instantané affiché.

Voici ma méthode qui récupère tout autre chose que cette image:

  //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);
    }
}

Je ne sais pas comment obtenir l'image et la stocker dans un stockage externe ou interne. C'est possible? Je dois prendre un instantané comme expliqué dans ce lien?

EDIT

J'ai l'activité suivante, qui appelle l'activité de repère-lieu:

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);
}
}

 enter image description here  enter image description here

26
user6649667

Etant donné que vous pouvez obtenir les coordonnées longues et lat, vous pouvez obtenir l’image de la carte en utilisant l’API Google Maps.

Voici le lien avec des exemples et de la documentation:

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

Je suppose que c'est ce que le dialogue fait en arrière-plan.

Si cela ne fonctionne pas, ou si vous voulez quelque chose de plus exact, je suggère d'utiliser Wireshark pour contrôler exactement quelles données sont envoyées et reçues.

Je viens de lancer un test avec vos emplacements de carte et avec cette URL:

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

J'ai cette image:

 enter image description here

En utilisant les coordonnées de votre dialogue:

 enter image description here

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

 enter image description here

6
Mick

Vous pouvez utiliser l'interface GoogleMap.SnapshotReadyCallback .

Voici un exemple de code sur la façon de l'utiliser:

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);

Vous pouvez l'ajouter dans votre code lorsque vous affichez la boîte de dialogue et en même temps, enregistrez l'instantané. En savoir plus à ce sujet dans le lien ci-dessus.

J'espère que cela vous sera utile et bonne chance.

2
Carlton

Si vous souhaitez d'abord afficher un instantané de l'endroit choisi dans la boîte de dialogue, vous devez enregistrer l'écran de la carte dans une image bitmap.

Référez-vous ce code pour convertir votre vue cartographique en bitmap 

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

À partir du code ci-dessus, vous pouvez obtenir un bitmap que vous pouvez utiliser dans votre boîte de dialogue en définissant ce bitmap dans la vue image. Mais n'oubliez pas que vous devez effectuer toutes les opérations avant de générer la boîte de dialogue et sur le thread de travail.

0
Nikhil Singh

J'ai fait face au même problème. J'ai essayé avec la clé API et la clé Serveur dans les deux cas. J'ai rencontré la même erreur, telle que "Le serveur API Google Maps a rejeté votre demande ...". Enfin, j'ai remarqué que "API Google Static Maps" était désactivé de la console. Je viens de enable et tout fonctionne bien. 

0
Bhavin Chauhan

Vous pourriez regarder dans les cartes Lite. Il utilise l’API et les vues cartographiques de Google Maps, mais traite chacune d’elles de la même manière qu’une image plutôt qu’une carte interactive. Vous pouvez toujours choisir votre niveau de zoom et ajouter des marqueurs à la carte.

déclarez la carte dans votre fichier xml comme vous le feriez avec un fragment de carte google standard , mais incluez la carte tag: 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"/>

ou si vous créez la carte par programme, vous pouvez utiliser 

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

votre code d'activité semble indiquer comment configurer une carte Google. Vous pouvez ensuite modifier votre onActivityResult pour qu'il ressemble à ceci.

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);
}
}

Plus d'informations et citations:

Vous pouvez commencer ici si vous recherchez plus d'informations, il y a des tonnes de bons liens sur cette page https://developers.google.com/maps/documentation/Android-api/lite

vous pouvez également consulter l'activité de démonstration de Google Lite Maps ici: https://github.com/googlemaps/Android-samples/blob/master/ApiDemos/app/src/main/Java/com/ exemple/mapdemo/LiteDemoActivity.Java

Et voici une superbe vidéo qui explique très bien Lite Maps: https://youtu.be/N0N1Xkc_1pU

0
Ethan