0

プロジェクト用のシンプルな mp3 プレーヤー アプリを作成しようとしていますが、メイン アクティビティからサービスにアクセスできません。アクティビティに onclicklisteners がいくつかあります。

play.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 0);
            startService(intent);               
        }
    });

    pause.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 1);
            startService(intent);
        }
    });

    stop.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PlayService.class);
            intent.putExtra("key", 2);              
        }
    });

onclicks に応答する私のサービスの switch ステートメント:

@Override
public int onStartCommand(Intent intent, int flags, int startId){

    int key = intent.getIntExtra("key", 1);
    MediaPlayer mMediaPlayer = new MediaPlayer();

    FileInputStream fileStream = null;
    try {
        fileStream = new FileInputStream("/sdcard/Download/Bob_Marley-Jammin.mp3");
    }
    catch (FileNotFoundException e1) {
            e1.printStackTrace();
    }

    switch (key) {
    case 0: //Play
        if (mMediaPlayer.isPlaying()){
            break;
        }
        else
            try {
                mMediaPlayer.setDataSource(fileStream.getFD());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                mMediaPlayer.prepare();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mMediaPlayer.start();
        break;
    case 1: //Pause
            mMediaPlayer.pause();
        break;
    case 2: //Stop
        if(mMediaPlayer.isPlaying()){
            mMediaPlayer.pause();
            mMediaPlayer.seekTo(0);
        }
        break;
    default:
        break;
    }   

    return Service.START_NOT_STICKY;
}

何らかの理由で再生呼び出しは機能しますが、一時停止呼び出しと停止呼び出しは効果がありません。これは、サービスを呼び出すたびに新しい MediaPlayer 参照を作成しているためだと思います。(これを修正する方法がわかりません)

そのため、シングルトン クラスにしてアクティビティからアクセスすることでサービスにアクセスしやすくなると聞きましたが、それを実装する方法がわかりません。私のコードに基づいたヒントはありますか?

4

2 に答える 2

0

再生ボタンの startService は、サービスを開始します。次にボタンをクリックするたびに、サービスを再度開始しようとしますが、効果はありません。停止と一時停止を機能させるには、サービスにバインドし、アクティビティとサービスの間の通信をセットアップする必要があります。通話にも「再生」を入れてください。アクティビティとサービス間の通信がどのように機能するかについての優れたドキュメントがここにあります: http://developer.android.com/reference/android/app/Service.html

于 2012-06-13T02:15:21.177 に答える
0

Service を初期化 (コンストラクターを使用するか、getInstance メソッドを呼び出す) できないため、シングルトン クラスを使用できません。
解決策は、アクティビティとサービスの間で通信できることです。例 : Messaging Look ローカル サービス サンプルを使用したアクティビティとサービス間の通信
Android ドキュメント: http://developer.android.com/reference/android/app/Service.html

于 2012-06-13T02:22:18.383 に答える