2011-08-09 88 views
0

我已經看到很多關於它停止聲音的帖子。這不是我的問題。我的問題是這個......我有這25個聲音起作用。當電話被振動時,它會說話,顯示文本,並有一個動畫,讓人看起來像他在說話。它起初工作得很好。我能夠重現我的客戶發現的問題的唯一方法就是多次搖動,然後點擊返回。重新振作並震動無數次,然後再次點擊。當我再次震動它幾次後,突然所有的聲音都被切斷了。偶爾有人會工作,但如果再回來,通常會停止發聲。其他所有功能都應該如此。任何人都遇到過這個?任何幫助,將不勝感激。Android上的媒體播放器全部停止聲音

public class Ask extends Activity{ 
private SensorManager mSensorManager; 
private ShakeEventListener mSensorListener; 
String[] answer; 
int possibleAnswers, randomAnswer, talkRun=0, last=-1; 
int shake0; 
long lastClick; 
private MediaPlayer mp, sound0; 
Context context; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ask); 
     Intent type = getIntent(); 
     lastClick = type.getLongExtra("lastClick", 0); 
     context=this; 

     final Random generator = new Random(); 

     possibleAnswers = 1; 
     answer = new String[possibleAnswers]; 
     answer[0]="***Coughing***"; 



     //Sounds 
     setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     mp = MediaPlayer.create(this, R.raw.askbud); 
     mp.start(); 


     mSensorListener = new ShakeEventListener(); 
     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mSensorManager.registerListener(mSensorListener, 
      mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 

     final TextView tv = (TextView)findViewById(R.id.answer); 


     mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() { 

      public void onShake() { 
       if (System.currentTimeMillis() - lastClick > 900) { 
        lastClick = System.currentTimeMillis(); 



         randomAnswer = generator.nextInt(possibleAnswers); 
         if(last==randomAnswer) 
          randomAnswer = generator.nextInt(possibleAnswers); 

         animation(); 

         if(randomAnswer==0){ 
         if(shake0>=1){ 
          sound0.reset(); 
         } 
         shake0++; 
         sound0 = MediaPlayer.create(context, R.raw.coughing); 
         try { 
          sound0.prepare(); 
         } catch (IllegalStateException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         sound0.start(); 
         } 

     }); 
    } 





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

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

}

只是微微除了問題。在我聽到沒有聲音發生後,即使應用程序關閉並重新打開後,它仍會繼續發生。

回答

1

好吧,這是一個有點多的評論後,所以這裏是你需要的setDataSource做什麼()。如果你檢查docs for setDataSource(),你會發現它需要FileDescriptor。您可以購買一個原始資源,如下所示:

Resources res = getResources(); 
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.coughing); 
FileDescriptor fd = afd.getFileDescriptor(); 

//assuming existing MediaPlayer mp 
mp.reset(); 
mp.setDataSource(fd); 
mp.prepare(); 
mp.start(); 
+0

感謝您花時間做到這一點。我會給它一個鏡頭。 – steven

+0

我一定做錯了什麼。我在每個if(randomAnswer ==)部分中輸入了這些內容,但沒有發生任何聲音。它一定是我初始化mp的方式。它的初始化方式仍然在上面。我應該如何進行初始化?對MediaPlayer不太瞭解。謝謝您的幫助。 – steven

+0

剛剛初始化一個以'MediaPlayer mp = new MediaPlayer()'開頭。它應該處於接受數據源的狀態。我極力推薦THOROUGHLY閱讀以下鏈接。如果你真的能夠理解這一點,那麼你遇到的所有問題都將對你更有意義:http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram – kcoppock

0

從您的代碼看來,您似乎是在點擊時創建MediaPlayer。但我沒有看到任何代碼停止/釋放它。因此,您的應用程序可能會耗盡資源,最終停止其他媒體播放器內容。這就是爲什麼在幾次震動事件之後,這個問題正在撐起來。

詞shash

+0

Nah MediaPlayer正在onCreate中創建,並且聲音的分配位於onShake中。那麼想想,如果我將sound0.stop()等放在可能解決問題的頂部onShake中? – steven

+1

停止以及釋放MediaPlayer – Shash316

+0

在您調用'sound0.reset()'的位置,您應該調用'sound0.release()'。或者(這將是我的偏好),請使用'sound0.setDataSource()'而不是'sound0 = MediaPlayer.create()'並保留原來的'reset()'調用。這將使MediaPlayer實例化,但改變聲音並準備再次播放。 – kcoppock