我一直在寻找如何创建音乐服务的解决方案。背后的简单原因是我希望能够在我的应用程序的背景中播放音乐,无论播放器将处于哪种活动状态。阅读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>
答案 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