2010-11-14 6 views
0

J'ai une application que j'essaie de déboguer sur un problème concernant l'utilisation du lecteur multimédia. J'ai une activité affichée avec un service interrogeant un serveur derrière lui. L'activité affiche l'état dynamique que le service collecte à partir du serveur. Cela fonctionnait très bien. J'ai ensuite ajouté du code dans une classe que le service utilise pour lire un fichier audio s'il voit un élément de données particulier. Cela fonctionne bien pour les premières fois, mais l'application va geler et peut même finir par arriver à la force redoutée à proximité.
Je vois ce qui suit dans le fichier journal. C'est l'avertissement qui me préoccupe et je n'arrive pas à trouver des informations sur eux.Android MediaPlayer éventuellement provoquant l'arrêt de l'application

11-14 10:12:29.742: WARN/AV(28909): #### Attempting to play audio #### 
11-14 10:12:29.742: WARN/[email protected](28909): #### AV - Playing audio #### 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_Init 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 0 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.avc 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.avc 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 1 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 2 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.h263 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.h263 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 3 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.h263 
11-14 10:12:29.782: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.h263 
11-14 10:12:29.782: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 5 
11-14 10:12:29.862: WARN/MediaPlayer(28909): info/warning (1, 44) 
11-14 10:12:29.862: INFO/MediaPlayer(28909): Info (1,44) 

J'utilise le lecteur multimédia comme ceci:

private void playMedia(int  audioResource, 
         boolean vibrate) 
    { 
     Log.i("AV", "#### Attempting to play audio ####"); 

     if (this.lastAlert + VIBRATION_LENGTH <= System.currentTimeMillis()) 
     { 
      this.lastAlert = System.currentTimeMillis(); 

      Log.i(this.toString(), "#### AV - Playing audio ####"); 

      try 
      {  
       MediaPlayer mediaPlayer = new MediaPlayer(); 
       AssetFileDescriptor assetFileDescriptor 
       = this.context.getResources().openRawResourceFd(audioResource); 
       mediaPlayer.setOnCompletionListener(this); 
       mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), 
             assetFileDescriptor.getStartOffset(), 
             assetFileDescriptor.getLength()); 
       mediaPlayer.prepare(); 
       mediaPlayer.start(); 
      } 
      catch (Exception e) 
      { 
       Log.e(this.toString(), e.toString()); 
       e.printStackTrace(); 
      } 

      if (vibrate) 
      { 
       if (null != this.vibrator) 
       { 
       this.vibrator.vibrate(VIBRATION_LENGTH); 
       } 
      } 
     } 
     else 
     { 
      Log.w(this.toString(), "##### AV - Audio is already playing #####"); 
     } 
    }// end playMedia 

    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) 
    { 
     mediaPlayer.reset(); 
     mediaPlayer.release(); 

     Log.i(this.toString(), "#### ################################### ####"); 
     Log.i(this.toString(), "#### AV - reset and release media player ####"); 

    } 

Les fichiers audio sont au format mp3.

Répondre

3

Vous devez appeler à proximité de AssetFileDescriptor chaque fois que vous le définissez comme source de données. Même le document SDK indique que vous pouvez libérer un descripteur de fichier après l'appel à setDataSource.

+0

Merci pour l'idée. Ce problème est OBE (surmonté par les événements) à ce stade. Je ne suis pas sûr que ce soit le problème ou non. J'ai fini par ne pas utiliser un descripteur de fichier du tout. De plus, le lecteur multimédia à l'époque n'était pas dans l'activité réelle. C'est maintenant et je n'ai plus eu de problèmes. – bursk