Comment récupérer des instantanés de carte de l'activité de lieu-picker?

je crée une application qui sélectionne des endroits dans Google maps et stocke l'adresse dans la base de données. Je veux aussi stocker le snapshot de l'endroit choisi dans le stockage, de sorte que je puisse afficher les données avec snapshot correspondant.

lorsque je sélectionne un lieu sur la carte, l'activité de recherche de lieu affiche le dialogue suivant:

enter image description here

Ici, dans le dialogue, l'adresse, latitude et longitude et aussi le cliché est montré. Je sais comment obtenir l'adresse et le latling. mais je ne sais pas comment stocker ce cliché affiché.

voici ma méthode qui récupère tout autre 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. Est-il possible? Je dois prendre des photos comme expliqué dans ce lien?

MODIFIER

j'ai l'activité suivante, qui est l'activité de lieu-picker:

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
demandé sur Community 2016-08-18 13:49:42

5 réponses

comme vous pouvez obtenir les coordonnées long et lat, vous pouvez obtenir l'image de la carte en utilisant L'api GoogleMaps.

Voici le lien avec des exemples et des docs:

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

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

si cela ne fonctionne pas, ou si vous voulez quelque chose de plus précis, je suggère utiliser Wireshark pour surveiller exactement quelles données sont envoyées et reçues.

je viens de lancer un test avec vos localisations 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

utilisant les coords de votre dialogue:

enter image description here

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

enter image description here

6
répondu Mick 2016-09-13 05:11:06

vous pouvez utiliser le GoogleMap.SnapshotReadyCallback interface.

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 ajouter dans votre code lorsque vous affichez la boîte de dialogue et en même temps économiser de l'instantané. Lire plus à ce sujet dans le lien ci-dessus.

j'espère que cela vous sera utile et vous portera chance.

2
répondu Carlton 2016-09-12 20:51:12

si vous voulez afficher un instantané de l'endroit choisi dans la boîte de dialogue, vous devez d'abord sauvegarder l'écran de la vue de carte dans bitmap.

Désignent le présent code pour la conversion de votre carte afficher 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 Bitmap que vous pouvez utiliser dans votre boîte de dialogue en définissant ce bitmap dans la vue d'image. Mais gardez à l'esprit que vous devez effectuer toutes les opérations avant de générer dialog et sur worker thread.

0
répondu Nikhil Singh 2016-09-05 09:00:22

vous pourriez regarder dans maps Lite. Il utilise l'api GoogleMaps et les vues de carte, mais traite chacune d'entre elles de manière similaire à une image plutôt qu'à une carte interactive. Vous pouvez toujours choisir votre niveau de zoom et ajouter des repères à la carte.

déclarez la carte dans votre xml comme vous le feriez un fragment de carte de google régulier mais incluez le tag map: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 programmation, vous pouvez utiliser

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

il semble à partir de votre code D'activité comme vous savez comment configurer une carte google, de sorte que vous pouvez ensuite modifier votre onActivityResult à ressembler à cela

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'information, il ya des tonnes de bons liens sur cette page https://developers.google.com/maps/documentation/android-api/lite

vous pouvez également consulter le Google Activité de démonstration de Lite Maps ici: https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/LiteDemoActivity.java

et voici une grande vidéo qui explique très bien les cartes Lite: https://youtu.be/N0N1Xkc_1pU

0
répondu Ethan 2016-09-13 05:35:25

j'ai fait face à la même question. J'ai essayé avec la clé API et la clé du serveur dans les deux cas, j'ai fait face à la même erreur comme "le serveur API GoogleMaps a rejeté votre demande... ". Finalement j'ai remarqué que " API Googlestatic Maps " était désactivé de la console. Je viens de activer et tout fonctionne très bien.

0
répondu Bhavin Chauhan 2017-03-30 05:44:56