0

I am a newbie wrt android development. My goal is to have a video running inside a customized info window in google maps V2 API android. I know how to make a video run inside a view (by loading series of images making them to look like a movie) Also I learnt how to load image inside a customized infowindow. I am trying to have image slide show inside the infowindow. But the problem is only the first image is getting loaded. Unless otherwise I click on the marker again, the infoWindow contents are not getting updated. I am attaching my code below

main_activity.java

public class BasicMapActivity extends FragmentActivity {
   private GoogleMap mMap;
   static final LatLng MELBOURNE = new LatLng(-37.81319, 37.00);
   public static LatLng argOut = null;
   public static String msg = "1";

   private static ImageView imageView;
   int i=0;
   int imgid[]={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};
   RefreshHandler refreshHandler=new RefreshHandler();

   class RefreshHandler extends Handler{
       @Override
       public void handleMessage(Message msg) {
        BasicMapActivity.this.updateUI(null);
       }
       public void sleep(long delayMillis){
           this.removeMessages(0);
           sendMessageDelayed(obtainMessage(0), delayMillis);
       }
   };

  public void updateUI(Marker markerShowingInfoWindow){
        refreshHandler.sleep(2000);
        if(i<imgid.length){
            imageView.setImageResource(imgid[i]);
            if (markerShowingInfoWindow != null && true) {
                markerShowingInfoWindow.showInfoWindow();
            } 
            i++;
          }
   }


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

@Override
protected void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}


private void setUpMapIfNeeded() {
    if (mMap == null) {
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        if (mMap != null) {
            setUpMap();
        }
    }
}

private void setUpMap() {

    Marker melbourne = mMap.addMarker(new MarkerOptions()
    .position(MELBOURNE)
    .title("Melbourne")
    .snippet("Population: 4,137,400"));

   // when a infowindow is tapped (infowindow open request)
    mMap.setInfoWindowAdapter(new InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }

        @Override
        public View getInfoContents(Marker arg0) {
            String test = arg0.getTitle();
            View v = getLayoutInflater().inflate(R.layout.windowlayout, null);
            imageView = (ImageView) v.findViewById(R.id.imageView1);
            imageView.setVisibility(View.VISIBLE);
            if(!test.equalsIgnoreCase("Melbourne")){
                 updateUI(arg0);
            } else {
                imageView.setImageDrawable(getResources().getDrawable(R.drawable.badge_wa));
            }

            return v;
        }
    });

}

}

ErrorStackTrace is as follows :

