背景音乐 Android

10

好的,这是我的问题。我有一个服务类,在其中我已经成功创建了媒体播放器,以在后台播放音乐。下面是代码:

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

我不知道问题出在哪里...难道你不是想一直在后台播放音乐吗? - m0skit0
我想在应用程序运行时始终播放它,但当我按下主页按钮时,音乐仍然会继续播放。 - Zookey
9个回答

26
如果您想为您的应用程序播放背景音乐,那么请在从您的应用程序启动的线程中播放它/使用AsyncTask类为您完成它。
服务的概念是在后台运行;在这里,“后台”通常意味着您的应用程序UI不可见。虽然可以像您现在所做的一样使用服务(如果您记得停止它),但这并不正确,并且会消耗您不应该使用的资源。
如果您想在活动的后台执行任务,请使用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();

在您的 Activity 的 onResume 方法中启动它:

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

在您的Activity的onPause方法中停止它:

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

这会起作用。


只有一个问题。我需要创建新的BackgroundSound类吗?还是将其放在BackgroundSoundService类下,或者将其放在我的主活动类中? - Zookey
1
在您的活动类中,您想播放声音的位置必须是内部类。请记得将代码中的“YourActivity”更改为您的活动名称。 - Jong
4
我已经测试过了。当我启动应用时它会播放声音,但问题是当我按下HOME键关闭应用后,它仍然播放音乐。 - Zookey
现在我遇到了这个错误 10-28 17:52:17.733: ERROR/AndroidRuntime(225): java.lang.RuntimeException: Unable to resume activity {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivity}: android.app.SuperNotCalledException: Activity {com.test.brzoracunanje/com.test.brzoracunanje.PocetnaActivity} did not call through to super.onResume() - Zookey
我想在整个应用程序中播放音乐。 我应该从Application类开始吗? - Prashanth Debbadwar
显示剩余9条评论

2
AsyncTasks只适用于非常短的片段,但如果是音乐文件,则会遇到以下问题:
- 无法在中途停止/暂停音乐。对我来说这是一个真正的问题。
以下是Android开发人员页面上有关AsyncTasks的几行内容:
AsyncTasks理想情况下应该用于短时间操作(最多几秒钟)。如果您需要长时间运行线程,强烈建议使用java.util.concurrent包提供的各种API,例如Executor、ThreadPoolExecutor和FutureTask。
因此,目前我正在寻找其他选择,并在找到解决方案后更新答案。

0

(Kotlin) 不幸的是Jong's answer对我没有用,我遇到了一些错误,包括:MediaPlayer finalized without being released和停止和开始声音时的延迟。所以我会把我自己的方法发布出来,以防其他人也遇到同样的问题。我的BackgroundSound实现仍然使用AsyncTaskMediaPlayer,但它是一个非嵌套类。

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

尝试以下方法,在按下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
尝试在onDestroy()方法中插入player.stop()。这应该会有所帮助。

0
尝试在启动服务的活动的onDestroy()方法中插入stopService(svc)。这对我有效。

0
在你的onStop方法中写下以下代码:
system.exit(0);
当你按下返回/主页按钮或关闭应用程序时,这将终止你的媒体播放器。

0

是的,当您按下主页按钮时,应停止服务。 在 OnPause(){} 重写方法中,您应该停止音乐服务。 并且在服务内部,在 OnDestroy() 方法中,请停止媒体播放器。 现在,按下主页调用 onPause(),onPause() 停止服务,在服务中执行 OnDestroy(),在 odestroy() 中停止 mediaplayer,您的问题就解决了。


0

没问题,你的服务在后台运行,当它进入后台时,你需要从你的活动中手动停止它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接