Fon musiqasi Android

OK, bu mening muammom. Menda bir xizmat ko'rsatish klassi bor, u erda men doimo fonda musiqani ijro etish uchun media pleer yaratishga muvaffaq bo'ldim. Bu erda kod:

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

Ammo HOME yoki BACK tugmasini bosganimda menda muammo bor. U hali ham musiqa ijro etmoqda. Bu muammoni qanday hal qilishni kim biladi?

Va bu erda men ushbu xizmatni sinfda sinashni istagan joyda sinashni kodi;

  Intent svc=new Intent(this, BackgroundSoundService.class);
    startService(svc);
7
Muammo qaerda ekanini ko'rmayapman ... fonda musiqani har doim ham eshitishni xohlamadingizmi?
qo'shib qo'ydi muallif m0skit0, manba
Ilova ishlayotgan vaqtda uni doimo ijro etmoqchiman, lekin men Uyga bosganimda, musiqa hali ham o'ynaydi.
qo'shib qo'ydi muallif Zookey, manba

8 javoblar

Agar siz faqat ilovangiz uchun orqa fon musiqasini o'ynashni xohlasangiz, uni o'zingizning ilovangizdan ishga tushirilgan va AsyncTask klassidan foydalanishingiz mumkin.

Xizmat konsepsiyasi fonda ishlash; Orqa fonda, sizning ilova UI sizning NOT VISIBLE bo'lsa, odatda ma'no bo'ladi. To'g'ri, u siz kabi (agar uni to'xtatishni eslayotgan bo'lsangiz), lekin faqatgina noto'g'ri ishlatilsa va u siz foydalanmasligingiz kerak bo'lgan resurslarni iste'mol qilsa.

tadbiringiz fonida vazifalarni bajarish uchun bo'lsangiz, AsyncTask dan foydalaning.

Aytgancha, onStart funksiyasi eskirgan. Xizmatlardan foydalanganda onStartCommand dasturini ishga tushiring.

UPDATE:

Menimcha, bu kod siz uchun ishlaydi. Ushbu klassni qo'shing (Faoliyat sinfida joylashgan).

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

}

Endi, musiqani nazorat qilish uchun, siz allaqachon o'zingizning fon yaratishingiz o'rniga BackgroundSound obyektini saqlang. Faoliyatingizdagi maydon sifatida buni e'lon qiling:

BackgroundSound mBackgroundSound = new BackgroundSound();

Faoliyatingizning OnResume usulida, uni boshlang:

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

Sizning harakatingizdagi "Puse" usulida to'xtating:

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

Bu ishlaydi.

24
qo'shib qo'ydi
pastebin.com/jzw2j9WR Bu erda sobit bo'lgan. O'ylaymanki, bu ishlashi kerak, lekin men hech qachon MediaPlayerdan foydalanmaganman. MediaPlayer hujjatlarini developer.android.com/ saytini o'qishingizni tavsiya qilaman/Malumot/android/media/& hellip; siz nima qilayotganingizni tushunaman.
qo'shib qo'ydi muallif Jong, manba
Endi qilaman .. Bir necha daqiqada tahrir qilaman.
qo'shib qo'ydi muallif Jong, manba
To'liq manba kodini pastelga joylashtiring va menga xabar bering.
qo'shib qo'ydi muallif Jong, manba
Tinglovchilarni tinglashni istagan joyingizdagi faoliyatingiz sinfida. Bu ichki sinf bo'lishi kerak. "YourActivity" ni (kodda) o'zingizning faoliyat nomingizga o'zgartirishni unutmang.
qo'shib qo'ydi muallif Jong, manba
Kod bilan tahrir qilaman.
qo'shib qo'ydi muallif Jong, manba
Agar siz ham xuddi shu ishni onResume'dan boshlagan bo'lsangiz, unda cheksiz pastadir paydo bo'ladi. Kodni tuzatdi. Va, albatta, developer.android.com/guide/topics/fundamentals/activities"> o'qishingiz kerak. .h & zmlj; tml
qo'shib qo'ydi muallif Jong, manba
MBackgroundSound-ni sizning faoliyatingiz sinfidagi maydon sifatida e'lon qilganingizga ishonch hosil qiling.
qo'shib qo'ydi muallif Jong, manba
Haqiqatan ham, Activity.onPause va onResume deb nom berishni unutgan edim. Lekin keling ... bu juda muhim, chunki siz musiqani o'ynab turgan vaqtingizda "Faoliyat hujjatlari" ni o'qib chiqdingiz ... Ruxsat etilgan.
qo'shib qo'ydi muallif Jong, manba
Bu erda ushbu faoliyatning to'liq kodi: pastebin.com/nzU674FZ
qo'shib qo'ydi muallif Zookey, manba
Men uni o'rnatdim va uni ishga tushirdim, lekin men yana bir xil narsalarni boshladim. Men bu haqda aqldan ozmayman.
qo'shib qo'ydi muallif Zookey, manba
Resume() usuli AsyncTask
qo'shib qo'ydi muallif Zookey, manba
Men startActivity bilan onPause va onResunme ostida ishlashni taklif qildim, lekin u ishlamayapti. Ha, men buning asosini bilaman, lekin men yangi odamman.
qo'shib qo'ydi muallif Zookey, manba
Endi men bu xatoni qabul qilaman 10-28 17: 52: 17.733: ERROR/AndroidRuntime (225): java.lang.RuntimeException: faoliyatni qayta tiklash mumkin emas {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi & zwnj; ty}: android.app.SuperNotCalledException: Faoliyat {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivi & zwnj; ty} super.onResume orqali qo'ng'iroq qilmadi ()
qo'shib qo'ydi muallif Zookey, manba
MBackgroundSound, faoliyat registri bo'yicha "OnResume" va "OnPause" usullarini qo'yganimda echim topilmaydi.
qo'shib qo'ydi muallif Zookey, manba
Rahmatim sizning javobingizni qabul qilaman. :)
qo'shib qo'ydi muallif Zookey, manba
Men buni sinovdan o'tkazdim. Ilovani ishga tushirganimda tovushlar eshitiladi, lekin men HOME tugmasi bosilganda muammo hali ham dastur yopiq bo'lsa musiqa ijro etadimi?
qo'shib qo'ydi muallif Zookey, manba
Faqat bitta savol. BackgroundSound yangi klassini yaratish kerakmi? yoki buni BackgroundSoundService sinfiga qo'ying yoki buni mening asosiy faoliyat sinfimga qo'ying?
qo'shib qo'ydi muallif Zookey, manba
Siz aytgan so'zlarni bajaradigan kodimni tuzatasizmi?
qo'shib qo'ydi muallif Zookey, manba
Men ilovani musiqa orqali ijro etishni xohlayman. Ilova sinfida boshlaymanmi?
qo'shib qo'ydi muallif Prashanth Debbadwar, manba
@Jong ehtiyot bo'ling. Bekor qilish bekor qilinishi bilan darhol chaqirilmasligi mumkin. Yaratilgan klassdagi player.stop() va player.release() funktsiyalarini onCancelled usuliga qo'yish uchun qilish kerak. Va keyin, u bekor qilishdan avval bu usulni chaqiradi.
qo'shib qo'ydi muallif jmacedo, manba

