0

メディア プレーヤーを含むアクティビティを作成しました。アクティビティを開始すると、音楽の再生が開始されます。しかし、曲が完了し、エミュレータの戻るボタンをクリックすると、( IllegellStateException) のエラーが表示されます。

これが私のコードです。

ありがとうございます。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.audio);
    init();
    imgVw.setImageResource(R.raw.teddy_two);

    prefs = PreferenceManager.getDefaultSharedPreferences(this);

    mp=MediaPlayer.create(Audio_Activity.this,R.raw.ennamo_yadho);
    Log.e("Song is playing","in  Mediya Player ");
    Log.e("Current ","Position -> " + length);
    mp.setLooping(false);
    mp.start();
    btnChapter.setEnabled(false);

    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
    {
        @Override
        public void onCompletion(MediaPlayer mp) 
        {
            // TODO Auto-generated method stub
            mp.stop();
            mp.release();
            btnChapter.setEnabled(true);
            System.out.println("Music is over and Button is enable !!!!!!");
        }
    });

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onPause()
    {
        super.onStop();
        SharedPreferences. Editor prefsEdit = prefs.edit();

        int position = mp.getCurrentPosition();
        prefsEdit.putInt("mediaPosition", position);
        prefsEdit.commit();
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
        System.out.println("Activity is Resume !!!");
        int position = prefs.getInt("mediaPosition", 0);
        mp.seekTo(position);
        mp.start();
    }

    #Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) 
        { 
            if(mp!= null)
            {
                mp.pause();
            }
            //finish();
         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

}

4

6 に答える 6

4

Activityクラスで使用finish();してActivityを停止し、戻ります

于 2013-07-09T12:23:25.860 に答える
1

これを試して

MediaPlayer player;


public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "service started", 100).show();
    if(player.isPlaying())
        player.stop();

    else
        player.start();
    return super.onStartCommand(intent, flags, startId);}
于 2013-07-09T12:28:36.750 に答える
0
if(mp!= null)
{

   mp.pause();
}

内部の上記のコード スニペットif ((keyCode == KeyEvent.KEYCODE_BACK))が問題のようです。プレイヤーがプレイしているかどうかを確認する必要があります。再生中の場合は、一時停止のみを呼び出す必要があります。

于 2013-07-09T12:19:17.143 に答える
0

問題はここにあると思います:

@Override
public void onPause()
{
   super.onPause();//should be onPause and not onStop

   SharedPreferences. Editor prefsEdit = prefs.edit();

   int position = mp.getCurrentPosition();
   prefsEdit.putInt("mediaPosition", position);
   prefsEdit.commit();
}

詳細については、こちらをご覧ください

于 2013-07-09T12:19:25.397 に答える
0

onPause()で(IllegelStateException)を取得します。

この問題を解決するには、

mp = null;

後、

mp.stop();
mp.release();

mp!=nullをチェックすると、その時点で MediaPlayer は既にリリースされていますが、 nullはリリースされていないためです。したがって、状態が正しく、mp.pause()に移動してもmpが既にリリースされている場合は、エラーが発生します。

また、 onCompletion()でMediaPlayerインスタンスの名前を変更する必要があります。

public void onCompletion(MediaPlayer mp)

stop()release()に onCompletion() のmpを使用するためです。したがって、mpother(like: mp1)に変更します。

これが役に立つことを確認してください。

于 2013-07-09T12:51:22.557 に答える
0

下書きメモの内容を永続ストレージに保存する onStop() の実装を次に示します。

@Override

protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}

このonPause()メソッドは の前に呼び出されますが、データベースへの情報の書き込みなど、大規模で CPU を集中的に使用するシャットダウン操作を実行するにonStop()は、 を使用する必要があります。onStop()

Android 開発者ページから: http://developer.android.com/training/basics/activity-lifecycle/stopping.html

于 2013-07-09T12:21:06.967 に答える