How to check if position if valid in StreetView in Android

后端 未结 5 1497
执笔经年
执笔经年 2020-12-16 15:22

I have an app that is randomly generating positions in a GoogleMaps based on a defined boundary. So I first generate a random LatLng and then I verify if this point is insid

5条回答
  •  抹茶落季
    2020-12-16 15:27

    @Override
    public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
        mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
    @Override
    public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
        if (streetViewPanoramaLocation != null && streetViewPanoramaLocation.links != null) {
            // location is present
        } else {
            // location not available
        }
    }
     });
    

    EDIT: Google's official answer is here (https://code.google.com/p/gmaps-api-issues/issues/detail?id=7033), which points here: https://code.google.com/p/gmaps-api-issues/issues/detail?id=4823

    The official solution involves using the official Google Street View Image API (free, no limit - https://developers.google.com/maps/documentation/streetview/metadata) via HTTPS.

    OLD (DEPRECATED) ANSWER:

    I've hacked together a workaround for this that is ugly but stays within the API, until Google updates it to allow querying for panoramas the way the iOS SDK does.

    This involves creating a StreetViewPanoramaView, but not attaching it to the layout, and setting its position to the current location. And then testing if it has a panorama location following that.

    This seems to work, but will be filing a request on the Android Google Maps API V2 (Which is part of the google play services API) tracker to add this, since the iOS SDK has this capability.

    // Handle on the panorama view
    private StreetViewPanoramaView svpView;
    
    ...
    
    // create a StreetViewPanoramaView in your fragment onCreateView or activity onCreate method
    // make sure to handle its lifecycle methods with the fragment or activity's as per the documentation - onResume, onPause, onDestroy, onSaveInstanceState, etc.
    StreetViewPanoramaOptions options = new StreetViewPanoramaOptions();
    svpView = new StreetViewPanoramaView(getActivity(), options);
    svpView.onCreate(savedInstanceState);
    
    ...
    
    // Snippet for when the map's location changes, query for street view panorama existence
    private Handler mHandler = new Handler();
    private static final int QUERY_DELAY_MS = 500;
    
    // When the map's location changes, set the panorama position to the map location
    svpView.getStreetViewPanorama().setPosition(mapLocationLatLng);
    
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (svpView.getStreetViewPanorama().getLocation() != null) {
                // YOUR DESIRED ACTION HERE -- get the panoramaID, etc..
                // getLocation() -- a StreetViewPanoramaLocation -- will be null if there is no panorama
                // We have to delay this a bit because it may take some time before it loads
                // Note that adding an OnStreetViewPanoramaChangeListener doesn't seem to be reliably called after setPosition is called and there is a panorama -- possibly because it's not been added to the layout?
            }
        }
    }, QUERY_DELAY_MS);
    

    EDIT: to use the new Async API call:

    svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
            panorama.setPosition(mapLocationLatLng, DEFAULT_SEARCH_RADIUS);
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (panorama.getLocation() != null) {
                        // your actions here
                    }
                }
            }, QUERY_DELAY_MS);
    

提交回复
热议问题