Я пытаюсь использовать 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.
Из-за этого я хочу установить медиаплеер здесь, потому что это единственное место, где будет просматриваться видео. Кажется, я что-то пропустил.
Вы исправите это в конце? У меня аналогичная проблема. Вы можете мне помочь? http://stackoverflow.com/questions/24385069/image-video-gallery-using-viewpager – Hanzo