2013-04-30 37 views
1

我有一個活動,看起來像,的MediaPlayer的start()/停止()穆裏爲空

public class TestActivity extends Activity { 

    private SensorManager  mSensorManager; 
     private ShakeEventListener mSensorListener; 
    private MediaPlayer  mPlayer; 

    private boolean   mIsPlaying; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.testsound); 

     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSensorListener = new ShakeEventListener(); 
     mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() { 

      @Override 
      public void onShake() { 
      toggleSound(); 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mSensorManager.registerListener(mSensorListener, 
      mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(mSensorListener); 
     stopSound(); 
    }  

    protected void toggleSound() { 
     if (!mIsPlaying) { 
      startSound(); 
     } else { 
      stopSound(); 
     } 
    } 


    protected void startSound() { 

     if (mPlayer == null) 
      { 
      mPlayer = MediaPlayer.create(TestActivity.this, R.raw.test); 
      mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

      mPlayer.setLooping(true); 
      mPlayer.start(); 

      mPlayer.setOnCompletionListener(new OnCompletionListener() { 

       @Override 
       public void onCompletion(MediaPlayer mp) { 
        stopSound(); 
       } 
      }); 

      mIsPlaying = true; 
      } 
    } 


    protected void stopSound() { 
     if (mPlayer != null) { 
       if (mPlayer.isPlaying()) 
       { 
        mPlayer.stop(); 
       } 
       mPlayer.release(); 
       mPlayer = null; 
     } 

     mIsPlaying = false; 
    } 

} 

我知道這可能不是做的最好的方式,但我剛剛開始使用一些隨機測試。我沒有包含ShakeEventListener,但是這幾乎只是檢測一個搖動事件,在循環中播放一個示例聲音(是的,這非常煩人!),直到下一次搖晃。

事實上,這確實工作得很好,除非執行啓動和停止命令時獲得帶有標籤MediaPlayer的LogCat條目,該條目表示執行start() mUri is nullstop() mUri is null。這讓我相信我做錯了什麼,但是我無法找到它是什麼,當我谷歌一點時,這也不是一個流行的錯誤。

會有人知道這裏的含義嗎?對不起,如果我很厚 - 這對我來說仍然有點混亂。

更新(從評論):我做的一件事是給它一個實際的Uri(從路徑建成),然後它帶有一個類似的警告,現在說start() mUri is android.resource://com.joris.soundtest/2130968576(D級)水平Uri is android.resource//...(點給相同的uri)。這些LogCat條目有可能只是'提供信息',用於調試? E級的人不會聽起來像這樣..

謝謝! -Joris。

+0

嘗試通過上下文的startSound方法,如[這裏](HTTP://計算器.com/questions/12154951/android-mediaplayer-create) – Peshal 2013-05-01 00:57:33

+0

不幸的是,這並沒有改變任何LogCat輸出。我做的一件事是給它一個實際的Uri(從路徑構建),然後它帶有類似的警告,現在說'start()mUri是android.resource:// com.joris.soundtest/2130968576'(D級),在這個時間之前由一個E級別的Uri是android.resource // ...(點給出相同的uri)。這些LogCat條目有可能只是'提供信息',用於調試? – 2013-05-01 08:41:19

回答

0

變化以後的事,因爲mediaplayer.release()方法不會使MediaPlayer對象爲空...

package com.pranav.listviewdemo; 

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorManager; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private SensorManager  mSensorManager; 
    private ShakeEventListener mSensorListener; 
    private MediaPlayer  mPlayer; 
    static int i=1; 

    private boolean   mIsPlaying=false; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.activity_main); 

     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSensorListener = new ShakeEventListener(this,null); 
     mPlayer = MediaPlayer.create(this, R.raw.test); 
     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     mPlayer.setLooping(true); 

     mPlayer.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       stopSound(); 
      } 
     }); 
     mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() { 

      @Override 
      public void onShake() { 
      toggleSound(); 
      Toast.makeText(getBaseContext(), "DETECTED"+i, Toast.LENGTH_SHORT).show(); 
      i++; 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mSensorManager.registerListener(mSensorListener, 
      mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(mSensorListener); 
     stopSound(); 
    }  

    protected void toggleSound() { 
     if (!mIsPlaying) { 
      startSound(); 
     } else { 
      stopSound(); 
     } 
    } 


    protected void startSound() { 

     if (mPlayer != null) 
      { 
      mPlayer.seekTo(0); 
      mPlayer.start(); 
      mIsPlaying = true; 
      } 
    } 


    protected void stopSound() { 
     if (mPlayer != null) { 
       if (mPlayer.isPlaying()) 
       { 
        mPlayer.pause(); 
        mIsPlaying = false; 
       } 

     } 


    } 

} 
+0

我將它設置爲NULL,位於release()後的stopSound()中。這似乎工作。我已經嘗試在我的OnCreate方法中執行mPlayer.create(..)的事情,然後僅使用OnPause中的release()在startSound和stopSound中啓動和停止。從長遠來看,這會是更優雅的事情嗎?目前它在任何情況下都給我提供各種致命的異常(在非法狀態中調用等),但是如果它是對create()和release()+的持續使用的改進,我可以嘗試通過它們來嘗試。空值。 – 2013-05-01 08:47:59

+0

我希望這段代碼能夠幫助你,並且會滿足你的要求 – 2013-05-01 15:47:16

+0

哦,非常出色,感謝你付出的努力 - 今晚我會放棄這一點。但從快速檢查來看,它看起來像mPlayer永遠不會是NULL(這可能導致它永遠不會啓動聲音,在startSound()?)中,並且沒有任何發佈(以及我在線閱讀的內容,爲了資源的目的,這是相當強制的)。我可能會錯過一些東西..我通常只有正確理解代碼後,我試了一下。 :) – 2013-05-01 16:37:35