Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 包含TextureView和MediaPlayer的BaseAdapter不';行不通_Android_Android Listview_Android Mediaplayer_Baseadapter_Textureview - Fatal编程技术网

Android 包含TextureView和MediaPlayer的BaseAdapter不';行不通

Android 包含TextureView和MediaPlayer的BaseAdapter不';行不通,android,android-listview,android-mediaplayer,baseadapter,textureview,Android,Android Listview,Android Mediaplayer,Baseadapter,Textureview,我要做的是用BaseAdapter填充ListView,BaseAdapter中有一个TextureView。问题是我在等待至少2分钟之前没有看到任何视频播放,这与我的互联网连接速度无关。当我将TextureView的宽度设置为300dp时,我的ListView开始包含多个视图,所有视图开始播放视频,造成混乱。我希望我的程序像Vime或Instapram应用程序一样工作,在有焦点(或可见)时自动启动,在滚动时暂停。我在网上搜索了5个小时,仍然一无所获。任何指导,帮助,样本代码将不胜感激。提前谢谢

我要做的是用BaseAdapter填充ListView,BaseAdapter中有一个TextureView。问题是我在等待至少2分钟之前没有看到任何视频播放,这与我的互联网连接速度无关。当我将TextureView的宽度设置为300dp时,我的ListView开始包含多个视图,所有视图开始播放视频,造成混乱。我希望我的程序像Vime或Instapram应用程序一样工作,在有焦点(或可见)时自动启动,在滚动时暂停。我在网上搜索了5个小时,仍然一无所获。任何指导,帮助,样本代码将不胜感激。提前谢谢

public class VideoAdapter extends BaseAdapter {
private Activity context;
private ArrayList<String> urls;
private MediaPlayer mediaPlayer;

public VideoAdapter(Activity context, ArrayList<String> urls) {
    this.context = context;
    this.urls = urls;

}

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

@Override
public Object getItem(int position) {
    return urls.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int positionx, View convertView, ViewGroup parent) {
    final ViewHolderItems viewHolderItems;
    SurfaceHolder surfaceHolder;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.single_video_item, parent, false);
        viewHolderItems = new ViewHolderItems();
        viewHolderItems.textureView = (TextureView) convertView.findViewById(R.id.textureView);
        convertView.setTag(viewHolderItems);
    }else{
        viewHolderItems = (ViewHolderItems) convertView.getTag();
    }
    final int position = positionx;
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)viewHolderItems.textureView.getLayoutParams();
    params.height = 850;
    params.width = LinearLayout.LayoutParams.MATCH_PARENT;
    viewHolderItems.textureView.setLayoutParams(params);
    mediaPlayer = new MediaPlayer();
    viewHolderItems.textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
            mediaPlayer.setSurface(new Surface(surface));
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                mediaPlayer.setDataSource(urls.get(position));
                Log.d("JWP", "" + urls.get(position));
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            /*mediaPlayer.stop();
            mediaPlayer.release();*/
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        }
    });

    return convertView;
}
static class ViewHolderItems{
    TextureView textureView;
}
}

首先尝试使用设置单个TextureView,当您确定它工作正常时,尝试在ListView中添加多个TextureView单个可能工作正常。我的要求在不止一个的情况下满足;启用滚动和观察暂停和自动启动,无需延迟从url加载整个视频。谢谢你的答复,可能吧?确保它能正常工作,而不是像我在问题中提到的那样,当我有多个媒体播放器的TextureView时,它们都会从url开始播放视频。只玩一个游戏是很好的,而且在网上很少有明确的例子。但我不知道如何在没有onDestroy()的适配器中使用它,从而导致资源管理的另一个问题。这个实现很难,但很流行,我想知道他们是如何实现的。IllegalStateException表示您的MediaPlayer设置有问题,这就是为什么我建议首先使用simple TextureView/MediaPlayer,如果它确实有效,请尝试使用AblistView.OnScrollListener进行播放
E/MediaPlayer﹕ attachNewPlayer called in state 4
W/System.err﹕ java.lang.IllegalStateException
W/System.err﹕ at android.media.MediaPlayer.nativeSetDataSource(Native Method)
W/System.err﹕ at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1061)
W/System.err﹕ at android.view.TextureView.getHardwareLayer(TextureView.java:370)
W/System.err﹕ at android.view.View.updateDisplayListIfDirty(View.java:14025)
W/System.err﹕ at android.view.View.getDisplayList(View.java:14071)
W/System.err﹕ at android.view.View.draw(View.java:14838)
W/System.err﹕ at android.view.ViewGroup.drawChild(ViewGroup.java:3404)
W/System.err﹕ at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198)
W/System.err﹕ at android.view.View.updateDisplayListIfDirty(View.java:14043)
W/System.err﹕ at android.view.View.getDisplayList(View.java:14071)
W/System.err﹕ at android.view.View.draw(View.java:14838)