如何获取谷歌地图v2的快照?

11

我必须使用在 Google 地图 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);  


}

}

非常感谢!


1
可能是如何从Google Map V2获取快照的重复问题。 - g00dy
1
请查看 https://dev59.com/R2Yr5IYBdhLWcg3wTYq4#18308611,其中包含完整的步骤和示例。 - Tarsem Singh
5个回答

16

你必须在按钮监听器中调用Google地图的快照方法,因为如果你太早调用它,它会给你一个错误,如位图宽度必须大于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);
            }
        });
    }

1
无法解析(snapshot(callback))。我有什么遗漏吗? - Uzair Qaiser

10

这个更好,它会等待地图完全呈现后再进行快照。

更新于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


4

点击按钮以获取 谷歌地图 快照时,请尝试使用 Kotlin Android,如下所示:

val snapshotReadyCallback : GoogleMap.SnapshotReadyCallback = GoogleMap.SnapshotReadyCallback { selectedScreenShot ->
    ivMapPreview.setImageBitmap(selectedScreenShot);
}

val onMapLoadedCallback : GoogleMap.OnMapLoadedCallback = GoogleMap.OnMapLoadedCallback {
    mMap!!.snapshot(snapshotReadyCallback)
}

mMap!!.setOnMapLoadedCallback(onMapLoadedCallback)

成功。


1
最佳答案。你救了我的一天。 - vida kamalifar
@vidakamalifar,我什么也没做,亲爱的Vida。希望我的回答对你有用。 - reza_khalafi

1

我尝试了被接受的答案,但它没有起作用,然后尝试了另一种方法,对我有效。

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(),它是一个自定义方法,用于检查地图是否已初始化,然后再进行拍摄。谢谢。 - Faisal Naseer

0

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)

public final void snapshot (GoogleMap.SnapshotReadyCallback callback)

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


是的,我已经阅读了这个,但我无法做到这一点,这就是为什么我要求一个例子的原因。 - user2682360
你为什么不在问题中告诉我们?有什么问题吗? - Waza_Be

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接