0

メディア プレーヤー アプリを作成しています。

アプリケーションを開始または再開するときに、メディア プレーヤーが既に曲を再生しているかどうかを確認したいと考えています。

だった場合は Pause/PlayToggleButtonPauseに設定し、それ以外の場合は以前に再生していなかった場合、ボタンはPlayに設定されます。

(たとえば、ユーザーが既にメディア プレーヤーを使用していて、ホームまたは戻るボタンを押してアプリを終了し、プレーヤーを再開した場合、ボタンは正しく構成する必要があります。)

実際の MediaPlayer オブジェクトは Service に実装され、すべての通信はAIDL interfaceメソッドを介して行われます。

たった今、

  1. 実行中のすべてのサービスをチェックし、自分も実行されているかどうかをチェックする をonResume呼び出しています。AsynTask methodMusicService
  2. はいの場合、真かaidl methodどうかを確認 するためにを呼び出しています。mediaPlayer.isPlaying()
  3. はいの場合はtoggleButton一時停止 (つまり、現在再生中) に設定され、それ以外の場合は再生されます。

問題: これによりAsyncTask、競合状態が発生しています。つまり、意図したとおりに実行されることもあれば、エラーがスローされることもあります

コード:

// In onResume
protected void onResume() {
    new PlayerStatusCheck().execute();
}

//AsyncTask Class
class PlayerStatusCheck extends AsyncTask {
    boolean isServiceAvailable;
    private boolean isMyServiceRunning() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager
                .getRunningServices(Integer.MAX_VALUE)) {
            if (com.example.playingworking.MusicService.class.getName()
                    .equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

    @Override
    protected Object doInBackground(Object... params) {
        isServiceAvailable = isMyServiceRunning();
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        try {
            if (!isServiceAvailable) {
                doInBackground(null);
            } else {
                if (aidlObject.isMediaPlaying()) {
                    tbPlayPause.setChecked(true);
                } else {
                    tbPlayPause.setChecked(false);
                }
            }
        } catch (RemoteException e) {
            Toast.makeText(MainActivity.this,
                    "MainActivity onPostExecute: " + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
    }
}

コード内 MusicService :

//In IBinder onBind()
public boolean isMediaPlaying(){
    if(mediaPlayer.isPlaying()){
        return true;
    }
    return false;
}

提案してください...ありがとう

4

0 に答える 0