2015-05-10 11 views
28

cerco di sviluppare un app che recuperare i video da server e gioca sul VideoView all'interno viewpager, video da cartella grezzo è lavorato bene, ma loro sono 2 problemi:Come riprodurre video su VideoView all'interno ViewPager dai server

  • 1: alcuni video non vengono riprodotti. o spettacolo di attività nero.
  • 2: il video non si ferma quando si scorre la pagina.

così come utilizzare l'URL al posto di `

android.resource://mypackagename/video1.mp4 

e come mettere in pausa/stop quando PageIsChanged. qualsiasi tutorial o riscontro sarò grato per questo.

Ecco il mio codice è Source Code

ViewPagerAdapter.java

import android.content.Context; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.net.Uri; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.MediaController; 
import android.widget.TextView; 
import android.widget.VideoView; 

public class ViewPagerAdapter extends PagerAdapter { 

    Context context; 
    String[] rank; 
    String[] country; 
    String[] population; 
    int[] flag; 
    LayoutInflater inflater; 
    static int[] arrayvid; 
    private VideoView mVideoView; 

    public ViewPagerAdapter(Context context, String[] rank, String[] country, 
      String[] population, int[] flag, int[] arrayvid) { 
     this.context = context; 
     this.rank = rank; 
     this.country = country; 
     this.population = population; 
     this.flag = flag; 
     this.arrayvid = arrayvid; 
    } 

    @Override 
    public int getCount() { 
     return rank.length; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((LinearLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, final int position) { 

     // Declare Variables 
     TextView txtrank; 
     TextView txtcountry; 
     TextView txtpopulation; 
     ImageView imgflag; 

     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View itemView = inflater.inflate(R.layout.viewpager_item, container, 
       false); 

     // Locate the TextViews in viewpager_item.xml 
     txtrank = (TextView) itemView.findViewById(R.id.rank); 
     txtcountry = (TextView) itemView.findViewById(R.id.country); 
     txtpopulation = (TextView) itemView.findViewById(R.id.population); 
     imgflag = (ImageView) itemView.findViewById(R.id.flag); 
     mVideoView = (VideoView) itemView.findViewById(R.id.VVExe); 

     txtrank.setText(rank[position]); 
     txtcountry.setText(country[position]); 
     txtpopulation.setText(population[position]); 
     imgflag.setImageResource(flag[position]); 

     mVideoView.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mp.setLooping(true); 
      } 
     }); 

     MediaController mediaController = new MediaController(context, false); 
     mediaController.setAnchorView(mVideoView); 
     mVideoView.setMediaController(mediaController); 
     ((ViewPager) container).addView(itemView); 
     return itemView; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     // Remove viewpager_item.xml from ViewPager 
     ((ViewPager) container).removeView((LinearLayout) object); 

    } 

    public void pausevideo() { 
     mVideoView.stopPlayback(); 

    } 

    public void play(int position) { 
     mVideoView.setVideoURI(Uri 
       .parse("android.resource://mypackagename/" 
         + arrayvid[position])); 
     mVideoView.requestFocus(); 
     mVideoView.start(); 

    } 
} 

MainActivity.java

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.view.View; 
import android.widget.ImageButton; 

public class MainActivity extends Activity { 

    // Declare Variables 
    ViewPager viewPager; 
    PagerAdapter adapter; 
    String[] rank; 
    private ImageButton play; 
    String[] country; 
    String[] population; 
    int[] flag; 
    public int position; 
    int[] arrayvid; 
    boolean isRunning = true; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Get the view from viewpager_main.xml 
     setContentView(R.layout.viewpager_main); 
     play = (ImageButton) findViewById(R.id.btnPlayAB); 
     // Generate sample data 
     rank = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; 

     country = new String[] { "China", "India", "United States", 
       "Indonesia", "Brazil", "Pakistan", "Nigeria", "Bangladesh", 
       "Russia", "Japan" }; 

     population = new String[] { "1,354,040,000", "1,210,193,422", 
       "315,761,000", "237,641,326", "193,946,886", "182,912,000", 
       "170,901,000", "152,518,015", "143,369,806", "127,360,000" }; 

     flag = new int[] { R.drawable.china, R.drawable.india, 
       R.drawable.unitedstates, R.drawable.indonesia, 
       R.drawable.brazil, R.drawable.pakistan, R.drawable.nigeria, 
       R.drawable.bangladesh, R.drawable.russia, R.drawable.japan }; 

     arrayvid = new int[] { R.raw.basiccrunch, R.raw.bicyclecrunch, 
       R.raw.reversecrunch, R.raw.longarmcrunch, 
       R.raw.crossovercrunch, R.raw.rightobliquecrunch, 
       R.raw.leftobliquecrunch, R.raw.halfcurl, 
       R.raw.verticallegcrunch, R.raw.plank }; 

     // Locate the ViewPager in viewpager_main.xml 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     // Pass results to ViewPagerAdapter Class 
     adapter = new ViewPagerAdapter(MainActivity.this, rank, country, 
       population, flag, arrayvid); 
     // Binds the Adapter to the ViewPager 
     viewPager.setAdapter(adapter); 

