2016-08-18 1 views
25

Je crée une application qui sélectionne des lieux à partir des cartes Google et stocke l'adresse dans la base de données. Je veux également stocker l'instantané de l'endroit choisi dans le stockage, ainsi je peux montrer les données avec l'instantané correspondant.Comment récupérer un instantané d'une carte à partir d'une activité de sélection de lieu?

Lorsque je sélectionne un endroit de la carte, l'activité de lieu sélecteur montre 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 aussi l'instantané est montré. Je sais comment obtenir l'adresse et le latLng. mais je ne sais pas comment stocker l'instantané 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 le stockage externe ou interne. C'est possible? Je l'ai à capturer des images comme expliqué dans this link?

EDIT

je l'activité suivante, qui appelle l'activité du 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

+0

nous pouvons prendre un instantané de n'importe quelle vue mais nous devrions avoir la référence de vue. –

+0

mais ne pouvons-nous pas récupérer cette image comme l'adresse et la latitude et la longitude? @SohailZahid –

+0

quel lien suivez-vous envoyez-moi je pourrais vous aider? –

Répondre

5

Puisque vous êtes en mesure d'obtenir les coordonnées long et lat, vous pouvez obtenir l'image de la carte en utilisant l'API Google Maps.

Voici le lien avec des exemples et des documents:

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 d'utiliser Wireshark pour surveiller exactement quelles données sont envoyées et reçues.

J'ai juste couru un test avec vos emplacements de carte et cette url:

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

Je suis cette image:

enter image description here

En utilisant les coords de votre boîte de dialogue:

enter image description here

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

enter image description here

+0

hey merci pour la réponse. En fait, je veux ce type de photo de carte ::: http://stackoverflow.com/questions/39011248/cant-identify-which-element-is-used –

+0

Pouvez-vous suggérer quelque chose? Je pense que votre lien contient ce type de photos. –

+0

J'ai mis à jour ma réponse – Mick

0

Si vous souhaitez afficher l'instantané de l'endroit sélectionné dans la boîte de dialogue, vous devez d'abord enregistrer l'écran de la vue cartographique dans le bitmap.

Référez ce code pour convertir votre carte en vue bitmap

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

De code ci-dessus, vous pouvez obtenir Bitmap qui vous pouvez continuer à utiliser dans votre boîte de dialogue en définissant cette bitmap en vue de l'image. Mais gardez à l'esprit 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

quelle vue je passe de cette méthode en appelant? –

+0

vous ne devez pas utiliser le code ci-dessous car j'ai modifié la réponse et vous obtenez déjà bitmap à partir de là utiliser cette image bitmap pour définir dans imageview. –

+0

où mettre ce code? –

2

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 ajouter dans votre code lorsque vous affichez la fenêtre et dans le même temps enregistrer l'instantané. En savoir plus à ce sujet dans le lien ci-dessus. J'espère que cela vous sera utile et bonne chance.

0

Vous pouvez consulter les cartes Lite. Il utilise l'API google maps et les vues cartographiques, mais traite chacune d'elles comme une image plutôt qu'une carte interactive. Vous pouvez toujours choisir votre niveau de zoom et ajouter des marqueurs à la carte.

déclare la carte dans votre xml comme vous un fragment de carte google régulière mais inclure la carte de 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 vous pouvez programme utiliser

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

il semble de votre code d'activité comme vous savez comment mettre en place une carte Google, vous pouvez alors modifier votre onActivityResult pour ressembler à ce

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 cherchez 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 Maps Lite Google Activité de démonstration ici: https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/LiteDemoActivity.java

Et voici une superbe vidéo qui explique carte Lite vraiment bien: https://youtu.be/N0N1Xkc_1pU

0

I fa même problème. J'ai essayé avec la clé d'API et la clé de serveur dans les deux cas j'ai fait face à la même erreur comme "le serveur d'API de Google Maps a rejeté votre demande ...". Enfin, j'ai remarqué que "Google Static Maps API" était désactivé à partir de la console. Je viens activer et tout fonctionne bien.