我已经在我的应用程序中实现了Google地图,以显示带有导航按钮的工具栏。

文件:
https://developers.google.com/maps/documentation/android-api/controls#map_toolbar

android - 如何调整Google Map Toolbar以激发“通用” Intent -Android-LMLPHP

但是,它正在激发特定的Google Maps意图。

我可以对其进行调整以激发“通用”意图,以便用户选择自己选择的导航应用程序吗?

在此先感谢您的时间。

最佳答案

您无法控制“地图工具栏”。根据the documentation(强调我的观点):


  工具栏上显示的图标可用于访问Google Maps移动应用中的地图视图或路线请求


如果要启动自己的Intent,则需要在执行googleMap.getUiSettings().setMapToolbarEnabled(false);的同时禁用此工具栏,然后实现自己的GoogleMap.OnMarkerClickListener以显示自定义按钮。



一种解决方法(但很难看)可能是找到Google Map Directions Button(带有GoogleMapDirectionsButton标签)并覆盖其功能。这是一个工作示例:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private SupportMapFragment mapFragment;

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

        mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        googleMap.getUiSettings().setMapToolbarEnabled(true);

        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(40.42, -3.7), 17));
        googleMap.addMarker(new MarkerOptions().position(new LatLng(40.42, -3.7)));

        googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(final Marker marker) {
                View v = findGoogleMapDirectionsButton(mapFragment.getView());
                if (v != null) {
                    v.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(final View view) {
                            final LatLng targetLatLng = new LatLng(
                                    marker.getPosition().latitude,
                                    marker.getPosition().longitude);
                            final Intent intent = new Intent(
                                    Intent.ACTION_VIEW,
                                    Uri.parse("google.navigation:q="
                                            + targetLatLng.latitude
                                            + ","
                                            + targetLatLng.longitude));
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            MapsActivity.this.startActivity(intent);
                        }
                    });
                }

                return false;
            }
        });
    }

    private View findGoogleMapDirectionsButton(View v) {
        View directionsButton = null;

        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                directionsButton = findGoogleMapDirectionsButton(vg.getChildAt(i));
                if (directionsButton != null) {
                    break;
                }
            }
        } else if (v.getTag() != null
                && "GoogleMapDirectionsButton".equalsIgnoreCase(v.getTag().toString())) {
            directionsButton = v;
        }

        return directionsButton;
    }
}

09-04 20:18