如何检索地点选取器活动的地图快照?

我正在创build一个应用程序,从Google地图中挑选地点,并将地址存储在数据库中。 我也想将选取的地点的快照存储在存储器中,这样我就可以显示相应的快照。

当我从地图中select一个地方时,地点select器活动显示如下对话框:

在这里输入图像说明

在对话框中,显示地址,纬度和经度以及快照 。 我知道如何获得地址和latLng。 但不知道如何存储显示的快照。

这是我的方法检索除了该图像以外的一切:

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

我不知道如何获取图像并将其存储在外部或内部存储中。 可能吗? 我必须按照这个链接解释快照?

编辑

我有以下的活动,这是调用地方select器的活动:

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

在这里输入图像说明 在这里输入图像说明

Solutions Collecting From Web of "如何检索地点选取器活动的地图快照?"

由于您可以获取长和纬度坐标,因此您可以使用Google地图API获取地图图像。

以下是包含示例和文档的链接:

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

我认为这是对话在后台做的事情。

如果这不起作用,或者你想要更精确的东西,我build议使用Wireshark来准确地监控哪些数据正在发送和接收。

我刚刚用你的地图位置进行了testing,并用这个url:

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

我得到这个图像:

在这里输入图像说明

使用对话框中的坐标:

在这里输入图像说明

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

在这里输入图像说明

您可以使用GoogleMap.SnapshotReadyCallback界面。

以下是关于如何使用它的代码示例:

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

当您显示对话框并同时保存快照时,您可以将其添加到代码中。 在上面的链接阅读更多关于它。

我希望这会对你有所帮助,祝你好运。

如果您想先在对话框中显示所选位置的快照,则必须将地图视图的屏幕保存为位图。

请参考此代码将您的地图视图转换为位图

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

从上面的代码中,您可以获得位图,您可以通过将该位图设置为图像视图来在对话框中进一步使用该位图。 但请记住,您必须在生成对话框和工作线程之前执行所有操作。

你可能会看地图精简版。 它使用谷歌地图API和地图的意见,但对待每一个类似的图像,而不是交互式地图。 您仍然可以select缩放级别并将标记添加到地图。

在你的xml中声明地图,就像你会定期的google地图片段一样,但是包含标签地图: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"/> 

或者如果您以编程方式创build地图,则可以使用

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

它从你的活动代码看起来像你知道如何build立一个谷歌地图,所以你可以修改你的onActivityResult看起来像这样

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

更多信息和引用:

如果您想了解更多信息,请点击此处https://developers.google.com/maps/documentation/android-api/lite

您还可以在这里查看Google Lite Maps演示活动: https : //github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/LiteDemoActivity.java

这里有一个非常棒的video,可以很好地解释精简版地图: https : //youtu.be/N0N1Xkc_1pU

我面临同样的问题。 我已经尝试过使用API​​密钥和服务器密钥,在这两种情况下,我面临着同样的错误,如“Google Maps API服务器拒绝您的请求…”。 最后我注意到“Google Static Maps API”已经从控制台中禁用了。 我只是启用 ,一切正常。