如何从地图 activity 中获取选定位置并将其传递给父级 activity?

How to get selected location from map activity and pass it to a parent activity?

对于当前的项目,我需要对经纬度数据进行处理。

我正在使用 Google 地图 api(不是地图应用程序)。
创建项目时,我选择使用 Google 地图 Activity 模板。 该项目包含一个 MainActivity 和一个 MapsActivity。 (最少 api 19)

我正在寻找一种方法来从用户在地图上触摸的位置获取经度和纬度。

需要在 MapsActivity 中选择所选位置的经度和纬度,然后传递给 MainActivity(使用 CONSTANTS 还是意图?) 最后,当用户选择位置,数据传递成功后,用户回到MainActivity.

如何使用 Google 地图 API 为 Android 在地图 Activity 上获取所选位置,并将所选位置传回到主Activity?

使用startActivityForResult()打开MapsActivity,然后在Google地图上使用点击监听器让用户选择一个点。

这是一个简单的例子。

首先是 MainActivity,它会在单击按钮时打开 MapsActivity,并显示一个 Toast,其中 lat/lon 是用户在 MapsActivity 中选择的点:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_two);

        Button button = (Button) findViewById(R.id.button_pick_point);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pickPointOnMap();
            }
        });
    }

    static final int PICK_MAP_POINT_REQUEST = 999;  // The request code
    private void pickPointOnMap() {
        Intent pickPointIntent = new Intent(this, MapsActivity.class);
        startActivityForResult(pickPointIntent, PICK_MAP_POINT_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICK_MAP_POINT_REQUEST) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
                LatLng latLng = (LatLng) data.getParcelableExtra("picked_point");
                Toast.makeText(this, "Point Chosen: " + latLng.latitude + " " + latLng.longitude, Toast.LENGTH_LONG).show();
            }
        }
    }

}

然后,MapsActivity,它使用 GoogleMap.OnMapClickListener 来获取用户选择的点的 lat/lon,并将数据传回 MainActivity。请注意,LatLng 对象可以作为额外传递,因为它实现了 Parcelable 接口。

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                Intent returnIntent = new Intent();
                returnIntent.putExtra("picked_point",latLng);
                setResult(Activity.RESULT_OK,returnIntent);
                finish();
            }
        });
    }
}