gpt4 book ai didi

android - 将 Viewpager 与 MediaPlayer 一起使用

转载 作者:行者123 更新时间:2023-11-30 03:30:02 32 4
gpt4 key购买 nike

我正在尝试将 viewpager 与媒体播放器一起使用,但遇到了一些问题。我的应用程序设置为您在 gridview 中单击视频,然后当屏幕可见时它将开始播放视频。当我第一次打开视频时,它播放正常。 viewpager 适用于左侧或右侧的两个页面。但是,当我检查该应用程序时,它会卡住并崩溃。

我设置了一些日志,我发现在我的 pageradapater 类中,在调用 setPrimaryItem 之后,当我调用 Mediaplayer.setdisplay(holder) 时出现 IllegalArgumentException,它说 The surface has been relased 我已经尝试过一些研究和测试,但我找不到表面被释放的地方。出现此错误对我来说似乎很奇怪,但视频仍在播放。我不确定为什么会这样。

我最好的猜测是 pageradapater 在一开始就设置了 Viewgroup 中的所有页面这可能会导致某种问题,因为 surface 被设置在 ViewGroup 中的其他地方。

我正在寻求这方面的帮助。我的代码在下面

全图 Activity .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 方法来设置 View 。 Android 文档说将为给定位置创建页面,所以我假设我将在此处设置 View ,稍后将在 setPrimaryItem 中填充。 setPrimaryItem 方法的文档说 调用以通知适配器当前认为哪个项目是“主要的”,即显示给用户的当前页面。 因此我想要在这里设置媒体播放器,因为这是唯一可以观看视频的地方。我想我可能遗漏了一些东西。

最佳答案

ViewPager,默认情况下只保留与当前页面直接相邻的页面(即当前页面左侧的页面,当前页面和当前页面右侧的页面).因此,如果您距离视频播放页面有两页,它将被分离并且不再处于 Activity 状态。您可以通过 ViewPager.setOffscreenPageLimit 更改内存中保留的页数高于默认值 1。请注意,这确实会增加所需的内存量,不应设置得太高 - 请务必在内存量较低的设备上进行测试。

关于android - 将 Viewpager 与 MediaPlayer 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601226/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com