Фонова музика Android

Окей, це моя проблема. У мене є один клас обслуговування, де Ive вдалося створити медіа-плеєр для відтворення музики у фоновому режимі весь час. Ось код:

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, щоб зробити це для вас.

Концепція сервісів полягає в тому, щоб працювати у фоновому режимі; У фоновому режимі значення має значення, коли користувальницький інтерфейс програми НЕВИЗНИЙ . Правда, його можна використовувати так само, як у вас є (якщо ви пам'ятаєте, що це зупиняєш), але це просто не правильно, і він споживає ресурси, які ви не повинні використовувати.

Якщо ви хочете виконати завдання на фоні вашої активності , використовуйте AsyncTask.

До речі, onStart не підтримується. Коли ви користуєтесь службами, застосуйте onStartCommand .

UPDATE:

Я думаю, що цей код буде працювати для вас. Додайте цей клас (додано у ваш клас активності).

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/ reference/android/media/& hellip; , щоб ви могли зрозуміти, що ви/я роблю неправильно.
додано Автор Jong, джерело
Зробіть зараз .. Невдало редагувати через кілька хвилин.
додано Автор Jong, джерело
Опублікуйте повний вихідний код в пастбіні і дайте мені побачити.
додано Автор Jong, джерело
У класі активності, де ви хочете грати звуки. Це має бути внутрішній клас. Не забудьте змінити "YourActivity" (у коді) на назву своєї діяльності.
додано Автор Jong, джерело
Я буду редагувати за допомогою коду.
додано Автор Jong, джерело
Якщо ви розпочали ту саму активність з itsResume, це призведе до нескінченного циклу. Виправлено код. І ви дійсно повинні прочитати developer.android.com/guide/topics/fundamentals/activities .h & zwnj; tml
додано Автор Jong, джерело
Переконайтеся, що ви оголосили mBackgroundSound як поле у ​​вашому класі активності.
додано Автор Jong, джерело
Правда, я забув називати Activity.onPause і onResume. Але давай ... це фундаментально, до того часу, коли ви граєте музику, ви повинні прочитати документ "Діяльність" ... Виправлено це.
додано Автор Jong, джерело
Ось повний код цієї діяльності: pastebin.com/nzU674FZ
додано Автор Zookey, джерело
Я виправив його, і запустив його, але все ж таки дерьмо, коли я натискаю клавішу HOME, музика кнопки все ще грає. Я з тобою зійду з розуму.
додано Автор Zookey, джерело
Метод onResume() не визначено для типу AsyncTask
додано Автор Zookey, джерело
Я намагався викликати активність з startActivity під onPause і onResunme, але це не працює. Так, я знаю, що це fundemental, але я новачок.
додано Автор Zookey, джерело
Тепер я отримую цю помилку 10-28 17: 52: 17.733: ERROR/AndroidRuntime (225): java.lang.RuntimeException: Не вдається відновити активність {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi & zwnj; ty}: android.app.SuperNotCalledException: Діяльність {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi & zwnj; ty} не викликала до super.onResume ()
додано Автор Zookey, джерело
Вона говорить, що mBackgroundSound не може бути вирішено, коли я кладу метод onPresume і onPause під класом активності.
додано Автор Zookey, джерело
Дякую, тоді я прийму вашу відповідь. :)
додано Автор Zookey, джерело
Я перевіряю це. Він звучить, коли я запускаю додаток, але проблема полягає в тому, що коли я натискаю кнопку "ДОМАШНЄ", вона продовжує відтворювати музику, коли програма закрита
додано Автор Zookey, джерело
Тільки одне питання. Мені потрібно зробити новий клас BackgroundSound? або поставити це під клас BackgroundSoundService або помістити це всередині мого основного класу активності?
додано Автор Zookey, джерело
Ви можете виправити мій код, який робить те, що ви сказали?
додано Автор Zookey, джерело
Я хочу керувати музикою у всьому додатку. Чи повинен я почати в класі додатків?
додано Автор Prashanth Debbadwar, джерело
@ Чон бути обережним onCancelled може не бути викликаний відразу з скасуванням. Вам, мабуть, доведеться створити метод у створеному класі для виконання player.stop() і player.release() замість того, щоб вставити їх в метод onCancelled. І тоді ви зателефонуєте цьому методу до скасування.
додано Автор jmacedo, джерело

AsyncTasks корисні лише для дуже коротких кліпів, але якщо це музичний файл, ви будете стикатися з такими проблемами:

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

Ось декілька рядків з сторінки розробників Android про AsyncTasks

AsyncTasks в ідеалі слід використовувати для коротких операцій (кілька секунд   принаймні.) Якщо вам потрібно тримати потоки, що працюють протягом тривалого періоду часу   час, дуже рекомендується використовувати різні API, надані   java.util.concurrent пакунок, таких як Executor, ThreadPoolExecutor   і 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, джерело

(Котлін) На жаль, відповідь Джонга не спрацювала для мене, у мене були кілька помилок, включаючи: 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
додано

Спробуйте вставити player.stop() в метод onDestroy (). Це має допомогти.

0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.