2016-07-27 4 views
1

基本的には、意図的にサウンドを再生するボタンを持つ別のアクティビティを呼び出す主なアクティビティがあります。前記インテントとボタンでAndroid MediaPlayerエラーが発生する

は、第二の活性に私はこの方法を持っている:

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は(再生またはヌルであるときはいつでも私は確認することができる)グローバル変数です。

これは私がボタンをクリックしたときに何が起こるかです:

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. 

私が意図して活動を変更したときに最初のものが起こります。他のもの、私は音のボタンを押します。

私はすでにマニフェストで許可を受けています。

EDIT:これは完全なクラスです:

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) { 
    } 
} 
} 

答えて

0

あなたが音楽をストリーミングしているので、あなたはあなたのメディアプレーヤーにする方法prepareAsync()を使用する必要があります。ただmp.prepare()を変更してテストしてください。

onPreparedListenerを実装していないかのようです。このインタフェースを実装し、onPrepared()の中のmp.startと呼んでも問題ありません。

2番目の活動は、あなたが実装することができMediaPlayer.OnPreparedListener

いくつかの他のインターフェイスは、私はあなたが

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

メイクは必ずメディアを初期化する問題だ初期化する前に、メディアプレーヤオブジェクトを確認すると思うonErrorListener, onCompletionListener

+0

が、今では私に 'E/MediaPlayerのを与え、変更:エラー(-38,0) E/MediaPlayerの::0 E/MediaPlayerの状態で呼び出さ停止状態4 E/MediaPlayerので呼び出さSTOP:(エラー - Media Player:処理されていないイベントが発生しました。 E/MediaPlayer:エラー(-38,0) E/MediaPlayer:エラー(1、-214) 7483648) ' –

+0

エラーは何ですか? –

+0

編集された答えを確認してください –

0

ある実装していることを確認しますプレーヤーオブジェクトを使用する前に

 mp=new MediaPlayer(); 

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

同じ問題が、私はグローバル変数としてMediaPlayer mpを持っていたので、それがまだ再生されていたときにチェックすることができます。 とにかく同じエラーが発生します。 –

+0

'prepareAsync()'を使用している場合はtryとcatchブロックで囲む必要があります。 –

+0

すべてがtry-catchブロックで囲まれています –

0

あなたはこのようなことを行うことができます。私のメディアプレーヤーのために

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; 
} 

iは、ボタンスイッチ/ストップ機能(およびimageresource)を再生するカスタムリスナーを作成しました。 prepareAsync()を使用し、開始を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(); 

} 

あなたがSDに外部オーディオを再生している場合は、外付けのSDカードとデバイスとの間違ったパスに(私の場合はそれがあった)に接続されているエラー、あなたが与えたパスに注意を払います

関連する問題