2010-11-29 31 views
2

Scénariofichier audio Android ne joue pas complètement, brutalement interupted se

J'ai un problème qui commence à me rendre fou. Dans une activité, j'ai le scénario suivant. En créer: - créer un Listner GPS - créer un emplacement Listener - listner GPS Start et emplacement écoute - Démarrer une AsyncTask qui télécharge une carte à partir du Web/ou le charger à partir du cache - lire un fichier wav qui est ressource brute, très petite (environ 63 Kilo) qui est courte, fondamentalement elle dit: "Dirigeons-nous vers le point de départ" et rend visible un textview pendant 10 secondes.

Problème

Rarement le son est de jouer pleinement. Parfois, j'entends seulement "Let's head", parfois "Dirigeons-nous vers l'étoile", parfois pas de jeu du tout. C'est comme si quelque chose bloquait le son. Je me suis déplacé le son dans son propre fil, mais toujours sans succès:

code

private void ShowTextPlayVoice(String message, int soundResId) 
    { 
     txtProceed.setText(message); 
     txtProceed.setVisibility(View.VISIBLE); 
     final int soundId = soundResId; 

     Handler splashHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        switch (msg.what) { 
        case 0: 
          txtProceed.setVisibility(View.INVISIBLE); 
          break; 
        } 
        super.handleMessage(msg); 
      } 
     }; 

      Message msg = new Message(); 
      msg.what = 0; 
      splashHandler.sendMessageDelayed(msg, 10000); 

      Thread thread = new Thread() { 
       public void run() { 
        MediaPlayer mp = MediaPlayer.create(ctx, soundId); 
        mp.start(); 
        mp.setOnCompletionListener(new OnCompletionListener() { 
            public void onCompletion(MediaPlayer mp) { 
             mp.release(); 
            } 
           }); 
       } 
      }; 
      thread.start(); 
    } 

Merci à tous de l'aide.

Répondre

5

Après quelques essais, voici une solution de travail

private MediaPlayer mediaPlayer = new MediaPlayer(); 

private void ShowTextPlayVoice(String message, int soundResId) 
    { 
     txtProceed.setText(message); 
     txtProceed.setVisibility(View.VISIBLE); 

     Handler splashHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        switch (msg.what) { 
        case 0: 
          txtProceed.setVisibility(View.INVISIBLE); 
          break; 
        } 
        super.handleMessage(msg); 
      } 
     }; 

      Message msg = new Message(); 
      msg.what = 0; 
      splashHandler.sendMessageDelayed(msg, 10000); 

      new SoundTask().execute(soundResId); 
    } 

    protected class SoundTask extends AsyncTask<Integer, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(Integer... params) 
     { 
      AssetFileDescriptor afd = ctx.getResources().openRawResourceFd(params[0]); 

      try 
      { 
       //final MediaPlayer mediaPlayer = new MediaPlayer(); 
       mediaPlayer.reset(); 
       mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 
       mediaPlayer.prepare(); 
       mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
        public void onPrepared(MediaPlayer arg0) { 
         mediaPlayer.seekTo(0); 
         mediaPlayer.start(); 
               }); 
        } 
       }); 
       afd.close(); 
      } 
      catch (Exception e) { 
      } 

      return null; 
     } 
    } 
+0

Salut Alin, merci pour la solution affichage. Cela fonctionne vraiment bien pour moi. – axcdnt