2016-07-27 2 views
1

Fondamentalement, j'ai mon activité principale qui, par une intention, appelle une autre activité qui a un bouton qui devrait jouer un son.Android MediaPlayer erreur avec intention et le bouton

Cela dit, dans la deuxième activité j'ai cette méthode:

public void start_sound(View v) { 
    String url = /*"MY_URL"*/; 
    try { 
     if (mp != null) 
     { 
      mp.stop(); 
      mp.release(); 
      mp = null; 
     } 
     mp = new MediaPlayer(); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setDataSource(url); 
     mp.prepare(); 
     mp.start(); 
    } catch (Exception e) {} 
} 

mp est une variable globale (donc je peux vérifier chaque fois en cours de lecture ou est nulle).

Ce qui se passe quand je clique sur le bouton:

E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb40d7400 
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 } 
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 } 
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 } 
W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=676.58203, y[0]=318.10547, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=866058, downTime=860523, deviceId=0, source=0x1002 } 
E/MediaPlayer: error (1, -2147483648) 
I/Choreographer: Skipped 1806 frames! The application may be doing too much work on its main thread. 

Le premier arrive quand je change de l'activité avec l'intention; les autres, quand j'appuie sur le bouton pour les sons.

J'ai déjà la permission dans le manifeste.

EDIT: Ceci est la classe complète:

import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 


public class activity_2 extends AppCompatActivity { 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_activity_2); 
} 

public void start_sound(View v) { 

    String url = "<MY_URL>"; 
    MediaPlayer mp = new MediaPlayer(); 
    try { 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setDataSource(url); 
     mp.setOnPreparedListener(this); 
     mp.prepare(); 
     mp.start(); 
    } catch (Exception ignored) { 
    } 
} 
} 

Répondre

0

Vous devez utiliser la méthode prepareAsync() sur votre lecteur multimédia puisque vous diffusez la musique. Il suffit de changer cela mp.prepare() et le tester.

Il semble que vous n'ayez pas implémenté le onPreparedListener. Mettre en œuvre cette interface et appeler le mp.start à l'intérieur du onPrepared() ça devrait aller.

Assurez-vous que votre deuxième activité implémente MediaPlayer.OnPreparedListener

D'autres interfaces, vous pouvez mettre en œuvre sont onErrorListener, onCompletionListener

+0

Changé, maintenant il me donne 'E/MediaPlayer: arrêt appelé à l'état 0 E/MediaPlayer: erreur (-38,0) E/MediaPlayer: arrêt appelé à l'état 4 E/MediaPlayer: erreur (- 38,0) W/MediaPlayer: mediaplayer est parti avec des événements non gérés E/MediaPlayer: erreur (-38,0) E/MediaPlayer: erreur (1, -214 7483648) ' –

+0

Quelle est l'erreur? –

+0

Vérifiez la réponse éditée –

0

Je pense que vous vérifiez objet lecteur multimédia avant l'initialisation qui est le problème

if (mp != null) 
    { 
     mp.stop(); 
     mp.release(); 
     mp = null; 
    } 

Marque initialiser que les médias objet joueur avant de l'utiliser.

 mp=new MediaPlayer(); 

if (mp != null) 
    { 
     mp.stop(); 
     mp.release(); 
     mp = null; 
    } 
+0

Même problèmes, j'avais MediaPlayer mp comme une variable globale, donc je peux vérifier quand il était encore en train de jouer (de sorte que si je clique sur le bouton, il ne crée pas 1000 sons). De toute façon j'obtiens la même erreur. –

+0

si vous utilisez 'prepareAsync()' alors vous devez être entouré par try and catch block. –

+0

Tout est entouré d'un bloc try-catch –

0

Vous pouvez faire une chose comme ceci:

public void play(){ 
    playButton.setImageResource(R.drawable.stop); 
    player = new MediaPlayer(); 
    playing = true; 
    player.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    player.setOnCompletionListener(this); 
    player.setOnErrorListener(this); 
    player.setOnPreparedListener(this); 
    try { 
     player.setDataSource(path); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    player.prepareAsync(); 
} 

public void stop(){ 
    playButton.setImageResource(R.drawable.play); 
    playing = false; 
    player.stop(); 
    player.reset(); 
    player.release(); 
    player = null; 
} 

Pour mon lecteur multimédia i créé un écouteur personnalisé, où les commutateurs de bouton de lecture/fonction d'arrêt (et imageresource). Vous devez utiliser prepareAsync() et mettre le début dans OnPrepared.

@Override 
public void onClick(View view) { 
    if (!playing) { 
     play(); 

    } else { 
     stop(); 

    } 
} 

@Override 
public void onCompletion(MediaPlayer mediaPlayer) { 
    playButton.setImageResource(R.drawable.play); 
    mediaPlayer.stop(); 
    mediaPlayer.reset(); 
    mediaPlayer.release(); 
    //player = null; 
    playing = false; 
} 

@Override 
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { 
    Log.i("Error","found"); 
    mediaPlayer.stop(); 
    mediaPlayer.reset(); 
    mediaPlayer.release(); 
    //player = null; 
    playing = false; 
    return false; 
} 


@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    Log.i("mediaplayer","preparato"); 
    mediaPlayer.start(); 

} 

L'erreur que vous avez, si vous jouez audio externe sd, est connecté (dans mon cas, il était) sur le chemin incorrect avec des périphériques sans carte SD externe, donc attention au chemin que vous avez donné