バックグラウンドミュージック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);
7
どこに問題があるのか​​はわかりません...いつもバックグラウンドで音楽を演奏したくないですか?
追加された 著者 m0skit0,
アプリケーションを実行している間はいつでも再生したいが、ホームボタンを押しても音楽は再生される。
追加された 著者 Zookey,

8 答え

あなたのアプリケーションのバックグラウンドミュージックを再生したい場合は、あなたのアプリから起動されたスレッドでそれを再生するか、AsyncTaskクラスを使ってそれを行います。

サービスのコンセプトはバックグラウンドで実行することです。バックグラウンドでは、通常、アプリのUIが目に見えないのときの意味です。確かに、あなたが持っているのと同じように使用することができますが(それを止めることを忘れてしまった場合)、それはちょうど正しいことではなく、使用してはいけないリソースを消費します。

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

ところで、 onStart は非推奨です。サービスを使用するときは、 onStartCommand を実装します。

更新:

私はこのコードはあなたのために動作すると思います。このクラスを追加してください(アクティビティクラスに同梱)。

public class BackgroundSound extends AsyncTask {

    @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);
}

これは動作します。

24
追加された
pastebin.com/jzw2j9WR ここには固定されたものがあります。私はそれがうまくいくはずだと思いますが、私はMediaPlayerを一度も使用していませんので、私は理解できません。 MediaPlayerのドキュメントを読むことをお勧めします。 developer.android.com/参照/アンドロイド/メディア/… あなたはあなたが/私は間違っていることを理解することができます。
追加された 著者 Jong,
今はやります...数分で編集がうまくいきません。
追加された 著者 Jong,
ペーストビンに完全なソースコードを投稿してみましょう。
追加された 著者 Jong,
アクティビティクラスで、サウンドを再生したい場所。それは内部クラスでなければなりません。 「YourActivity」(コード内)をアクティビティ名に変更してください。
追加された 著者 Jong,
私はコードで編集します。
追加された 著者 Jong,
onResumeから同じアクティビティを開始した場合、無限ループが発生します。コードを修正しました。そして、あなたは本当に developer.android.com/guide/topics/fundamentals/activitiesを読むべきです。 .h‌ tml
追加された 著者 Jong,
mBackgroundSoundがアクティビティクラスのフィールドとして宣言されていることを確認してください。
追加された 著者 Jong,
本当に、私はActivity.onPauseとonResumeを呼び出すことを忘れていました。しかし、来てください...これは基本的なものです。あなたが音楽を演奏しているときには、アクティビティのドキュメントを読むべきです... ...それを修正しました。
追加された 著者 Jong,
ここではその活動の完全なコードです: pastebin.com/nzU674FZ
追加された 著者 Zookey,
私はそれを固定し、それを実行するが、それでも同じくそ、私はホームボタンの音楽を押してもまだ再生する。私はこれについて夢中になるだろう。
追加された 著者 Zookey,
メソッドAsyncTask のonResume()メソッドは未定義です。
追加された 著者 Zookey,
私はonPauseとonResunmeの下でstartActivityを使ってアクティビティを呼び出そうとしましたが、それはうまく動作しません。うん、私はthats財政的に知っているが、私は初心者です。
追加された 著者 Zookey,
今、私はこのエラーが10-28 17:52:17.733:ERROR/AndroidRuntime(225):java.lang.RuntimeException:{com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi‌ ty}アクティビティを再開できません: android.app.SuperNotCalledException:アクティビティ{com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi‌ ty}がsuper.onResume()をコールしなかった
追加された 著者 Zookey,
mBackgroundSoundは、アクティビティクラスの下にonResumeメソッドとonPauseメソッドを置いたときに解決できないと言います。
追加された 著者 Zookey,
ありがとう、私はあなたの答えを受け入れるだろう。 :)
追加された 著者 Zookey,
私はそれをテストした。アプリを起動すると音が鳴りますが、HOMEボタンを押してもアプリが閉じている間も音楽を再生するのは問題ですか?
追加された 著者 Zookey,
ただ一つの質問。私は新しいクラスのBackgroundSoundを作る必要がありますか?またはこれをBackgroundSoundServiceクラスの下に置くか、これをメインアクティビティクラスの中に入れますか?
追加された 著者 Zookey,
あなたが言ったことをする私のコードを修正できますか?
追加された 著者 Zookey,
私は、アプリ全体で音楽を実行したい。アプリケーションクラスで始めましょうか?
追加された 著者 Prashanth Debbadwar,
@慎重にonCancelledはキャンセルとすぐに呼び出すことはできません。おそらく、player.stop()とplayer.release()をonCancelledメソッドに入れる代わりに、作成したクラスのメソッドを作成する必要があります。そして、キャンセルする前にそのメソッドを呼び出します。
追加された 著者 jmacedo,

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

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

AsyncTasksに関するAndroidデベロッパーのページからの数行はここにあります

AsyncTasksは、短い操作(数秒   せいぜい)スレッドの長時間実行を維持する必要がある場合は、   あなたが提供するさまざまなAPIを使用することを強くお勧めします。   Executor、ThreadPoolExecutorなどのjava.util.concurrentパッケージ   とFutureTask。

だから私は解決策を見つけると、現在私は他のオプションを探して答えを更新しています。

1
追加された

次のいずれかを試して、HOMEまたはBACKのバックグラウンドミュージックを停止してください。

@Override
protected void onStop() {
    super.onStop();
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List 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
追加された

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

0
追加された
それを手動で停止する方法は?
追加された 著者 Zookey,

(Kotlin)悲しいことに、ジョンの答えがうまくいかず、私はいくつかのエラーがありました。 MediaPlayerはリリースされると、サウンドの停止と開始の遅れがあります。だから私は誰か他の人が同じ問題を抱えている場合に備えて、私がやったやり方を投稿します。私の BackgroundSound の実装でも AsyncTask が使用されています MediaPlayer ただし、ネストされていないクラスです。

class BackgroundSound : AsyncTask

このクラスはアクティビティの中で以下のように使用できます:

private var backgroundSound: BackgroundSound? = null

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

override fun onPause() {
    backgroundSound?.cancel(true)
    super.onPause()
}
0
追加された

あなたの停止方法でコードの下に書く:

システム。出口(0);

このボタンを押すと、メディアプレーヤーが終了します。

0
追加された

yes, u should stop the service when u press the home button . In OnPause(){} override method u should stop the music service. And inside the service in OnDestroy() method u please stop the media player. So now,pressing home calls onPause and onPause() -> stops the service and OnDestroy is executed in service and in odestroy() the mediaplayer is stopped and ur problem is fixed.

0
追加された

onDestroy()メソッドでplayer.stop()を挿入してみてください。それは助けになるはずです。

0
追加された