2012-11-18 18 views
5

Un paio di giorni fa, ho ricevuto un registro di arresto anomalo sulla mia app rilasciata.Arresto di ToneGenerator Android

L'errore proviene da ToneGenerator e non riesco a trovare il problema.

Qui, ho un conto alla rovescia, quando il timer raggiunge 0, l'app lancia un ToneGenerator.

private void lanceMinuteur(int temps, int color){ 
    if(color == 0) 
     minuteur.setTextColor(getResources().getColor(R.color.color_important)); 
    else 
     minuteur.setTextColor(getResources().getColor(R.color.color_informative)); 

    if(chronoLance){ 
     chrono.cancel(); 
    } 
    chronoLance = true; 

    chrono = new CountDownTimer((temps + 1) * 1000, 1000) { 
     public void onTick(long millisUntilFinished) { 
      minuteur.setText(String.valueOf(millisUntilFinished/1000) + "\""); 
     } 
     public void onFinish() { 
      minuteur.setText("0\""); 
      minuteur.setTextColor(getResources().getColor(R.color.textcolor1design)); 
      chronoLance = false; 
      final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); //The error is coming from here 
      tg.startTone(ToneGenerator.TONE_PROP_ACK); 
     } 
    }.start(); 

} 

E il crollo di registro che ho ricevuto:

java.lang.RuntimeException: Init failed 
at android.media.ToneGenerator.native_setup(Native Method) 
at android.media.ToneGenerator.<init>(ToneGenerator.java:798) 
at ma.myperf.musculation.activ.GoPerformanceActivity$2.onFinish(GoPerformanceActivity.java:350) 
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:150) 
at android.app.ActivityThread.main(ActivityThread.java:4385) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
at dalvik.system.NativeStart.main(Native Method) 

Così che cosa può essere il problema? Ho chiesto se il ToneGenerator ha provato un blocco Catch, ma non c'era.

Sto pensando che forse il dispositivo in cui si è verificato l'arresto non avesse un AudioManager.Stream_Notification?

+1

stesso problema qui :(http://stackoverflow.com/questions/13463691/error-generating-beep-using-tonegenerator-class –

+1

qual è il codice in 'GoPerformanceActivity.java', linea 350? – dumbfingers

+0

la linea 350 è questa riga finale ToneGenerator tg = new ToneGenerator (AudioManager.STREAM_NOTIFICATION, 100); E 'dove ho inserito "// L'errore sta venendo da qui" – FR073N

risposta

1

Ho utilizzato un SoundPool per risolvere il mio problema. Ho letto che SoundManager era l'opzione migliore per riprodurre effetti sonori brevi, quindi ho usato una soluzione pubblicata qui perché ToneGenerator è troppo instabile a quanto pare.

public void initSounds(Context theContext, int nbMaxSons) { 
    mContext = theContext; 
    mSoundPool = new SoundPool(nbMaxSons, AudioManager.STREAM_MUSIC, 0); 
    mSoundPoolMap = new HashMap<Integer, Integer>(); 
    mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
} 

public void addSound(int index, int soundID) { 
    mAvailibleSounds.add(index); 
    mSoundPoolMap.put(index, mSoundPool.load(mContext, soundID, 1)); 

} 

public void playSound(int index) { 
    // dont have a sound for this obj, return. 
    if (mAvailibleSounds.contains(index)) { 

     int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
     int soundId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 

     mKillSoundQueue.add(soundId); 

     // schedule the current sound to stop after set milliseconds 
     mHandler.postDelayed(new Runnable() { 
      public void run() { 
       if (!mKillSoundQueue.isEmpty()) { 
        mSoundPool.stop(mKillSoundQueue.firstElement()); 
       } 
      } 
     }, 3000); 
    } 
} 

Quindi mi chiedo quale uso può essere dato a ToneGenerator quando questo si arresta spesso.

5

ho trovato questo here:

Sembra che l'applicazione non sta rilasciando il suo lettore multimediale risorse. Quando hai terminato di riprodurre un suono, devi chiamare il metodo MediaPlayer.release(). Se stai suonando un sacco di suoni rapidamente, il garbage collector non sarà in grado di tenere il passo.

+0

Penso che tu abbia ragione: ma quando sappiamo esattamente quando il suono sta suonando? ? – FR073N

Problemi correlati