2013-06-08 1 views
0

Je crée un jeu pour Android, j'ai donc décidé de créer un bouton muet qui mettrait la musique en pause. J'ai ajouté le code suivantCréé un bouton de sourdine simple pour mon jeu Android mais il bloque l'application?

for (int i = 0; i < len; i++) { 
     TouchEvent event = touchEvents.get(i); 
     if (event.type == TouchEvent.TOUCH_UP) { 

      if (inBounds(event, 4, 3, 80, 35)) { 
       if (AndroidMusic.mediaPlayer.isPlaying() == true) { 
        AndroidMusic.mediaPlayer.setVolume(0.0f,0.0f); 
       } 

      } 

     } 
    } 

Ainsi, lorsque vous touchez entre 4, 3, 80, 35 (le bouton mute) il vérifier si le musis joue et si elle est elle régler le volume à 0.0f . J'ai aussi essayé avec:

AndroidMusic.mediaPlayer.pause(); 

, mais il ne fonctionne pas non plus. Quand j'efface cette partie de ce code, tout fonctionne parfaitement, mais quand je les place à nouveau, le menu se charge mais au moment où vous touchez n'importe où (même le bouton Lecture, ou un espace vide) il s'arrête puis se bloque .

EDIT: Voici le LogCat,

06-09 09:59:38.565: I/Process(24310): Sending signal. PID: 24310 SIG: 9 
06-09 09:59:43.075: D/dalvikvm(26060): GC_FOR_ALLOC freed 69K, 10% free 12147K/13443K, paused 41ms, total 41ms 
06-09 09:59:43.080: I/dalvikvm-heap(26060): Grow heap (frag case) to 13.647MB for 768016-byte allocation 
06-09 09:59:43.095: D/dalvikvm(26060): GC_FOR_ALLOC freed <1K, 10% free 12896K/14215K, paused 16ms, total 16ms 
06-09 09:59:43.140: D/dalvikvm(26060): GC_CONCURRENT freed 5K, 10% free 12903K/14215K, paused 15ms+12ms, total 45ms 
06-09 09:59:43.145: V/SoundPoolThread(26060): beginThread 
06-09 09:59:43.145: V/SoundPoolThread(26060): run 
06-09 09:59:43.145: V/MediaPlayer-JNI(26060): native_setup 
06-09 09:59:43.145: V/MediaPlayer(26060): constructor 
06-09 09:59:43.150: V/MediaPlayer(26060): setListener 
06-09 09:59:43.150: V/MediaPlayer-JNI(26060): setDataSourceFD: fd 43 
06-09 09:59:43.150: V/MediaPlayer(26060): setDataSource(43, 241934, 1635707) 
06-09 09:59:43.160: V/MediaPlayer(26060): setVideoSurfaceTexture 
06-09 09:59:43.160: V/MediaPlayer(26060): prepare 
06-09 09:59:43.165: V/MediaPlayer(26060): message received msg=5, ext1=0, ext2=0 
06-09 09:59:43.165: V/MediaPlayer(26060): New video size 0 x 0 
06-09 09:59:43.165: V/MediaPlayer(26060): callback application 
06-09 09:59:43.165: V/MediaPlayer(26060): back from callback 
06-09 09:59:43.165: V/MediaPlayer(26060): message received msg=1, ext1=0, ext2=0 
06-09 09:59:43.165: V/MediaPlayer(26060): prepared 
06-09 09:59:43.165: V/MediaPlayer(26060): signal application thread 
06-09 09:59:43.165: V/MediaPlayer(26060): callback application 
06-09 09:59:43.165: V/MediaPlayer(26060): prepare complete - status=0 
06-09 09:59:43.165: V/MediaPlayer(26060): back from callback 
06-09 09:59:43.165: V/MediaPlayer-JNI(26060): setLooping: 1 
06-09 09:59:43.165: V/MediaPlayer(26060): MediaPlayer::setLooping 
06-09 09:59:43.165: V/MediaPlayer-JNI(26060): setVolume: left 0.850000 right 0.850000 
06-09 09:59:43.165: V/MediaPlayer(26060): MediaPlayer::setVolume(0.850000, 0.850000) 
06-09 09:59:43.165: V/MediaPlayer(26060): isPlaying: 0 
06-09 09:59:43.165: V/MediaPlayer-JNI(26060): isPlaying: 0 
06-09 09:59:43.165: V/MediaPlayer-JNI(26060): start 
06-09 09:59:43.165: V/MediaPlayer(26060): start 
06-09 09:59:43.180: V/MediaPlayer(26060): isPlaying: 1 
06-09 09:59:43.180: V/MediaPlayer-JNI(26060): isPlaying: 1 
06-09 09:59:43.185: I/MediaPlayer(26060): Don't send intent. msg.arg1 = 0, msg.arg2 = 0 
06-09 09:59:43.230: D/libEGL(26060): loaded /system/lib/egl/libEGL_mali.so 
06-09 09:59:43.235: D/libEGL(26060): loaded /system/lib/egl/libGLESv1_CM_mali.so 
06-09 09:59:43.235: D/libEGL(26060): loaded /system/lib/egl/libGLESv2_mali.so 
06-09 09:59:43.240: D/(26060): Device driver API match 
06-09 09:59:43.240: D/(26060): Device driver API version: 10 
06-09 09:59:43.240: D/(26060): User space API version: 10 
06-09 09:59:43.240: D/(26060): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Tue Oct 16 15:37:13 KST 2012 
06-09 09:59:43.270: D/OpenGLRenderer(26060): Enabling debug mode 0 
06-09 09:59:43.295: D/dalvikvm(26060): GC_FOR_ALLOC freed 77K, 9% free 12942K/14215K, paused 12ms, total 12ms 
06-09 09:59:43.295: I/dalvikvm-heap(26060): Grow heap (frag case) to 14.423MB for 768016-byte allocation 
06-09 09:59:43.315: D/dalvikvm(26060): GC_CONCURRENT freed <1K, 9% free 13691K/14983K, paused 12ms+2ms, total 23ms 
06-09 09:59:43.315: D/dalvikvm(26060): WAIT_FOR_CONCURRENT_GC blocked 11ms 
06-09 09:59:43.350: D/dalvikvm(26060): GC_FOR_ALLOC freed 1K, 9% free 13695K/14983K, paused 12ms, total 12ms 
06-09 09:59:43.350: I/dalvikvm-heap(26060): Grow heap (frag case) to 15.892MB for 1536016-byte allocation 
06-09 09:59:43.375: D/dalvikvm(26060): GC_CONCURRENT freed <1K, 9% free 15195K/16519K, paused 11ms+2ms, total 25ms 
06-09 09:59:43.375: D/dalvikvm(26060): WAIT_FOR_CONCURRENT_GC blocked 13ms 
06-09 09:59:43.430: D/dalvikvm(26060): GC_FOR_ALLOC freed <1K, 9% free 15196K/16519K, paused 17ms, total 18ms 
06-09 09:59:43.435: I/dalvikvm-heap(26060): Grow heap (frag case) to 17.358MB for 1536016-byte allocation 
06-09 09:59:43.465: D/dalvikvm(26060): GC_CONCURRENT freed <1K, 8% free 16696K/18055K, paused 12ms+2ms, total 27ms 
06-09 09:59:43.465: D/dalvikvm(26060): WAIT_FOR_CONCURRENT_GC blocked 12ms 
06-09 09:59:43.510: D/dalvikvm(26060): GC_FOR_ALLOC freed <1K, 8% free 16696K/18055K, paused 12ms, total 12ms 
06-09 09:59:43.520: I/dalvikvm-heap(26060): Grow heap (frag case) to 21.313MB for 4147216-byte allocation 
06-09 09:59:43.540: D/dalvikvm(26060): GC_CONCURRENT freed <1K, 7% free 20746K/22151K, paused 12ms+2ms, total 23ms 
06-09 09:59:43.730: D/dalvikvm(26060): GC_FOR_ALLOC freed 1503K, 12% free 21044K/23687K, paused 15ms, total 15ms 
06-09 09:59:43.810: D/dalvikvm(26060): GC_FOR_ALLOC freed 1501K, 12% free 21042K/23687K, paused 15ms, total 15ms 
06-09 09:59:43.815: I/dalvikvm-heap(26060): Grow heap (frag case) to 25.557MB for 4147216-byte allocation 
06-09 09:59:43.845: D/dalvikvm(26060): GC_CONCURRENT freed <1K, 10% free 25092K/27783K, paused 12ms+1ms, total 26ms 
06-09 09:59:46.130: V/MediaPlayer(26060): isPlaying: 1 
06-09 09:59:46.130: V/MediaPlayer-JNI(26060): isPlaying: 1 
06-09 09:59:46.130: V/MediaPlayer-JNI(26060): pause 
06-09 09:59:46.130: V/MediaPlayer(26060): pause 
06-09 09:59:47.450: W/dalvikvm(26060): threadid=13: thread exiting with uncaught exception (group=0x410ba2a0) 
06-09 09:59:47.455: E/AndroidRuntime(26060): FATAL EXCEPTION: Thread-4402 
06-09 09:59:47.455: E/AndroidRuntime(26060): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
06-09 09:59:47.455: E/AndroidRuntime(26060): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
06-09 09:59:47.455: E/AndroidRuntime(26060): at java.util.ArrayList.get(ArrayList.java:304) 
06-09 09:59:47.455: E/AndroidRuntime(26060): at com.kilobolt.robotgame.MainMenuScreen.update(MainMenuScreen.java:35) 
06-09 09:59:47.455: E/AndroidRuntime(26060): at com.kilobolt.framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:47) 
06-09 09:59:47.455: E/AndroidRuntime(26060): at java.lang.Thread.run(Thread.java:856) 

