【问题标题】:How to take google Maps v2 snapshot?如何拍摄谷歌地图 v2 快照?
【发布时间】:2013-08-14 12:11:16
【问题描述】:

我必须使用在 8 月发布的谷歌地图中实施的新“快照制作器”来解决这个问题,但我不知道该怎么做。 有人能举个简单的例子吗?

这是我的代码:

public class MainActivity extends Activity {
static LatLng HAMBURG = new LatLng(47.524749, 21.632745);
GoogleMap map;
File dbFile;
private File imageFile;


@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PolylineOptions line = new PolylineOptions();

    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap();
    /*
     * Adatbázis
     */
    try {
        dbFile = getDatabasePath("/mnt/sdcard/Download/TeleSensors.db");
    } catch (Exception e) {

    }

    SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase(
            dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);

    Cursor curTAB = myDataBase.rawQuery("SELECT * FROM  GPS_Values;", null);

    Integer count = 0;
    while (curTAB.moveToNext()) {
        String s_latitude = curTAB.getString(1);
        String s_longitude = curTAB.getString(2);
        count++;
        double latitude = Double.parseDouble(s_latitude);
        double longitude = Double.parseDouble(s_longitude);
        line.add(new LatLng(latitude, longitude));

        Log.i("Coordinates",
                s_latitude.toString() + " --- " + s_longitude.toString());

    }
    curTAB.close();
    myDataBase.close();
    // adatbázis vége

    map.addPolyline(line);

    // map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    // map.setMapType(GoogleMap.MAP_TYPE_NONE);
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    // map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
    // map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

    // Move the camera instantly to hamburg with a zoom of 15.
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));

    // Zoom in, animating the camera.
    map.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);  


}

}

非常感谢!

【问题讨论】:

标签: android google-maps


【解决方案1】:

您必须在按钮侦听器中调用 Google 地图快照方法,因为如果您过早使用它,它会给您错误 bitmap width has to be larger than 0 或类似的东西。 这是代码

private void button_listener() {
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SnapshotReadyCallback callback = new SnapshotReadyCallback() {
                    Bitmap bitmap;

                    @Override
                    public void onSnapshotReady(Bitmap snapshot) {
                        bitmap = snapshot;
                        try {
                            FileOutputStream out = new FileOutputStream("/mnt/sdcard/Download/TeleSensors.png");
                            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };

                map.snapshot(callback);
            }
        });
    }

【讨论】:

  • 无法解析(快照(回调))。我错过了什么吗?
【解决方案2】:

这个更好,它会等待您的地图完全渲染,然后再拍摄快照。

它于 2013 年 10 月 31 日更新。

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
    public void onMapLoaded() {
        mMap.snapshot(new GoogleMap.SnapshotReadyCallback() {
            public void onSnapshotReady(Bitmap bitmap) {
                // Write image to disk
                FileOutputStream out = new FileOutputStream("/mnt/sdcard/map.png");
                bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            }
        });
    }
});

摘自http://googlegeodevelopers.blogspot.sg/2013/10/ghost-markers-in-your-neighborhood-new.html

【讨论】:

    【解决方案3】:

    尝试Kotlin Android,点击按钮拍摄google map快照:

    val snapshotReadyCallback : GoogleMap.SnapshotReadyCallback = GoogleMap.SnapshotReadyCallback {
        ivMapPreview.setImageBitmap(selectedScreenShot);
    }
    
    val onMapLoadedCallback : GoogleMap.OnMapLoadedCallback = GoogleMap.OnMapLoadedCallback {
        mMap!!.snapshot(snapshotReadyCallback)
    }
    
    mMap!!.setOnMapLoadedCallback(onMapLoadedCallback)
    

    取得成功。

    【讨论】:

    • 最佳答案。你拯救了我的一天
    • @vidakamalifar 亲爱的维达,我什么都没做。希望我的回答对你有用。
    【解决方案4】:

    https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/GoogleMap#snapshot(com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback, android.graphics.Bitmap)

    公共最终无效快照(GoogleMap.SnapshotReadyCallback 回调)

    拍摄地图的快照。 当交互式地图难以或不可能时,您可以在应用程序中使用快照, 使用。例如,使用 snapshot() 方法生成的图像可以是 用于在您的应用程序中显示地图的缩略图,或在应用程序中显示快照 通知中心。

    【讨论】:

    • 是的,我读过这篇文章,但我做不到这就是为什么我要一个例子
    • 你为什么不在你的问题中告诉我们?有什么问题?
    【解决方案5】:

    我尝试了接受的答案,但没有成功,然后尝试了另一种对我有用的方法。

    private void CaptureScreen() {
            if(initMap()){
                SnapshotReadyCallback callback = new SnapshotReadyCallback() {
                    Bitmap bitmap=null;
    
                    @Override
                    public void onSnapshotReady(Bitmap snapshot) {
                        // TODO Auto-generated method stub
                        bitmap = snapshot;
                        try {
                            saveImage(bitmap);
                            Toast.makeText(getApplicationContext(), "Image Saved", Toast.LENGTH_LONG).show();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
    
                    private void saveImage(Bitmap bitmap) throws IOException{
                        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes);
                        File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.png");
                        f.createNewFile();
                        FileOutputStream fo = new FileOutputStream(f);
                        fo.write(bytes.toByteArray());
                        fo.close();
    
                    }
                };
    
                mMap.snapshot(callback);
            }
            else{
                Toast.makeText(this, "Map is not Initialized yet", Toast.LENGTH_LONG).show();
                return ;
            }
        }
    

    【讨论】:

    • 您也可以在不测试 initMap() 的情况下尝试它,这是一种自定义方法,用于在拍摄前检查地图是否已初始化。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多