Android的无线流媒体应用程序崩溃时preSS暂停或者你没有点击的瞬间播放停止 [英] Android radio streaming app crashes when you press pause or stop at the moment you haven't clicked play

查看:295
本文介绍了Android的无线流媒体应用程序崩溃时preSS暂停或者你没有点击的瞬间播放停止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我开始我的应用程序和preSS停止或暂停的Andr​​oid应用会崩溃。它工作正常,如果你第一次preSS发挥,然后停止或暂停。我搜索谷歌和计算器,但我找不到太多关于它。我认为这个问题是因为一个NullPointerException异常,但因为我是新太Java中并没有告诉我很多关于这个问题

在code:

 进口android.app.Activity;
     进口android.media.AudioManager;
     进口android.media.MediaPlayer;
     进口android.net.Uri;
     进口android.os.Bundle;
     进口android.util.Log;
     进口android.view.View;
     进口android.view.View.OnClickListener;
     进口android.widget.Button;     公共类myMain扩展活动器具
       MediaPlayer.OnCompletionListener,MediaPlayer.On preparedListener,
       MediaPlayer.OnErrorListener,MediaPlayer.OnBufferingUpdateListener,OnClickListener {
      私有String TAG =的getClass()getSimpleName()。
      私人MediaPlayer的MP = NULL;      私人按钮来播放;
      私人按钮暂停;
      私人按钮停止;
      @覆盖
      公共无效的onCreate(捆绑冰柱){       super.onCreate(冰柱);
       的setContentView(R.layout.main);       玩=(按钮)findViewById(R.id.play);
       暂停=(按钮)findViewById(R.id.pause);
       停止=(按钮)findViewById(R.id.stop);
       play.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(查看视图){
         玩();
        }
       });       pause.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(查看视图){
         暂停();
        }
       });       stop.setOnClickListener(新View.OnClickListener(){
        公共无效的onClick(查看视图){
         停止();        }
       });
      }
      私人无效播放(){
       乌里myUri = Uri.parse(URL);
       尝试{
            如果(MP == NULL){
             this.mp =新的MediaPlayer();
            }其他{
             mp.stop();
             mp.reset();
            }
        mp.setDataSource(这一点,myUri); //进入初始化状态
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOn preparedListener(本);
        mp.setOnBufferingUpdateListener(本);        mp.setOnErrorListener(本);
        。MP prepareAsync();        Log.d(TAGLoadClip完成);
       }赶上(的Throwable t)的{
        Log.d(TAG,t.toString());
       }
      }      在prepared(MediaPlayer的MP)公共无效{
       Log.d(TAG,流为prepared);
       mp.start();
      }      私人无效暂停(){
           mp.pause();
          }
      私人无效停止(){
           mp.stop();          }      @覆盖
      公共无效的onDestroy(){
       super.onDestroy();
       停止();      }      公共无效onCompletion(MediaPlayer的MP){
       停止();
      }      公共布尔的onError(MediaPlayer的熔点,诠释了什么,整型附加){
       StringBuilder的SB =新的StringBuilder();
       sb.append(Media Player错误:);
       开关(什么){
       案例MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
        sb.append(无效,无法渐进式播放);
        打破;
       案例MediaPlayer.MEDIA_ERROR_SERVER_DIED:
        sb.append(服务器死);
        打破;
       案例MediaPlayer.MEDIA_ERROR_UNKNOWN:
        sb.append(未知);
        打破;
       默认:
        sb.append(非标准();
        sb.append(什么);
        sb.append());
       }
       sb.append((+什么));
       sb.append(额外);
       Log.e(TAG,sb.toString());
       返回true;
      }      公共无效onBufferingUpdate(MediaPlayer的熔点,诠释百分比){
       Log.d(TAGPlayerService onBufferingUpdate:+百分之+%);
      }     公共无效的onClick(视图v){
         // TODO自动生成方法存根     }         }

该错误:

  20 02-11:45:43.837:D / AndroidRuntime(338):关闭VM
      02-11 20:45:43.837:W / dalvikvm(338):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
      02-11 20:45:43.857:E / AndroidRuntime(338):致命异常:主要
      02-11 20:45:43.857:E / AndroidRuntime(338):显示java.lang.NullPointerException
      02-11 20:45:43.857:E / AndroidRuntime(338):在wadio.media.internetradio.myMain.stop(myMain.java:95)
      02-11 20:45:43.857:E / AndroidRuntime(338):在wadio.media.internetradio.myMain.access $ 2(myMain.java:94)
      02-11 20:45:43.857:E / AndroidRuntime(338):在wadio.media.internetradio.myMain $ 3.onClick(myMain.java:55)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.view.View.performClick(View.java:2485)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.view.View $ PerformClick.run(View.java:9080)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.os.Handler.handleCallback(Handler.java:587)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.os.Handler.dispatchMessage(Handler.java:92)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.os.Looper.loop(Looper.java:123)
      02-11 20:45:43.857:E / AndroidRuntime(338):在android.app.ActivityThread.main(ActivityThread.java:3683)
      02-11 20:45:43.857:E / AndroidRuntime(338):在java.lang.reflect.Method.invokeNative(本机方法)
      02-11 20:45:43.857:E / AndroidRuntime(338):在java.lang.reflect.Method.invoke(Method.java:507)
      02-11 20:45:43.857:E / AndroidRuntime(338):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
      02-11 20:45:43.857:E / AndroidRuntime(338):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
      02-11 20:45:43.857:E / AndroidRuntime(338):在dalvik.system.NativeStart.main(本机方法)


解决方案

在你的停止()方法,你访问 MP 变量。但是, MP 变量为空,直到你preSS播放(和播放()方法被调用) 。所以,当您尝试访问空变量抛出NullPointerException异常。

有一个很简单的方法来阻止NullPointerException异常是做这样的事情:

 私人无效暂停(){
    如果(熔点=空!)mp.pause();
}私人无效停止(){
    如果(熔点=空!)mp.stop();
}

当然,这个解决方案没有考虑那里的暂停或停止调用两次的情况。看看在 的MediaPlayer 文档有关状态管理的更多信息。

When i start my app and press stop or pause the android app will crash. It works fine if you press play first and then stop or pause. I searched on google and stackoverflow but i couldn't find much about it. I think the problem is because of a NullPointerException but since i'm new too java it doesn't tell me much about the problem

The code:

     import android.app.Activity;
     import android.media.AudioManager;
     import android.media.MediaPlayer;
     import android.net.Uri;
     import android.os.Bundle;
     import android.util.Log;
     import android.view.View;
     import android.view.View.OnClickListener;
     import android.widget.Button;

     public class myMain extends Activity implements
       MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
       MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, OnClickListener {


      private String TAG = getClass().getSimpleName();
      private MediaPlayer mp= null;

      private Button play;
      private Button pause;
      private Button stop;




      @Override
      public void onCreate(Bundle icicle) {

       super.onCreate(icicle);
       setContentView(R.layout.main);

       play = (Button) findViewById(R.id.play);
       pause = (Button) findViewById(R.id.pause);
       stop = (Button) findViewById(R.id.stop);




       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() {
       Uri myUri = Uri.parse("url");
       try {
            if (mp == null) {
             this.mp = new MediaPlayer();
            } else {
             mp.stop();
             mp.reset();
            }
        mp.setDataSource(this, myUri); // 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());
       }
      }

      public void onPrepared(MediaPlayer mp) {
       Log.d(TAG, "Stream is prepared");
       mp.start();
      }

      private void pause() {
           mp.pause();
          }
      private void stop() {
           mp.stop();

          }

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

      }

      public void onCompletion(MediaPlayer mp) {
       stop();
      }

      public boolean onError(MediaPlayer mp, int what, int extra) {
       StringBuilder sb = new StringBuilder();
       sb.append("Media Player Error: ");
       switch (what) {
       case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
        sb.append("Not Valid for Progressive Playback");
        break;
       case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
        sb.append("Server Died");
        break;
       case 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(MediaPlayer mp, int percent) {
       Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
      }

     public void onClick(View v) {
         // TODO Auto-generated method stub

     }

         }

The errors:

      02-11 20:45:43.837: D/AndroidRuntime(338): Shutting down VM
      02-11 20:45:43.837: W/dalvikvm(338): threadid=1: thread exiting with uncaught exception (group=0x40015560)
      02-11 20:45:43.857: E/AndroidRuntime(338): FATAL EXCEPTION: main
      02-11 20:45:43.857: E/AndroidRuntime(338): java.lang.NullPointerException
      02-11 20:45:43.857: E/AndroidRuntime(338):    at           wadio.media.internetradio.myMain.stop(myMain.java:95)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at           wadio.media.internetradio.myMain.access$2(myMain.java:94)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at wadio.media.internetradio.myMain$3.onClick(myMain.java:55)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.view.View.performClick(View.java:2485)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.view.View$PerformClick.run(View.java:9080)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.os.Handler.handleCallback(Handler.java:587)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.os.Handler.dispatchMessage(Handler.java:92)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.os.Looper.loop(Looper.java:123)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at android.app.ActivityThread.main(ActivityThread.java:3683)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at java.lang.reflect.Method.invokeNative(Native Method)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at java.lang.reflect.Method.invoke(Method.java:507)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
      02-11 20:45:43.857: E/AndroidRuntime(338):    at dalvik.system.NativeStart.main(Native Method)

解决方案

In your stop() method you access the mp variable. However, the mp variable is null until you press play (and the play() method is called). So when you try to access the null variable a NullPointerException is thrown.

A very simple way to stop the NullPointerException is to do something like this:

private void pause() {
    if(mp!=null) mp.pause();
}

private void stop() {
    if(mp!=null) mp.stop();
}

Of course this solution doesn't account for cases where pause or stop is called twice. Take a look at the MediaPlayer documentation for more info on state management.

这篇关于Android的无线流媒体应用程序崩溃时preSS暂停或者你没有点击的瞬间播放停止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