我有一个具有单一活动的应用程序,我知道如何使用媒体播放器播放背景音乐。由于我只有一项活动所以我认为我真的不需要在服务中播放这种音乐。所以我很少有困惑所以这就是我想要的。
我想要的是什么:
在我的应用中,我只有一个活动和一些按钮。我想在按钮点击时播放不同长度的声音。但是,虽然我真的不想停止背景音乐,但它应该同时在后台播放。
所以我的问题是(根据我的上限要求)
是否可以播放两种声音,使它们真的不会打扰其他声音?
这样做的适当方法是什么?
我不想在服务中播放背景音乐,因为我会给静音按钮静音背景音乐。因此用UI按钮处理服务会很困难吗?那么两种方式都是什么
如果您有任何代码和想法,请与我分享。任何链接将不胜感激。提前致谢。
答案 0 :(得分:2)
您可以将Service
与MediaPlayer
服务类 -
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();
Player = MediaPlayer.create(this, R.raw.jingle);
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()
{
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;
}
}
在Activity
班级中使用ServiceConnection
private boolean mIsBound = false;
private MusicService mServ;
private ServiceConnection Scon =new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder
binder) {
mServ = ((MusicService.ServiceBinderbinder).getService();
}
public void onServiceDisconnected(ComponentName name) {
mServ = null;
}
};
void doBindService(){
bindService(new Intent(this,MusicService.class),
Scon,Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService()
{
if(mIsBound)
{
unbindService(Scon);
mIsBound = false;
}
}
}
开始,暂停,恢复和停止音乐
按照步骤
doBindService
上的onCreate
将服务绑定到活动,然后将意图传递给服务。Intent
启动服务:
Intent music = new Intent();
music.setClass(this,MusicService.class);
startService(music);
mServ.pauseMusic();
mServ.resumeMusic();
mServ.stopMusic();
doUnbindService
。理想的地方是调用活动的onDestroy()
方法。AndroidManifest
文件中,粘贴以下XML代码: "service android:name="MusicService" android:enabled="true"
我希望这会帮助你。