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试图实现的目标完全相反,因为他试图列出潜在的多个视频操作系统。