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
@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);
validate panoramic view available:
mStreetViewPanoramaView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
//Using setPositionWithRadius
streetViewPanorama.setPosition(new LatLng(latitud, longitud), 200);
mPanorama = streetViewPanorama;
mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
@Override
public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
if (streetViewPanoramaLocation == null) {
Log.e("StreetViewActivity","Panoramic view not available");
}
}
});
}
});
For my StreetView app I built a scraping app as a companion, this scraping app goes through all the lat/lng locations at a given radius and queries StreetView for a panorama.
The output of this app is a small text file of lat/lng locations at a resolution suitable for my needs (5 degrees). I then use this data file in my main app as a source for StreetView locations.
Using the setPostion(LatLng, radius) method I'm guaranteed to get a result every time. The size of this file is also quite small < 500kb.
I doubt Google will ever release a dataset of where StreetView has been (I run my scraping app just before each update to my main app to make sure I have up to date values). I'm not sure if they'd provide a method that has the following signature either boolean hasStreetView(LatLng, radius).
I google a lot for this question. Finally I got one useful link. See there is no direct way to use getPanoramaByLocation() javascript function in android api. But there is a work around to this.
Here I'm providing url :
http://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,-73.988354&fov=90&heading=235&pitch=10
See cases :
See this url :
http://maps.googleapis.com/maps/api/streetview?size=400x400&location=73.67868,-73.988354&fov=90&heading=235&pitch=10
Check this link for response when you hit url for fetching streetview :
https://developers.google.com/maps/documentation/geocoding/?hl=nl
I've created a small library (based on VVB's answer), that lets you (pretty reliably) check if StreetView is available for a specific location.
Feel free to check it out.