Android在Surfaceview中播放视频NullPointerException

用户名

我尝试在Surfaceview中播放视频。我使用Fragment(扩展Fragment),我有NullPointerException我不知道我在做什么错。第一次使用Activity并在Activity项目中运行完美,但是我使用Fragment却出现错误

这是我的资料

public class Layout1 extends Fragment implements OnBufferingUpdateListener,
    OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener,
    SurfaceHolder.Callback, MediaPlayerControl {
MediaPlayer mMediaPlayer;
SurfaceView mSurfaceView;
SurfaceHolder holder;
String video = "http://www.pocketjourney.com/downloads/pj/video/famous.3gp";
MediaController mcontroller;
Handler handler;
String videoUrl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout1, null);

    SurfaceView v = (SurfaceView) view
            .findViewById(R.id.screen_tutorial_video_surface);
    handler = new Handler();
    holder = v.getHolder();
    holder.addCallback(this);
    playVideo();
    return view;
}

private void playVideo() {
    try {
        mcontroller = new MediaController(getActivity());
        mcontroller.setVisibility(View.INVISIBLE);

        mMediaPlayer = MediaPlayer.create(getActivity(), Uri.parse(video));
        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);

        mMediaPlayer.setScreenOnWhilePlaying(true);
        mMediaPlayer.setOnVideoSizeChangedListener(this);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

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

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {

    mMediaPlayer.setDisplay(holder);
    try {
        // progressDialog.dismiss();
        mMediaPlayer.start();

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

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {

}

@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    // TODO Auto-generated method stub
}

@Override
public void onPrepared(MediaPlayer mp) {

    // mcontroller.setMediaPlayer(this);
    // mcontroller
    // .setAnchorView(findViewById(R.id.screen_tutorial_video_surface));
    // mcontroller.setEnabled(true);
    //
    // handler.post(new Runnable() {
    // public void run() {
    // mcontroller.show();
    // }
    // });
}

@Override
public void onCompletion(MediaPlayer mp) {

}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {

}

public void start() {
    mMediaPlayer.start();
}

public void pause() {
    mMediaPlayer.pause();
}

public int getDuration() {
    return mMediaPlayer.getDuration();
}

public int getCurrentPosition() {
    return mMediaPlayer.getCurrentPosition();
}

public void seekTo(int i) {
    mMediaPlayer.seekTo(1);
}

public boolean isPlaying() {
    return mMediaPlayer.isPlaying();
}

public int getBufferPercentage() {
    return 0;
}

public boolean canPause() {
    return true;
}

public boolean canSeekBackward() {
    return true;
}

public boolean canSeekForward() {
    return true;
}
}

错误记录

在此处输入图片说明

雅罗斯拉夫·梅特卡利克(Yaroslav Mytkalyk)

似乎在playVideo()之前调用了onSurfaceCreated。在Fragment的onCreate()中初始化您的mMediaPlayer(以及处理程序)。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler = new Handler();
    playVideo();
}

private void playVideo() {
    mcontroller = new MediaController(getActivity());
    mcontroller.setVisibility(View.INVISIBLE);

    mMediaPlayer = MediaPlayer.create(getActivity(), Uri.parse(video));
    // implement a fallback mechanism if it fails, for example if no internet or 404
    if (mMediaPlayer == null) {
        Log.w("Layout1", "Faileded to create MediaPlayer");
        return;
    }
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);

    mMediaPlayer.setScreenOnWhilePlaying(true);
    mMediaPlayer.setOnVideoSizeChangedListener(this);

    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout1, null);
    SurfaceView v = (SurfaceView) view
            .findViewById(R.id.screen_tutorial_video_surface);
    v.getHolder().addCallback(this);
    return view;
}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    if (mMediaPlayer == null) {
        // implement a fallback mechanism if it fails, for example if no internet or 404
        Log.w("Layout1", "MediaPlayer was not created");
        return;
    }
    // the holder reference is already passed as arg0 here
    mMediaPlayer.setDisplay(arg0);
    try {
        // progressDialog.dismiss();
        mMediaPlayer.start();

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

在删除了catch(Exception e)之后 playVideo()

如果您仔细查看日志,您可能已经看到

Permission failure: android.permission.INTERNET from uid=10052 pid=1129
Request requires android.permission.INTERNET
Unable to create media player
create failed:
java.io.IOException: setDataSource failed.: status=0x80000000

因此,您还需要添加权限

<uses-permission android:name="android.permission.INTERNET"/>

如果不是您所附加的项目,我们将永远不会知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android VideoView或SurfaceView播放视频?

来自分类Dev

如何在Surfaceview中隐藏视频并保持音频播放

来自分类Dev

Android:在SurfaceView中从MediaCodec裁剪视频

来自分类Dev

在VideoView android中播放视频

来自分类Dev

在videoview android中播放视频

来自分类Dev

在Android的“视频视图”中播放YouTube视频

来自分类Dev

Surfaceview将视频作为拉伸视图播放

来自分类Dev

在Android中播放RAM中的视频

来自分类Dev

Android:Vimeo视频无法在Webview中播放

来自分类Dev

Air for Android中的视频播放问题

来自分类Dev

使用Xamarin在Android中播放视频

来自分类Dev

无法在Android LsitView中播放视频

来自分类Dev

在 Android 中播放不循环的视频

来自分类Dev

在Android Webview中播放视频-视频控件不可见

来自分类Dev

Android SurfaceView仅播放第一个视频,然后屏幕冻结,最后一个视频帧,仅播放声音

来自分类Dev

android:无法播放视频

来自分类Dev

从xml播放视频:Android

来自分类Dev

在Android的TextureView中播放视频后播放视频出现问题

来自分类Dev

在处理中播放视频

来自分类Dev

在MatLab中播放视频

来自分类Dev

在Firefox中播放视频

来自分类Dev

在epub中播放视频

来自分类Dev

在Silverlight中播放视频

来自分类Dev

在Sharepoint中播放视频

来自分类Dev

在Firefox中播放视频

来自分类Dev

Android SurfaceView:在图像后显示视频

来自分类Dev

在Android中设计SurfaceView

来自分类Dev

如何在Android的WebView中播放Dailymotion视频

来自分类Dev

在Android中获取YouTube发布频道播放列表视频