37

我正在开发一个 android 的娱乐应用程序。我想播放背景音乐,我想为此使用服务。应用程序有 3 个活动,必须在所有活动中播放音乐。此外,当活动暂停时,音乐必须暂停并在销毁时停止。谁能告诉我该怎么做?任何链接或示例?

谢谢你。

4

7 回答 7

68

做没有服务

https://web.archive.org/web/20181116173307/http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

如果您对使用媒体播放器的服务非常认真

Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc);

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.idil);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);

    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TO DO
    }
    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {
        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}

请在 Manifest 中调用此服务 确保 .BackgroundSoundService 字符串末尾没有空格

<service android:enabled="true" android:name=".BackgroundSoundService" />
于 2011-11-21T09:57:37.273 回答
17

在这里聚会太晚了,但我还是要加我的 0.02 美元,谷歌发布了一个名为通用音乐播放器的免费示例,您可以使用它学习在它使用的所有 android 平台(汽车、手表、手机、电视 ..)上流式传输音乐在后台播放音乐的服务,检查一下非常有帮助。这是项目的链接
https://github.com/googlesamples/android-UniversalMusicPlayer

于 2016-09-17T08:12:06.263 回答
9

@Synxmax 的答案在使用 aServiceMediaPlayer类时是正确的,但是您还需要Service在 Manifest 中声明它才能工作,如下所示:

<service
    android:enabled="true"
    android:name="com.package.name.BackgroundSoundService" />
于 2016-03-27T19:27:01.387 回答
6

我运行它时遇到问题,我做了一些更改以使用 mp3 源运行它。这是BackfrounSoundService.java文件。考虑到我的 mp3 文件在我手机的 sdcard 中。

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;

    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("service", "onCreate");
        player = new MediaPlayer();
        try {
            player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/your file.mp3");
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.setLooping(true); // Set looping
        player.setVolume(100, 100);

    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("service", "onStartCommand");
        try {
            player.prepare();
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TO DO
    }

    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }

    public void onPause() {

    }

    @Override
    public void onDestroy() {
        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}
于 2015-09-22T10:16:44.327 回答
4

在HelloAndroid上有关于这个主题的优秀教程。事实上,这是我在谷歌上获得的第一个打击。您应该在此处询问之前尝试使用谷歌搜索,因为这是一种很好的做法。

于 2011-11-21T09:48:08.180 回答
4

START_STICKY使用标志创建前台服务。

@Override
public int onStartCommand(Intent startIntent, int flags, int startId) {
   if (startIntent != null) {
       String action = startIntent.getAction();
       String command = startIntent.getStringExtra(CMD_NAME);
       if (ACTION_CMD.equals(action)) {
           if (CMD_PAUSE.equals(command)) {
               if (mPlayback != null && mPlayback.isPlaying()) {
                   handlePauseRequest();
               }
           } else if (CMD_PLAY.equals(command)) {
               ArrayList<Track> queue = new ArrayList<>();
               for (Parcelable input : startIntent.getParcelableArrayListExtra(ARG_QUEUE)) {
                   queue.add((Track) Parcels.unwrap(input));
               }
               int index = startIntent.getIntExtra(ARG_INDEX, 0);
               playWithQueue(queue, index);
           }
       }
   }

   return START_STICKY;
}

然后可以从任何活动中调用它来播放一些音乐

Intent intent = new Intent(MusicService.ACTION_CMD, fileUrlToPlay, activity, MusicService::class.java)
intent.putParcelableArrayListExtra(MusicService.ARG_QUEUE, tracks)
intent.putExtra(MusicService.ARG_INDEX, position)
intent.putExtra(MusicService.CMD_NAME, MusicService.CMD_PLAY)
activity.startService(intent)

您可以使用bindService绑定到服务,并通过相应的活动生命周期方法使服务暂停/停止。

这是一个关于在Android后台播放音乐的好教程

于 2016-11-08T15:07:37.237 回答
2

我找到了两个很好的资源来分享,如果其他人通过谷歌遇到这个线程,这可能会对他们有所帮助(2018 年)。一个是这个视频教程,您将在其中实际了解服务的工作原理,这对初学者很有好处。

链接:- https://www.youtube.com/watch?v=p2ffzsCqrs8

另一个是这个网站,它将真正帮助您使用背景音频播放器。

链接:- https://www.dev2qa.com/android-play-audio-file-in-background-service-example/

祝你好运 :)

于 2018-10-21T18:21:10.973 回答