Je n'initialiser MediaPlayer, voici la classe AndroidMusic:

package com.kilobolt.framework.implementation; 

import java.io.IOException; 

import android.content.res.AssetFileDescriptor; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.media.MediaPlayer.OnSeekCompleteListener; 
import android.media.MediaPlayer.OnVideoSizeChangedListener; 

import com.kilobolt.framework.Music; 

public class AndroidMusic implements Music, OnCompletionListener, OnSeekCompleteListener, OnPreparedListener, OnVideoSizeChangedListener { 
    public static MediaPlayer mediaPlayer; 
    boolean isPrepared = false; 

    public AndroidMusic(AssetFileDescriptor assetDescriptor) { 
     mediaPlayer = new MediaPlayer(); 
     try { 
      mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(), 
        assetDescriptor.getStartOffset(), 
        assetDescriptor.getLength()); 
      mediaPlayer.prepare(); 
      isPrepared = true; 
      mediaPlayer.setOnCompletionListener(this); 
      mediaPlayer.setOnSeekCompleteListener(this); 
      mediaPlayer.setOnPreparedListener(this); 
      mediaPlayer.setOnVideoSizeChangedListener(this); 

     } catch (Exception e) { 
      throw new RuntimeException("Couldn't load music"); 
     } 
    } 

    @Override 
    public void dispose() { 

     if (this.mediaPlayer.isPlaying()){ 
       this.mediaPlayer.stop(); 
       } 
     this.mediaPlayer.release(); 
    } 

    @Override 
    public boolean isLooping() { 
     return mediaPlayer.isLooping(); 
    } 

    @Override 
    public boolean isPlaying() { 
     return this.mediaPlayer.isPlaying(); 
    } 

    @Override 
    public boolean isStopped() { 
     return !isPrepared; 
    } 

    @Override 
    public void pause() { 
     if (this.mediaPlayer.isPlaying()) 
      mediaPlayer.pause(); 
    } 



    @Override 
    public void play() { 
     if (this.mediaPlayer.isPlaying()) 
      return; 

     try { 
      synchronized (this) { 
       if (!isPrepared) 
        mediaPlayer.prepare(); 
       mediaPlayer.start(); 
      } 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void muteSound() { 

    } 

    @Override 
    public void setLooping(boolean isLooping) { 
     mediaPlayer.setLooping(isLooping); 
    } 

    @Override 
    public void setVolume(float volume) { 
     mediaPlayer.setVolume(volume, volume); 
    } 

    @Override 
    public void stop() { 
     if (this.mediaPlayer.isPlaying() == true){ 
     this.mediaPlayer.stop(); 

     synchronized (this) { 
      isPrepared = false; 
     }} 
    } 

    @Override 
    public void onCompletion(MediaPlayer player) { 
     synchronized (this) { 
      isPrepared = false; 
     } 
    } 

    @Override 
    public void seekBegin() { 
     mediaPlayer.seekTo(0); 

    } 


    @Override 
    public void onPrepared(MediaPlayer player) { 
     // TODO Auto-generated method stub 
     synchronized (this) { 
       isPrepared = true; 
      } 

    } 

    @Override 
    public void onSeekComplete(MediaPlayer player) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onVideoSizeChanged(MediaPlayer player, int width, int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void CurrVolume(float volume) { 
     // TODO Auto-generated method stub 

    } 


} 

HalR, j'ai essayé votre code et qui a fait le bouton "mute" pause la musique et ne pas planter l'application, mais il se bloque toujours quand j'appuie sur le bouton "play".

+1

S'il vous plaît donner le LogCat. Cela aide à connaître l'erreur exacte. –

Répondre

1

C'est difficile à savoir, avec un code partiel. Mais vu ce que vous avez montré, et à quoi ressemble la "plaque de chaudière", je suppose que vous n'avez pas initialisé votre MediaPlayer.

Vous devriez entourer votre code d'une vérification pour voir si le mediaPlayer existe. Comme ceci:

if (AndroidMusic.mediaPlayer != null) { 
    for (int i = 0; i < len; i++) { 
     TouchEvent event = touchEvents.get(i); 
     if (event.type == TouchEvent.TOUCH_UP) { 

      if (inBounds(event, 4, 3, 80, 35)) { 
       if (AndroidMusic.mediaPlayer.isPlaying() == true) { 
        AndroidMusic.mediaPlayer.setVolume(0.0f,0.0f); 
       } 

      } 

     } 
    } 
} 
Questions connexes