Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.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 MediaPlayer在第一次运行时未运行_Android_Drag And Drop_Android Camera_Media Player_Surfaceview - Fatal编程技术网

Android MediaPlayer在第一次运行时未运行

Android MediaPlayer在第一次运行时未运行,android,drag-and-drop,android-camera,media-player,surfaceview,Android,Drag And Drop,Android Camera,Media Player,Surfaceview,我在我的应用程序中添加了一个MediaPlayer。它工作正常,但当我第一次调用我的surface并初始化MediaPlayer时,纹理变得可见,但它是白色的,没有视频(但声音正常,我的日志显示它工作正常) 第一次尝试后,它工作得非常好。但是我找不到第一次尝试不起作用的原因。这是我的密码: ///////// mVideoView = (TextureView) mRootView.findViewById(R.id.show_video_content); mVide

我在我的应用程序中添加了一个MediaPlayer。它工作正常,但当我第一次调用我的surface并初始化MediaPlayer时,纹理变得可见,但它是白色的,没有视频(但声音正常,我的日志显示它工作正常)

第一次尝试后,它工作得非常好。但是我找不到第一次尝试不起作用的原因。这是我的密码:

/////////
     mVideoView = (TextureView) mRootView.findViewById(R.id.show_video_content);
        mVideoView.setSurfaceTextureListener(this);
////////
     public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        Log.i(TAG, "InicializoSurface. Width: " + width + "  HEIGHT:" + height);
        Log.i(TAG, "InicializoSurface. Width: " + mVideoView.getMeasuredWidth() + "  HEIGHT:" + mVideoView.getMeasuredHeight());
        Log.i(TAG, "View transform. Width: " + mVideoView.getWidth() + "  HEIGHT:" + mVideoView.getHeight());


        mMediaSurface = new Surface(mVideoView.getSurfaceTexture());
        initializeMediaPlayer();

    }

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

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

        if (mMediaPlayer != null) {
            // Make sure we stop video and release resources when activity is destroyed.
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        return false;
    }
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }
这是我的自定义MediaPlayer和初始化曲面时调用的事件:

   private class CustomMediaPlayer extends MediaPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener {

    SurfaceHolder mVideoHolder;

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        if (mediaPlayer != null) {
            mediaPlayer.start();
        }
    }
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        Log.i(TAG,"video preparado");
        mMediaPrepared = true;
    }
}

 private void initializeMediaPlayer(){

    mMediaPlayer = new CustomMediaPlayer();
    Uri uri = Uri.parse(mCameraDataAdapter.getList().get(0).getPath());

    try {
        mMediaPlayer.setDataSource(mActivity, uri);
        mMediaPlayer.setSurface(mMediaSurface);
        mMediaPlayer.prepareAsync();
        mMediaPlayer.setOnPreparedListener(mMediaPlayer);
        mMediaPlayer.setOnCompletionListener(mMediaPlayer);


    } catch (IOException e) {
        e.printStackTrace();
    }


}
最后,我在onDragListener中调用start()

      case DragEvent.ACTION_DRAG_STARTED:

                if (mCameraDataAdapter.getFirstElement().equalsIgnoreCase("video")) {
                    mThumbnailContainer.setVisibility(View.VISIBLE);
                    mVideoView.setVisibility(View.VISIBLE);


                    Log.i(TAG, "X: " + mVideoView.getX() + "Y: " + mVideoView.getY());


                    if (mVideoView.isAvailable()) {
                        onSurfaceTextureAvailable(mVideoView.getSurfaceTexture(), mVideoView.getWidth(), mVideoView.getHeight());
                    }

                    if (mMediaPlayer == null) {
                        initializeMediaPlayer();
                    }


                    if (mMediaPrepared) {
                        Log.i(TAG,"Comienzo Video");
                        mMediaPlayer.start();
                    }

                } else {
                    mThumbnailContainer.setVisibility(View.VISIBLE);
                    mImageContainer.setVisibility(View.VISIBLE);
                }
                mPreviewThumbIcon.setVisibility(View.INVISIBLE);
                return true;

我已尝试将我的prepare()更改为prepareAsync(),或始终使用“可见”视图,但我找不到它不起作用的原因。

每次使用拖放方法后重置MediaPlayer:操作\u拖动\u结束:

case DragEvent.ACTION_DRAG_STARTED:

selected = null;

if (mCameraDataAdapter.getFirstElement().equalsIgnoreCase("video")) {

    mImageContainer.setVisibility(View.INVISIBLE);
    mVideoView.setVisibility(View.VISIBLE);
    //SurfaceTexture is not called if the Texture is already available, so we call it anyway
    if (mVideoView.isAvailable()) {
        onSurfaceTextureAvailable(mVideoView.getSurfaceTexture(), mVideoView.getMeasuredWidth(), mVideoView.getMeasuredHeight());
    }

} else {
    mVideoView.setVisibility(View.INVISIBLE);
    mImageContainer.setVisibility(View.VISIBLE);
}
mPreviewThumbIcon.setVisibility(View.INVISIBLE);
return true;
另外,将Mediaplayer.start放在自定义的PreparedListener中

private class CustomMediaPlayer extends MediaPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener {

@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null) {
        mediaPlayer.start();
    }
}
//We start the video when its available
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    Log.i(TAG,"Video Prepare");
    mediaPlayer.start();
}
}
希望它能帮助你。祝你好运