Фоновая музыка Android - PullRequest
       1

Фоновая музыка Android

9 голосов
/ 28 октября 2011

Окей, это моя проблема.У меня есть один класс обслуживания, в котором мне удалось создать медиаплеер для воспроизведения музыки в фоновом режиме.Вот код:

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

Ответы [ 8 ]

25 голосов
/ 28 октября 2011

Если вы хотите воспроизводить фоновую музыку только для своего приложения, то воспроизводите ее в потоке, запущенном из вашего приложения, или используйте класс AsyncTask, чтобы сделать это за вас.

Концепция служб заключается в запуске вфон;Под фоном обычно подразумевается, когда пользовательский интерфейс вашего приложения равен NOT VISIBLE .Правда, его можно использовать так же, как у вас (если вы помните, чтобы остановить его), но это просто неправильно, и он потребляет ресурсы, которые вы не должны использовать.

Если вы хотите выполнять задачи в фоновом режимевашей активности , используйте 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);
}

Это будет работать.

1 голос
/ 29 марта 2016

AsyncTasks хороши только для очень коротких клипов, но если это музыкальный файл, вы столкнетесь с такими проблемами, как:

  • Вы не сможете остановить / приостановить музыку посередине. Для меня это настоящая проблема.

Вот несколько строк со страницы разработчиков Android об AsyncTasks

В идеале AsyncTasks следует использовать для коротких операций (несколько секунд самое большее.) Если вам нужно, чтобы потоки работали в течение длительного времени Настоятельно рекомендуется использовать различные API, предоставляемые пакет java.util.concurrent, такой как Executor, ThreadPoolExecutor и FutureTask.

Так что в настоящее время я ищу другие варианты и обновляю ответ, как только найду решение.

0 голосов
/ 24 апреля 2018

(Kotlin) К сожалению Ответ Джонга у меня не сработал, у меня было несколько ошибок, в том числе: 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
    }
}

Вы можете использовать этот класс в своей Деятельности примерно так:

private var backgroundSound: BackgroundSound? = null

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

override fun onPause() {
    backgroundSound?.cancel(true)
    super.onPause()
}
0 голосов
/ 14 января 2017

Попробуйте вставить player.stop () в метод onDestroy ().Это должно помочь.

0 голосов
/ 31 июля 2014

Попробуйте выполнить следующее, чтобы остановить фоновую музыку, нажав 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 голосов
/ 18 января 2014

впишите ниже код в ваш метод остановки:

система. Выход (0);

это прекратит работу вашего медиаплеера, когда вы нажмете кнопку назад / домой или закроете приложение

0 голосов
/ 20 января 2012

да, вы должны остановить сервис, когда вы нажимаете кнопку домой.В методе переопределения OnPause () {} вы должны остановить музыкальный сервис.А внутри сервиса в методе OnDestroy () вы можете остановить медиаплеер.Поэтому теперь нажатие home вызывает onPause и onPause () -> останавливает службу, и OnDestroy выполняется в службе, а в odestroy () медиаплеер останавливается, и ваша проблема устраняется.

0 голосов
/ 28 октября 2011

Конечно, ваш сервис работает в фоновом режиме, и вы должны вручную остановить его, когда он переходит в фоновый режим.

...