     play.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if (isRunning) { 
        ((ViewPagerAdapter) adapter).play(position); 
        isRunning = false; 
        play.setBackgroundResource(R.drawable.pausee); 
       } else { 
        ((ViewPagerAdapter) adapter).pausevideo(); 
        isRunning = true; 
        play.setBackgroundResource(R.drawable.playy); 
       } 

      } 
     }); 

    } 

}

viewpager_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:padding="10dp" 
    android:weightSum="10" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1.6" 
     android:orientation="horizontal" > 

     <LinearLayout 
      android:layout_width="0dip" 
      android:layout_height="fill_parent" 
      android:layout_weight="3" 
      android:orientation="vertical" > 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <TextView 
        android:id="@+id/ranklabel" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/ranklabel" /> 

       <TextView 
        android:id="@+id/rank" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <TextView 
        android:id="@+id/countrylabel" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/countrylabel" /> 

       <TextView 
        android:id="@+id/country" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
      </LinearLayout> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <TextView 
        android:id="@+id/populationlabel" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/populationlabel" /> 

       <TextView 
        android:id="@+id/population" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
      </LinearLayout> 
     </LinearLayout> 

     <ImageView 
      android:id="@+id/flag" 
      android:layout_width="0dip" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#000000" 
      android:padding="1dp" /> 
    </LinearLayout> 

    <VideoView 
     android:id="@+id/VVExe" 
     android:layout_width="wrap_content" 
     android:layout_height="0dip" 
     android:layout_marginTop="5dp" 
     android:layout_weight="7.9" 
     android:gravity="center" /> 

</LinearLayout> 

viewpager_main.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/LinearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:weightSum="10" > 

     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="wrap_content" 
      android:layout_height="0dip" 
      android:layout_weight="8.6" /> 

<LinearLayout 
    android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1.4" 
    android:gravity="center" 
    android:padding="10dp" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:background="#696969" 
     android:gravity="center" 
     android:orientation="horizontal" 
     android:weightSum="10" > 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" > 
     </LinearLayout> 

     <ImageButton 
      android:id="@+id/btnprevAB" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:background="@drawable/prevsel" /> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" > 
     </LinearLayout> 

     <ImageButton 
      android:id="@+id/btnPlayAB" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:background="@drawable/playsel" /> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" > 
     </LinearLayout> 

     <ImageButton 
      android:id="@+id/btnNextAB" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="2" 
      android:background="@drawable/nextsel" /> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" > 
     </LinearLayout> 
    </LinearLayout> 

    </LinearLayout> 

enter image description here

risposta

1
  1. per rilevare se ViewPager è scorrimento/cambiare pagina hai solo bisogno di allegare un OnPageChangeListener al tuo ViewPager.

  2. Per riprodurre un video da un URL remoto è possibile utilizzare lo standard MediaController/MediaPlayer. Dai uno sguardo allo this tutoria l.

+1

provo questo ma non funziona. – Attaullah

+0

[il mio codice sorgente] (http://rehman-furniture.com/attaullahcs/stackdir/ViewPagerVideoFromServer.zip) – Attaullah

7

penso che sia meglio utilizzare FragmentStatePagerAdapter invece di PagerAdapter. In questo scenario non è più necessario OnPageChangeListener ed è possibile utilizzare i metodi di callback del ciclo di vita dei frammenti come onResume e per riprodurre o mettere in pausa il video.

e come mettere in pausa/interrompere quando PageIsChanged. qualsiasi tutorial o hit I sarà grato per questo.

È possibile utilizzare i seguenti collegamenti per capire come utilizzare questo adattatore, quindi è possibile creare la propria logica con l'aiuto del metodo del ciclo di vita dei frammenti.

Android FragmentStatePagerAdapter Example

FragmentStatePagerAdapter

+1

grazie provo quest'ultimo poi ti dirò ... – Attaullah

1
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      //do the needful action 

      } 

      @Override 
      public void onPageSelected(int position) { 
       System.out.println("selected " + position); 
    //do the needful action 
       } 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
2

ho scritto FrameViedoView che migliora le prestazioni per la riproduzione di video.

Funziona anche per ViewPager.

Come si usa?

Aggiungi http://bright.github.io/maven-repo/ per i repository:

repositories { 
    maven { 
     url "http://bright.github.io/maven-repo/" 
    } 
} 

e poi dichiarare una dipendenza all'interno di un modulo:

dependencies { 
    compile('mateuszklimek.framevideoview:framevideoview:[email protected]') 
    //other dependencies 
} 

In examples si possono trovare come usarlo all'interno ViewPager o in semplice Activity.

Leggi il mio blog post su FrameVideoView.

+0

scusa bro non funziona ... – Attaullah

+0

@Attaullah Che cosa vuoi dire con questo? – mklimek

0

È necessario accedere al video da OnPageChangeListener. deve farlo si deve:

view.setTag("view"+position); nel vostro public Object instantiateItem(ViewGroup container, int position)

E dopo si può tornare indietro dal OnPageChangeListener:

View viewTag = viewPager.findViewWithTag("view" + viewPager.getCurrentItem()); 

e poi

VideoView videoViewTag = (VideoView)viewTag.findViewById(R.id.videoView); 
Problemi correlati