2011-07-06 14 views
16

MediaPlayerのドキュメントでは、reset()呼び出しの無効な状態がないことを示しています。無効な状態は{}または "none"と表示されます。http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_StatesMediaPlayer.reset()を呼び出すIllegalStateException

しかし、私はreset()の呼び出し中にスローIllegalStateExceptionを見てきました:

java.lang.IllegalStateException 
at android.media.MediaPlayer._reset(Native Method) 
at android.media.MediaPlayer.reset(MediaPlayer.java:1061) 
at com.example.android.player.AsyncPlayer$AsyncHandler.handleMessage(AsyncPlayer.java:654) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.os.HandlerThread.run(HandlerThread.java:60) 

が不正のドキュメントですか?

+0

フム、それが見えました。混乱させて申し訳ありません。 :) – Wroclai

答えて

19

あなたのコードを見ることなく言うのは難しいですが、あなたはrelease()を呼び出した後にreset()を呼び出すかもしれないと思いますか?

ドキュメントでは、有効なライフサイクルの外でリセットを呼び出すことが可能

When a MediaPlayer object is just created using new or after reset() is called, it is in the Idle state; and after release() is called, it is in the End state. Between these two states is the life cycle of the MediaPlayer object.

を述べています。

+10

はい、release()の後にreset()を呼び出すと、不正な状態例外がスローされます。 –

8

Skylerさんに問題がありました。

あなたは正しいですか?ドキュメンテーションにはmediaPlayer.reset()の無効な状態は示されていませんが、これはドキュメントの最初の不正確さではありません。

私が気づいたのは、VALID状態のリストは「Any」とは言えません。準備と終了の2つを除くすべての特定の状態がリストされます。

MediaPlayerがprepareAsync()を使用して準備状態になっている間に、release()を呼び出すときにIllegalStateExceptionがスローされることはありませんでした。私はそれが起こらないことを保証することはありませんが、私はそれが起こることができませんでした。私は、そのインスタンスで見たことは、次のログメッセージだった:

04-11 11:41:54.740: E/MediaPlayer(4930): error (1, -2147483648) 
04-11 11:41:54.748: E/MediaPlayer(4930): Error (1,-2147483648) 

はい、両方のエラーメッセージが表示され、1つの右の他の後 - 小文字の「エラー」との1と大文字との1「エラー、」しかし、誰例外がスローされます。私はリリース後のリセット()()を呼び出した場合

はしかし、その後、私はエラーを取得する:

04-11 11:45:05.232: E/AndroidRuntime(5046): FATAL EXCEPTION: main 
04-11 11:45:05.232: E/AndroidRuntime(5046): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.helloandroid/com.android.helloandroid.HelloAndroidActivity}: java.lang.RuntimeException: java.lang.IllegalStateException 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1716) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread.access$1500(ActivityThread.java:124) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.os.Looper.loop(Looper.java:123) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread.main(ActivityThread.java:3806) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at dalvik.system.NativeStart.main(Native Method) 
04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.RuntimeException: java.lang.IllegalStateException 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:423) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at com.android.helloandroid.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:87) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  ... 11 more 
04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.IllegalStateException 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.media.MediaPlayer._reset(Native Method) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at android.media.MediaPlayer.reset(MediaPlayer.java:1112) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:421) 
04-11 11:45:05.232: E/AndroidRuntime(5046):  ... 14 more 

だから、現代​​のインクの推測は正しかったです。 MediaPlayer.reset()は、終了状態(release()の呼び出し後に発生)でIllegalStateExceptionをスローします。

私の場合、私はonPause()でrelease()を呼び出していましたが、onResume()でMediaPlayerを再度初期化することは何もできませんでした。したがって、私はreset()を呼び出すと終了状態になりました。あなたはMediaPlayerの=新しいMediaPlayerの()またはmediaPlayer.onCreate()のいずれかの方法で始まる、すべてやり直すのMediaPlayerを作成する必要があることを意味

http://developer.android.com/reference/android/media/MediaPlayer.htmlパー

Once the MediaPlayer object is in the End state, it can no longer be used and there is no way to bring it back to any other state.

。または、release()を呼び出すときには注意してください。

3

明らかにAndroid MediaPlayerのドキュメントは、reset()の無効な状態については正しくありません。

を私のPlayerActivity.javaのコードでは、私は私がactivity私の家にそれを使用できるように、私のMediaPlayerとして静的に設定します:以下は、私はそれを経験したときに起こるものだ

public class PlayerActivity extends Activity { 
.... 

public static MediaPlayer mp; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Mediaplayer 
    if(mp == null) { 
     mp = new MediaPlayer(); 
    } 
    .... 
} 
/** 
* Function to play a song 
* @param songIndex - index of song 
* */ 
public void playSong(int songIndex){ 
    // Play song 
    try { 
     if(mUpdateTimeTask != null) 
      mHandler.removeCallbacks(mUpdateTimeTask); 
     mp.reset(); 
      // the song path is get from internet 
    mp.setDataSource(songsList.get(songIndex).get("songPath")); 
    mp.prepareAsync(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
... 
} 

私の家activityで、私が選手をリリースアプリを閉じる前に:

​​

だから、私は初めてアプリを起動して、曲の再生を開始するとき。 reset()関数はエラーなく正常に実行されます。しかし、私がbuttonのバックを押してアプリケーションを閉じて2回目に起動すると、reset()関数を渡すとIllegalStateExceptionが発生します。

また、デバッグ時に原因を発見しました。アプリを初めて実行すると、プレーヤーはnullであるため、onCreate()関数PlayerActivity.javaで初期化されます。しかし、アプリが終了した後、プレーヤーはnullにリリースされません。したがって、2回目の再開時に再び初期化されることはありません。それはreset()機能を渡すときにIllegalStateExceptionが発生する理由です。したがって、この問題を解決するために、私はアプリを閉じる前にnullにプレーヤーを設定する必要があります。私は別の対象と `MediaPlayer`を混乱されたよう

@Override 
public void onDestroy(){ 
    if(PlayerActivity.mp != null) { 
     PlayerActivity.mp.release(); 
     // Set the MediaPlayer to null to avoid IlLegalStateException 
      // when call mp.reset() after launching the app again 
     PlayerActivity.mp = null; 
    } 

    super.onDestroy(); 

} 
関連する問題