简体   繁体   English

媒体播放器崩溃崩溃

[英]Media Player Fragement Crashes

You may have seen that I have had a problem with creating a Media Player a few months back. 您可能已经看到几个月前创建媒体播放器时遇到了问题。 Well I am trying to get to the next stage by getting it to work in a fragment but the app keeps on stopping/crashing on me. 好吧,我试图通过使其分段工作来进入下一阶段,但该应用程序一直在停止/崩溃。 Can someone help me please? 有人能帮助我吗? Here is my activity/fragment (code-behind) class 这是我的活动/片段(代码隐藏)课程

public class MediaPlayerNew extends Fragment implements 
android.media.MediaPlayer.OnCompletionListener, 
android.media.MediaPlayer.OnPreparedListener,
android.media.MediaPlayer.OnErrorListener,          
android.media.MediaPlayer.OnBufferingUpdateListener{

private MediaPlayer mp = null;
private String TAG = getClass().getSimpleName();
private Button play;
private Button pause;
private Button stop;
private TextView txtVStatus;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_player, container, false);

    return view;
}

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    play = (Button) getActivity().findViewById(R.id.btnPlay);
    pause = (Button) getActivity().findViewById(R.id.btnPause);
    stop = (Button) getActivity().findViewById(R.id.btnStop);
    //status = (TextView) findViewById(R.id.txtVStatus);

pause.setEnabled(false);
stop.setEnabled(false);

play.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        play();
    }
});

pause.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        pause();
    }
});

stop.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        stop();
    }
});
}

private void play() {
    //HTTP to BCRFM STREAM
    Uri myUri = Uri.parse("http://37.187.193.36:8002");
    try {
        if (mp == null) {
            this.mp = new android.media.MediaPlayer();
        } else {
            mp.stop();
            mp.reset();
        }
        mp.setDataSource(myUri.toString()); // Go to Initialized state)
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(this);
        mp.setOnBufferingUpdateListener(this);

        mp.setOnErrorListener(this);
        mp.prepareAsync();

        Log.d(TAG, "LoadClip Done");
    } catch (Throwable t) {
        Log.d(TAG, t.toString());
    }
}

@Override
public void onPrepared(android.media.MediaPlayer mp) {
    Log.d(TAG, "Stream is prepared");
    final TextView textViewToChange = (TextView) getActivity().findViewById(R.id.txtVStatus);
    textViewToChange.setText("Welcome to BCRfm");
    mp.start();
    play.setEnabled(false);
    pause.setEnabled(true);
    stop.setEnabled(true);

}

private void pause() {
    mp.pause();
    final TextView textViewToChange = (TextView) getActivity().findViewById(R.id.txtVStatus);
    textViewToChange.setText("You have paused your feed to BCRfm");
    play.setEnabled(true);
    pause.setEnabled(false);
    stop.setEnabled(true);
}

private void stop() {
    mp.stop();
    final TextView textViewToChange = (TextView) getActivity().findViewById(R.id.txtVStatus);
    textViewToChange.setText(" ");
    play.setEnabled(true);
    pause.setEnabled(false);
    stop.setEnabled(false);

}

@Override
public void onDestroy() {
    super.onDestroy();
    stop();
}

public void onCompletion(android.media.MediaPlayer mp) {
    stop();
}

public boolean onError(android.media.MediaPlayer mp, int what, int extra) {
    StringBuilder sb = new StringBuilder();
    sb.append("Media Player Error: ");
    switch (what) {
        case android.media.MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            sb.append("Not Valid for Progressive Playback");
            break;
        case android.media.MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            sb.append("Server Died");
            break;
        case android.media.MediaPlayer.MEDIA_ERROR_UNKNOWN:
            sb.append("Unknown");
            break;
        default:
            sb.append(" Non standard (");
            sb.append(what);
            sb.append(")");
    }
    sb.append(" (" + what + ") ");
    sb.append(extra);
    Log.e(TAG, sb.toString());
    return true;
}
public void onBufferingUpdate(android.media.MediaPlayer mp, int percent) {
    Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
}
}

Its okay, I fixed it. 没关系,我已将其修复。

I changed: 我变了:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);......

to

public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);..

And it works perfectly, only thing is when I want to switch from this fragment to another, the app crashes. 它运行完美,只有一件事是当我想从这个片段切换到另一个片段时,应用程序崩溃了。 Any tips? 有小费吗?

Fixed it 修复

Changed 已变更

 @Override
  public void onDestroy() {
  super.onDestroy();
  stop();
}

to

 @Override
  public void onDestroy() {
  super.onDestroy();
}

There are issues with your code, and I will number them for clarity. 您的代码有问题,为清楚起见,我将对其编号。

1) With methods onCreateView and onCreate , at least (check others!), place the keyword @Override above the methods declaration. 1)至少使用onCreateViewonCreate方法(检查其他项!),将关键字@Override放在方法声明上方。 Please compare sample codes in Google. 请比较Google中的示例代码。 Failure to do this and perhaps the compiler would not consider it as overriding. 否则,编译器可能不会将其视为优先。

2) There is nothing wrong with 2)没有错

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

This is normal code. 这是正常的代码。

3) Change from: 3)从:

 @Override
  public void onDestroy() {
      super.onDestroy();
}

TO: 至:

 @Override
  public void onDestroy() {
     stop();
     super.onDestroy();
}

The main difference is calling stop() before onDestroy() call. 主要区别是在onDestroy()调用之前调用stop() When you're destructing, it's standard to call destroy/destruct after all the other codes. 销毁时,通常在所有其他代码之后调用destroy / destruct。 And...you should stop the Media Player , otherwise it will still keep playing whatever even after the app exits. 并且...您应该停止Media Player ,否则即使应用程序退出后,它仍将继续播放。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM