如何正确创建音乐服务类并将其链接到其他活动?

时间:2017-03-17 09:34:52

标签: android

我一直在寻找如何创建音乐服务的解决方案。背后的简单原因是我希望能够在我的应用程序的背景中播放音乐,无论播放器将处于哪种活动状态。阅读Stack Overflow中的几个帖子以及谷歌搜索。试过其中一些,但不能真正让它正常工作。昨晚我偶然发现了这个(也发布在Stack Overflow的一个帖子中:Code Project。它看起来很有希望,但我无法正常工作,代码中也有一些小错误,我无法正常工作。

请记住,我仍然处于学习阶段,所以如果有可能尝试并尽可能地简化事情。如果你告诉我在哪里编写代码而不是假设我知道,我会很高兴。感谢任何帮助!

问题:

  • 创建音乐服务(或任何更好的选项),通过应用程序中的所有活动在后台播放音乐。

  • 使用按钮可以播放,暂停和停止音乐服务中的音乐。

问题:
到目前为止,这是我的代码,它基于此处的工作:Code Project。我做了一些编辑试图解决一些错误,仍然不是100%工作。此外,我也很困惑在哪里放一些实际编码,比如在试图拨打音乐服务等时。

MusicService.java

package com.example.android.kingofflags;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

public class MusicService extends Service  implements MediaPlayer.OnErrorListener {

    private final IBinder mBinder = new ServiceBinder();
    MediaPlayer mPlayer;
    private int length = 0;

    public MusicService() {
    }

    public class ServiceBinder extends Binder {
        MusicService getService() {
            return MusicService.this;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mPlayer = MediaPlayer.create(this, R.raw.kalimba);
        mPlayer.setOnErrorListener(this);

        if (mPlayer != null) {
            mPlayer.setLooping(true);
            mPlayer.setVolume(100, 100);
        }


        mPlayer.setOnErrorListener(new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int what, int
                    extra) {

                onError(mPlayer, what, extra);
                return true;
            }
        });
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mPlayer.start();
        return START_STICKY;
    }

    public void pauseMusic() {
        if (mPlayer.isPlaying()) {
            mPlayer.pause();
            length = mPlayer.getCurrentPosition();

        }
    }

    public void resumeMusic() {
        if (mPlayer.isPlaying() == false) {
            mPlayer.seekTo(length);
            mPlayer.start();
        }
    }

    public void stopMusic() {  //gives the "error" never been used
       if (mPlayer.isPlaying()) {
           mPlayer.stop();
           mPlayer.release();
           mPlayer = null;
       }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPlayer != null) {
            try {
                mPlayer.stop();
                mPlayer.release();
            } finally {
                mPlayer = null;
            }
        }
    }

    public boolean onError(MediaPlayer mp, int what, int extra) {

        Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show();
        if (mPlayer != null) {
            try {
                mPlayer.stop();
                mPlayer.release();
            } finally {
                mPlayer = null;
            }
        }
        return false;
    }

}

MainActivity.java

package com.example.android.kingofflags;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    boolean mIsBound = false;
    MusicService mServ;


    private ServiceConnection Scon = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder)
        {
            mServ = ((MusicService.ServiceBinder)binder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            mServ = null;
        }
    };

    void doBindService(){
        bindService(new Intent(this,MusicService.class),
                Scon,Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startgameButton = (Button) findViewById(R.id.startgameButton);
        startgameButton.setOnClickListener(this);

        Intent music = new Intent();
        music.setClass(this,MusicService.class);
        startService(music);

        doBindService();

    }//onCreate ends here


    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.startgameButton:
                startActivity(new Intent(this, MenuActivity.class));
                break;

            case R.id.switch1:
                mServ.pauseMusic();
                mServ.resumeMusic();
                break;
        }//switch ends here

    }//onClick ends here

}//MainActivity ends here

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.kingofflags">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
    <service
        android:enabled="true"
        android:name=".MusicService" />

        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MenuActivity" />
        <activity android:name=".MainActivity" />
        <activity android:name=".PlayActivity" />
        <activity android:name=".HighScoreActivity" />
        <activity android:name=".OptionsActivity" />

    </application>

</manifest>

1 个答案:

答案 0 :(得分:1)

问题1.您无法将服务绑定到android中的多个活动。

问题2.你需要一个MediaController。看看这里:https://developer.android.com/reference/android/widget/MediaController.html

对于第一个问题,您可以创建一个将要绑定服务的Application类。应用程序类将与您的应用程序一样长,而您的活动将发生变化,因此您将无法将其绑定到单个活动。看看这里:https://developer.android.com/reference/android/app/Application.html

对于第二个,请查看他们提供的Google样本。媒体播放器示例位于:https://github.com/googlesamples/android-UniversalMusicPlayer

Android Media Player的一个很好的起点是:https://www.youtube.com/watch?v=XQwe30cZffg&index=1&list=PLw4z5K72qyXG54c-ZBKrqby3vz9g30dzr&t=771s