web-dev-qa-db-ja.com

バックグラウンドミュージックAndroid

さて、これは私の問題です。私は、バックグラウンドで音楽を再生するためのメディアプレーヤーを作成することに成功したサービスクラスを1つ持っています。コードは次のとおりです。

package com.test.brzoracunanje;
import Android.app.Service;
import Android.content.Intent;
import Android.media.MediaPlayer;
import Android.os.IBinder;

public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {

    return null;
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
       player = MediaPlayer.create(this, R.raw.test_cbr);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);
        player.start();
}
@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
}

protected void onNewIntent() {
    player.pause();
}
}

しかし、HOMEまたはBACKボタンをクリックすると問題が発生します。それはまだ音楽を再生します。誰かがその問題を解決する方法を知っていますか?

そして、これが私が音楽を演奏したいクラスでこのサービスを呼び出す方法のコードです。

  Intent svc=new Intent(this, BackgroundSoundService.class);
    startService(svc);
9
Zookey

アプリのバックグラウンドミュージックのみを再生する場合は、アプリから起動されたスレッドで再生するか、AsyncTaskクラスを使用して再生します。

サービスの概念は、バックグラウンドで実行することです。背景として、意味は通常、アプリのUIが非表示の場合です。確かに、それはあなたが持っているのと同じように使用できますが(それを停止することを覚えている場合)、それは正しくなく、使用すべきではないリソースを消費します。

activityのバックグラウンドでタスクを実行する場合は、AsyncTaskを使用します。

ちなみに、onStartは非推奨です。サービスを使用する場合は、onStartCommandを実装してください。

更新:

このコードはあなたのために働くと思います。このクラスを追加します(アクティビティクラスに含まれます)。

public class BackgroundSound extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
        player.setLooping(true); // Set looping 
        player.setVolume(1.0f, 1.0f); 
        player.start(); 

        return null;
    }

}

ここで、音楽を制御するために、BackgroundSoundオブジェクトを匿名で作成するのではなく、保存します。アクティビティのフィールドとして宣言します。

BackgroundSound mBackgroundSound = new BackgroundSound();

アクティビティのonResumeメソッドで、次のように開始します。

public void onResume() {
    super.onResume();
    mBackgroundSound.execute(null);
}

そして、アクティビティのonPauseメソッドで、それを停止します。

public void onPause() {
    super.onPause();
    mBackgroundSound.cancel(true);
}

これは機能します。

26
Jong

AsyncTasksは非常に短いクリップにのみ適していますが、音楽ファイルの場合は次のような問題が発生します。

  • 途中で音楽を停止/一時停止することはできません。私にとってそれは本当の問題です。

AsyncTasksに関するAndroid開発者ページからの数行です

AsyncTasksは、理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合は、Java.util.concurrentパッケージによって提供されるさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutorおよびFutureTask。

そのため、現在、他のオプションを検討しており、解決策が見つかったら回答を更新しています。

1
aks

onstopメソッドに以下のコードを記述します。

システム。 exit(0);

これにより、戻る/ホームボタンを押すか、アプリケーションを閉じると、メディアプレーヤーが終了します。

0
user1868091

OnDestroy()メソッドにplayer.stop()を挿入してみてください。それは役立つはずです。

0
drtom

サービスを開始するアクティビティのstopService(svc)メソッドにonDestroy()を挿入してみてください。わたしにはできる。

0
mehdi dorreh

はい、ホームボタンを押したらサービスを停止する必要があります。 OnPause(){}オーバーライドメソッドでは、uは音楽サービスを停止する必要があります。そして、OnDestroy()メソッドのサービス内でメディアプレーヤーを停止してください。そのため、ホームコールを押すとonPauseとonPause()->サービスが停止し、OnDestroyがサービスで実行され、odestroy()でメディアプレーヤーが停止し、問題が修正されます。

0
Srinivas

(Kotlin)悲しいことに Jongの答え 私にはうまくいきませんでした。次のようないくつかのエラーがありました:MediaPlayer finalized without being releasedそして音の停止と開始の遅れ。ですから、他の誰かが同じ問題を抱えている場合に備えて、私が行った方法を投稿します。 BackgroundSoundの実装では、引き続き AsyncTask および MediaPlayer を使用しますが、ネストされていないクラスです。

class BackgroundSound : AsyncTask<Context, Void?, Void?>() {

    override fun doInBackground(vararg params: Context): Void? {
        val player = MediaPlayer.create(params[0], R.raw.msc_background)
        player.isLooping = true
        player.start()

        while (!isCancelled) {
        }

        player.stop()
        player.release()

        return null
    }
}

このクラスは、次のように Activity 内で使用できます。

private var backgroundSound: BackgroundSound? = null

override fun onResume() {
    super.onResume()
    backgroundSound = BackgroundSound()
    backgroundSound!!.execute(this)
}

override fun onPause() {
    backgroundSound?.cancel(true)
    super.onPause()
}
0
Anthony Cannon

HOMEまたはBACKを押してバックグラウンドミュージックを停止するには、以下を試してください。

@Override
protected void onStop() {
    super.onStop();
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> services = activityManager
            .getRunningTasks(Integer.MAX_VALUE);
    boolean isActivityFound = false;

    if (services.get(0).topActivity.getPackageName().toString()
            .equalsIgnoreCase(getPackageName().toString())) {
        isActivityFound = true; // Activity belongs to your app is in foreground.
    }

    if (!isActivityFound) {
        if (player != null && player.isPlaying()) {
            player.release();
        }
    }
}
0
Janak Rajyaguru

確かに、サービスはバックグラウンドで実行され、バックグラウンドに移行したときにアクティビティから手動で停止する必要があります。

0
trashkalmar