2

私がやりたいことは、サービスを介してアプリのバックグラウンド ミュージックを制御するだけで、あらゆるアクティビティからアプリを開始および停止できるようになります。

サービスが開始されて破棄されたときに Toast に通知すると、すべてが完全にセットアップされますが、代わりにメディア再生をそこに入れるとすぐに、正常に開始され、音楽の再生が開始されますが、ボタンをクリックするとすぐにサービスを停止すると、エラーが発生して強制的に終了します。

誰かが私が間違っていることを提案できますか?

これが私のコードです:

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {

private MediaPlayer player;

@Override    
public IBinder onBind(Intent intent) {
returnnull;
}

@Override    
publicvoid onCreate() { 
super.onCreate(); 
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
MediaPlayer player = MediaPlayer.create(MyService.this, R.raw.oceanwavestest);
player.start();
player.setLooping(true);

}

   @Override    
   publicvoid onDestroy() {
   super.onDestroy();
   player.stop();
   Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();
   } 
} 
4

1 に答える 1

0

あなたのコードには、私があなたの立場にあった場合にチェックアウトするいくつかのことがあります。

  • onDestroy のメンバー MediaPlayer オブジェクト「プレーヤー」で「停止」を呼び出そうとしていますが、onCreate で、コード行で MediaPlayer オブジェクト「プレーヤー」を作成します

"MediaPlayer プレーヤー = MediaPlayer.create(MyService.this, R.raw.oceanwavestest);"

関数の外側のスコープを失うプレーヤーオブジェクトを作成すると私は信じています。

このコードの 1 行の修正は、「player = MediaPlayer.create(MyService.this, R.raw.oceanwavestest);」を使用することです。この方法では、ローカル変数ではなくメンバー変数が使用されます。

これが私のコードである場合、メンバー変数を m_player や mPlayer などの名前に変更して、コード内のメンバー変数であることを認識できるようにします。

  • (おそらくタイプミス) "returnnull;" onBind では「return null;」にする必要があります。

  • 電話してみるのもいいかもしれません

player.stop(); Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();

super.onDestroy() を呼び出す前に

これがまったく役立つかどうか教えてください

于 2010-02-20T05:08:41.763 に答える