AsyncTasks faqat juda qisqa kliplar uchun yaxshi, lekin agar u musiqa fayli bo'lsa, quyidagi muammolar bilan duch kelasiz:

  • Musiqani to'xtatib/to'xtatib turolmaysiz. Men uchun bu haqiqiy muammo.

AsyncTasks haqida Android ishlab chiquvchilari sahifasidan ozgina satr

AsyncTasks qisqa muddatli operatsiyalar (odatda bir necha soniya) uchun ishlatilishi kerak   eng ko'p). Agar siz uzoq vaqt davomida ishlaydigan narsalarni ushlab turishingiz kerak bo'lsa   vaqti bilan taqdim etilgan turli API-lardan foydalanish tavsiya etiladi   Ijrochi, ThreadPoolExecutor kabi java.util.concurrent paket   va FutureTask.

Shunday qilib, hozir men boshqa variantlarga murojaat qilmoqdaman va echimni topgandan keyin javobni yangilamoqdaman.

1
qo'shib qo'ydi

Orqa fon musiqasini to'xtatish uchun quyidagi amallarni bajaring: HOME yoki Back tugmasini bosing.

@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
qo'shib qo'ydi

Albatta, sizning xizmatingiz fonda ishlaydi va siz fonga kirganda o'zingizning faoliyatingizdan uni qo'l bilan to'xtatishingiz kerak.

0
qo'shib qo'ydi
Qo'lni qanday to'xtatish kerak?
qo'shib qo'ydi muallif Zookey, manba

(Kotlin) Afsuski Jongning javoblari men uchun ishlamadi, menda bir nechta xatolar bor edi: MediaPlayer va ovozni to'xtatish va ishga tushirishda kechikish mavjud. Shunday qilib, agar men boshqa birov bilan bir xil muammoga duch kelsam, uni qilganimga yo'l qo'yaman. BackgroundSound ilovasini hali ham AsyncTask dan foydalanadi. va MediaPlayer ni qo'shishingiz mumkin, biroq u ichki bo'lmagan sinfdir.

class BackgroundSound : AsyncTask

Siz ushbu klassni Faoliyatidan tashqari"> Faoliyatingiz ichida foydalanishingiz mumkin:

private var backgroundSound: BackgroundSound? = null

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

override fun onPause() {
    backgroundSound?.cancel(true)
    super.onPause()
}
0
qo'shib qo'ydi

Quyidagi kodni sizni to'xtash usulida yozing:

tizimi. chiqish (0);

Bu sizning uyali tugmachani bosib yoki yopib qo'yish paytida media pleyeringizni o'chirib qo'yadi

0
qo'shib qo'ydi

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
qo'shib qo'ydi

OnDestroy() usulida player.stop() ilovasini qo'shishga harakat qiling. Bu yordam berishi kerak.

0
qo'shib qo'ydi