2011-08-09 6 views
0

私は音を早く止めることについての投稿をたくさん見ました。これは私の問題ではありません。私の問題はこれです...私はこれらの25の音を立てて働いています。電話が揺れていると、話す、テキストを表示する、アニメーションがあるので、話しているように見えます。最初はうまく動作します。クライアントが見つけた問題を再現できる唯一の方法は、何度もそれを振ってからクリックすることです。それに振り戻して何度も揺さぶってから、もう一度やり直してください。私が数回それを振り戻すと、それは突然すべての音が切れる。ときには、1つは動作しますが、通常は戻って戻ってくると、通常はすべての音が止まります。それ以外のものはすべて機能します。誰もこれの前に遭遇しましたか?どんな助けもありがとう。Android搭載のMedia Playerはすべて音を止めています

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が必要です。次のようにRawリソースを取得することができます。

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()」で始まるように初期化するだけです。その後、データソースを受け入れる状態になります。私は非常に次のリンクを読むことを強くお勧めします。あなたが本当に理解できれば、あなたが遭遇しているすべての問題は、もっとあなたにとって意味があるでしょう:http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram – kcoppock

0

あなたのコードからは、クリックするとMediaPlayerが作成されているようです。しかし、私はそれを停止/解放するコードは見当たりません。したがって、アプリケーションのリソースが不足している可能性があり、最終的に追加のメディアプレーヤーのコンテンツを停止します。そういうわけで、握手イベントのカップルの後に、この問題は盛り上がっています。

Shash

+0

Nah MediaPlayerはonCreateで作成され、サウンドの割り当てはonShakeにあります。問題を解決するかもしれない最上部のonShakeにsound0.stop()などを置くと思いますか? – steven

+1

MediaPlayerを停止してから解放します。 – Shash316

+0

'sound0.reset()'を呼び出す場所では、 'sound0.release()'を呼び出す必要があります。代わりに(これは私の好みです)、 'sound0 = MediaPlayer.create()'の代わりに 'sound0.setDataSource()'を使い、 'reset()'呼び出しをそのままにしておきます。これにより、MediaPlayerはインスタンシエートされたままになりますが、サウンドを変更して再生用に再度準備します。 – kcoppock

関連する問題