0

Я пытаюсь использовать viewpager с медиаплеер, и я сталкиваюсь с некоторыми проблемами. Мое приложение настроено там, где вы нажимаете на видео в gridview, а затем, когда экран становится видимым, он начнет воспроизведение видео. Когда я впервые открываю видео, он отлично воспроизводится. Просмотрщик работает для двух страниц влево или вправо. Однако, когда я перехожу к тому, что приложение зависает и падает.Использование Viewpager с MediaPlayer

Я создал несколько журналов, и я нашел в своем классе pageradapater, сразу после setPrimaryItem называется есть IllegalArgumentException, когда я звоню Mediaplayer.setdisplay(holder), который говорит, что The surface has been relased я пытался так что некоторые исследования и тестирования, но я не могу найти где поверхность освобождается. Мне кажется странным, что эта ошибка возникает, но видео все еще играет. Я не знаю, почему это происходит.

Мое лучшее предположение заключается в том, что pageradapater устанавливает все страницы в группе просмотра в начале. Это может вызвать некоторые проблемы, поскольку поверхность устанавливается где-то еще в ViewGroup.

Я искал некоторую помощь в этом. Мой код ниже

FullImageActivity.java

public class FullImageActivity extends Activity { 


private static final String TAG = "MediaPlayer shit"; 
//MediaPlayer player; 
//SurfaceView surfaceview; 
SurfaceHolder surfaceHolder; 
Gridview gridview = new Gridview(); 
int width; 
int height; 
Cursor cursor; 
DisplayImageOptions options; 
ViewPager viewpager; 
TheViewPager theviewpager; 
String path; 
int position; 
String[] projection = { GridviewData.ROWID, GridviewData.BITMAPPATH, GridviewData.VIDEOFILEPATH}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.image_pager); 

    Intent i = getIntent(); 

    position = i.getExtras().getInt("position"); 
    path = i.getExtras().getString("videopath"); 


    cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
           gridview.mediaColumns, 
           MediaStore.Video.Media.DATA + " like ?", 
           new String[] {Environment.getExternalStorageDirectory().getPath() + "/Reelcam/TheReelcams/%"}, 
           null); 

    theviewpager = new TheViewPager(cursor, this); 
    viewpager = (ViewPager) findViewById(R.id.pager); 
    viewpager.setOffscreenPageLimit(2); 
    viewpager.setAdapter(theviewpager); 

} 


@Override 
protected void onPause() { 
    //surfaceview.setVisibility(View.GONE); 

    if (theviewpager.player != null) 
    { 
     if (theviewpager.player.isPlaying()) 
      theviewpager.player.stop(); 
     theviewpager.player.release(); 
     theviewpager.player = null; 
    } 
    super.onPause(); 
} 
@Override 
protected void onResume() { 
    //surfaceview.setVisibility(View.VISIBLE); 
    viewpager.setCurrentItem(position); 
    super.onResume(); 
} 


@Override 
protected void onDestroy() { 
    cursor.close(); 
    super.onDestroy(); 
} 

} 

TheViewPager.java

public class TheViewPager extends PagerAdapter implements OnCompletionListener, Callback, OnPreparedListener { 

private static final String TAG = "MediaPlayer shit"; 
LayoutInflater inflater; 
MediaPlayer player; 
String vpath; 

Cursor cursor; 
Activity activity; 
LayoutInflater layoutInflater; 
boolean hasActiveHolder = false; 
FullImageActivity fullimage; 
public TheViewPager(Cursor cursor2, Activity activity) { 
    this.cursor = cursor2; 
    layoutInflater = activity.getLayoutInflater(); 
    this.activity = activity; 
    this.fullimage = new FullImageActivity(); 


} 

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

@Override 
public void finishUpdate(ViewGroup container) { 
    super.finishUpdate(container); 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 

    container.removeView((View) object); 
} 

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

    View v = layoutInflater.inflate(R.layout.full_image, null, false); 

    SurfaceView surfaceview = (SurfaceView)v.findViewById(R.id.surfaceview); 



    SurfaceHolder holder = surfaceview.getHolder(); 
    v.setTag(holder); 
    ((ViewPager) view).addView(v, 0); 
    return v; 

} 

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

@Override 
public void setPrimaryItem(ViewGroup container, int position, 
     Object object) { 
    Log.i(TAG, "setPrimaryItem"); 
    View view = (View) object; 


    cursor.moveToPosition(position); 
    vpath = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)); 


    SurfaceHolder holder = (SurfaceHolder) view.getTag(); 
    player = new MediaPlayer(); 
    try { 
     player.reset(); 
     player.setDataSource(vpath);    
     player.setOnCompletionListener(this); 
     player.setOnPreparedListener(this); 

     player.setDisplay(holder); 
     player.prepare(); 

    } 
    catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    super.setPrimaryItem(container, position, object); 
} 

@Override 
public void onCompletion(MediaPlayer player) { 
    Log.i(TAG, "onCompleiton"); 

    if (player != null){ 
     if (player.isPlaying()) 
      player.stop(); 
    player.reset(); 
    player.release(); 
    player = null; 
    } 
} 
@Override 
public void startUpdate(ViewGroup container) { 
    super.startUpdate(container); 
} 



@Override 
public void onPrepared(MediaPlayer arg0) { 
    arg0.start(); 

} 

В качестве примечания здесь моя логика:

Я использую метод instantiateItem для установки вверх. Документация по Android будет равна Create the page for the given position, поэтому я предполагаю, что создаю представление здесь, которое позже будет заселено в setPrimaryItem. Документация для метода setPrimaryItem говорит Called to inform the adapter of which item is currently considered to be the "primary", that is the one show to the user as the current page. Из-за этого я хочу установить медиаплеер здесь, потому что это единственное место, где будет просматриваться видео. Кажется, я что-то пропустил.

+0

Вы исправите это в конце? У меня аналогичная проблема. Вы можете мне помочь? http://stackoverflow.com/questions/24385069/image-video-gallery-using-viewpager – Hanzo

ответ

1

ViewPager s по умолчанию содержат только страницы, которые находятся непосредственно рядом с текущей страницей (то есть страница слева от текущей, текущей и страницы справа от текущего). Поэтому, если вы находитесь на двух страницах от страницы воспроизведения видео, он будет отсоединен и больше не будет активен. Вы можете изменить количество страниц, хранящихся в памяти, с помощью ViewPager.setOffscreenPageLimit до значения, превышающего значение по умолчанию 1. Обратите внимание, что это увеличивает объем требуемой памяти и не следует ставить слишком высоко - обязательно проверьте на устройствах с низким объемом памяти.