11-03 13:58:19.000: E/AndroidRuntime(5095): FATAL EXCEPTION: main
11-03 13:58:19.000: E/AndroidRuntime(5095): java.lang.StackOverflowError
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.util.ArrayList.<init>(ArrayList.java:81)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.Throwable.<init>(Throwable.java:66)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.Throwable.<init>(Throwable.java:108)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.Exception.<init>(Exception.java:60)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:50)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.reflect.Constructor.constructNative(Native Method)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.createView(LayoutInflater.java:586)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:653)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:678)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity$1.getInfoContents(BasicMapActivity.java:123)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.GoogleMap$10.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bnw.b(SourceFile:112)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.a(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.b(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bn.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bqt.onTransact(SourceFile:145)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.internal.d$a$a.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.Marker.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity.updateUI(BasicMapActivity.java:74)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity$1.getInfoContents(BasicMapActivity.java:127)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.GoogleMap$10.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bnw.b(SourceFile:112)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.a(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.b(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bn.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bqt.onTransact(SourceFile:145)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.internal.d$a$a.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.Marker.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity.updateUI(BasicMapActivity.java:74)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity$1.getInfoContents(BasicMapActivity.java:127)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.GoogleMap$10.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bnw.b(SourceFile:112)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.a(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.b(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bn.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bqt.onTransact(SourceFile:145)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.internal.d$a$a.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.Marker.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity.updateUI(BasicMapActivity.java:74)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity$1.getInfoContents(BasicMapActivity.java:127)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.GoogleMap$10.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bnw.b(SourceFile:112)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.a(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bm.b(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at maps.ag.bn.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at bqt.onTransact(SourceFile:145)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at android.os.Binder.transact(Binder.java:297)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.internal.d$a$a.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.model.Marker.showInfoWindow(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity.updateUI(BasicMapActivity.java:74)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.example.mapdemo.BasicMapActivity$1.getInfoContents(BasicMapActivity.java:127)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.GoogleMap$10.g(Unknown Source)
11-03 13:58:19.000: E/AndroidRuntime(5095):     at com.google.android.gms.maps.internal.d$a.onTransact(Unknown Source)

I am trying to call the showInfoWindow() on the marker object that is passed on to the updateUI function within the getInfoContents. What am i doing wrong and whats the correct way to call the showInfo window after the imageView inside the infoWindow gets a new image?

Arun GK
  • 538
  • 3
  • 10

2 Answers2

4

My goal is to have a video running inside a customized info window in google maps V2 API android

That is not possible, sorry. The map, including its info window, is rendered by another process (the one running the Play Services Framework). It cannot handle animation, let alone videos.

But the problem is only the first image is getting loaded.

Correct.

You are welcome to call showInfoWindow() again on the Marker, to trigger it to call your InfoWindowAdapter again, where you can show the next image in sequence, and see if that works to your satisfaction.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Thanks for the reply. I am trying to call showInfoWindow() inside the getInfoContents(Marker marker) function using the marker object parameter. But I am getting android.view.InflateException at the line inside the getInfoContents where I am loading the view again. – Arun GK Nov 03 '13 at 18:18
  • @ArunGK: Post your revised code and the stack trace in your question. – CommonsWare Nov 03 '13 at 18:22
  • Sorry I cant paste the entire code here due to space limitations. I have added only one line though, In the above pasted code, in the updateUI(Marker markerShowingInfoWindow) function, after I am setting the image resource, I have added the following lines `if (markerShowingInfoWindow != null && true) { markerShowingInfoWindow.showInfoWindow(); }` – Arun GK Nov 03 '13 at 18:39
  • @ArunGK: Sorry, but I cannot help you resolve an `InflateException` without seeing the layout you are inflating, where you are inflating it, and the full stack trace of the exception. You will have to debug that for yourself, I am afraid. – CommonsWare Nov 03 '13 at 18:40
  • I have updated the question with new comments and the stackTrace log – Arun GK Nov 03 '13 at 19:12
  • @ArunGK: You cannot call `showInfoWindow()` from `getInfoContents()`, as you trigger infinite recursion and a `StackOveflowError`, as you have seen. – CommonsWare Nov 03 '13 at 19:16
  • Kindly advice me with a right place to call the showInfoWindow. I am looping through various images inside the getInfoContents. Hence I believed that it should be right place to refresh the InfoWindow contents. can you suggest me any different approach ? – Arun GK Nov 03 '13 at 19:21
  • 1
    @ArunGK: Your timing loop, and the call to `showInfoWindow()`, would need to be outside of your `InfoWindowAdapter`, probably in your activity or fragment that hosts the map. That being said, I have never tried this. – CommonsWare Nov 03 '13 at 19:25
  • Hola.. It worked. You saved my day.. Thanks again ! Can you write this up as a answer so that I can mark it as a accepted answer – Arun GK Nov 03 '13 at 19:41
3

I was stuck on a similar problem I solved it by closing the infowindow and showing it again, Time between these two events doesn't even give off a flicker. I also added a Cache Array. I found this link very useful in solving my own issue Link

public View getInfoContents(Marker marker) {
    View popup = contentsCache.get(marker.getId()); // cache array


        if(popup == null){
                contentsCache.put(marker.getId(), popup);
                popup = mInflater.inflate(R.layout.custom_info_contents, null);
                TextView tv=(TextView)popup.findViewById(R.id.title);
                tv.setText(marker.getTitle());
                ImageView i = (ImageView) popup.findViewById(R.id.img);
                Uri image=images.get(marker.getId());
                Log.i(TAG, marker.getId()+"");
                if (image != null) {
                    Picasso.with(mContext).load(image).placeholder(R.drawable.ic_launcher).into(i, new MarkerCallback(marker));
                }
        }       

    return popup;
}

MarkerCallback.java

public class MarkerCallback implements Callback {
    Marker marker=null;

    MarkerCallback(Marker marker) {
      this.marker=marker;

    }

    @Override
    public void onError() {
      Log.e(getClass().getSimpleName(), "Error loading thumbnail!");
    }

    @Override
    public void onSuccess() {
      if (marker != null && marker.isInfoWindowShown()) {
        marker.hideInfoWindow();
        marker.showInfoWindow();
      }
    }
}
James Nicholson
  • 987
  • 10
  • 20