Android 在列表视图中播放视频
我已经找了几个小时的解决办法了。我为Android 在列表视图中播放视频,android,listview,video,android-videoview,textureview,Android,Listview,Video,Android Videoview,Textureview,我已经找了几个小时的解决办法了。我为listview创建了一个自定义baseAdapter。它可以很好地处理图像。在imageView工作之后,我认为VideoView也可以。然后,我发现我不得不用一个TextureViev来代替它,对它进行了研究,它的逻辑很清楚,但最后,我在网络上遇到了一些错误,没有解决方案 我试着使用了一个滑翔,但没用,我又回到了这里 当mediaplayer准备时,我遇到了这些错误 E/ExtMediaPlayer JNI:env->IsInstanceOf失败 E/Me
listview
创建了一个自定义baseAdapter
。它可以很好地处理图像。在imageView
工作之后,我认为VideoView
也可以。然后,我发现我不得不用一个TextureViev
来代替它,对它进行了研究,它的逻辑很清楚,但最后,我在网络上遇到了一些错误,没有解决方案
我试着使用了一个滑翔
,但没用,我又回到了这里
当mediaplayer准备时,我遇到了这些错误
E/ExtMediaPlayer JNI:env->IsInstanceOf失败
E/MediaPlayer JNI:JNIMediaPlayerFactory:bIsQCMediaPlayerPresent 0
媒体准备的时间
带MediaPlayer:信息/警告(3,0)
尝试启动mediaplayer时
[12-19:32:11.967 378:31124 E/]
不在avi模式下
我需要每一点灵感来继续下去,谢谢你
我在MainActivity
类的内部类中定义了baseAdapter
,实现了mediaplayer
和textureview
方法
public class postAdapter extends BaseAdapter implements TextureView.SurfaceTextureListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener {
ArrayList<Posts> posts;
public postAdapter(ArrayList<Posts> postsToList)
{
posts=postsToList;
}
MediaPlayer mMediaPlayer;
TextureView textureView;
VideoView animatedView;
@Override
public int getCount() {
// Log.d(TAG, "getCount: "+posts.size());
return posts.size();
}
public void addRangeToTop(ArrayList<Posts> newposts)
{
for (int i=0;i<newposts.size();i++)
{
posts.add(i,newposts.get(i));
}
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View child = getLayoutInflater().inflate(R.layout.animatedpost, null);
TextView titleView = (TextView) child.findViewById(R.id.titleView);
ImageView imageView = (ImageView) child.findViewById(R.id.capsView);
animatedView=(VideoView) child.findViewById(R.id.animatedView);
textureView=(TextureView)child.findViewById(R.id.textureView);
TextView voteView = (TextView) child.findViewById(R.id.voteView);
Button button=(Button) child.findViewById(R.id.button2);
textureView.setSurfaceTextureListener(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* ArrayList<Posts> newp=new ArrayList<Posts>();
for (int i=10;i<15;i++)
{
Posts post=new Posts();
post.setPostTitle(i+"dsf");
post.setPostVote(i+"sdfsd");
newp.add(post);
}
int index = lv.getFirstVisiblePosition()+newp.size() ;
View v2 = lv.getChildAt(0);
int top = (v2 == null) ? 0 : v2.getTop();
addRangeToTop(newp);
notifyDataSetChanged();
lv.setSelectionFromTop(index, top);*/
/* Uri uri = Uri.parse("http://somepath"); // missing 'http://' will cause crashed
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);*/
}
});
titleView.setText(posts.get(position).getPostTitle());
voteView.setText(posts.get(position).getPostVote());
// imageView.setImageResource(R.drawable.df);
return child;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
@Override
public void onCompletion(MediaPlayer mp) {
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "onPrepared: ");
mp.start();
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mMediaPlayer=new MediaPlayer();
Surface s = new Surface(surface);
try {
mMediaPlayer.setDataSource("http://somefunnyvideopath.mp4");
mMediaPlayer.setSurface(s);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer. setOnVideoSizeChangedListener( this);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
}
公共类postAdapter扩展了BaseAdapter实现了TextureView.SurfaceTextRelister、MediaPlayer.OnBufferingUpdateListener、MediaPlayer.OnCompletionListener、MediaPlayer.OnPreparedListener、MediaPlayer.OnVideoSizeChangedListener{
ArrayList职位;
公共邮政适配器(ArrayList postsToList)
{
posts=postsToList;
}
媒体播放器;
纹理视图纹理视图;
视频视图动画视图;
@凌驾
public int getCount(){
//Log.d(标记“getCount:+posts.size());
返回后。大小();
}
public void addRangeToTop(ArrayList newposts)
{
对于(int i=0;i我将使mediaplayer成为一个单例类,因此您不必多次实例化他,不确定这是您的问题,但这样更好
public class MyMediaPlayer {
MediaPlayer mp;
private static volatile MyMediaPlayer instance = null;
private MyMediaPlayer() { }
public static MyMediaPlayer getInstance() {
if (instance == null) {
synchronized (MyMediaPlayer.class) {
if (instance == null) {
instance = new MyMediaPlayer();}}}
return instance;
}}
还可以尝试使用原始资源或多媒体资料中的mp4,这样您就知道您的设备可以播放它,稍后当它工作时,请尝试更改到您的链接
希望能有所帮助。谢谢,但这不起作用。我也尝试了相同的mp4和资源中的其他mp4,但没有起作用。仍然不知道该怎么办。在这种情况下,没有理由使用单例模式,事实上,这可能与OP试图实现的目标完全相反,因为他试图列出潜在的多个视频操作系统。