java - 在 Android 应用游戏上玩游戏时使用背景音乐
问题描述
我是 Android 开发人员的新手,我正在 Android Studio 上构建游戏应用程序。但是,我在玩游戏时遇到了背景音乐的问题。我已经使用Bound Service通过类来处理:MusicService extends Service implements MediaPlayer.OnErrorListener。但是,当我运行时,我的应用程序停止了。我试图修复和探索解决方案,但是,我无法运行应用程序......这是源代码:
音乐服务.java
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 MediaPlayer Player;
public MusicService() {
}
public class ServiceBinder extends Binder {
public 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.one);
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;
}
}
和MainActivity.java
public class MainActivity extends AppCompatActivity {
private boolean mIsBound = false;
private MusicService mServ;
private ServiceConnection Scon =new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.ServiceBinder binder = (MusicService.ServiceBinder)service;
mServ =binder.getService();
}
public void onServiceDisconnected(ComponentName name) {
mServ = null;
}
};
// Activity create UI its
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// Activity start.
@Override
protected void onStart() {
super.onStart();
// create Intent for MusicService.
Intent intent = new Intent(MainActivity.this,MusicService.class);
// call method bindService(..) to bind activity
this.bindService(intent, Scon, Context.BIND_AUTO_CREATE);
}
//Activity stop
@Override
protected void onStop() {
super.onStop();
if (mIsBound) {
this.unbindService(Scon);
mIsBound = false;
}
}
然后,我也没有忘记在 AndroidManifest 中添加以下代码
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true"></service>
这都是我的问题。这让我很困惑 帮助你,请 非常感谢
解决方案
你可以在 logcat 中添加更多的日志调试吗?不确定,但我想问题是你打电话:
mPlayer.start();
在 onStartCommand() 中。您的服务应实现 MediaPlayer.OnPreparedListener、MediaPlayer.OnErrorListener、MediaPlayer.OnCompletionListener 及以上函数应调用
void onPrepared(MediaPlayer mp)
推荐阅读
- amazon-s3 - 尝试通过 Athena 查询位于 S3 中的 VPC 流日志
- ruby-on-rails - 在回调中访问从关联中删除的模型
- r - 使用 r 逻辑 glm() 时如何获得交互对比的优势比?
- windows - 抑制 cmd 批处理中的换行/尝试将 2 个命令放到输出文件中的 1 行
- haskell - 是否可以使用 Servant 返回不同的 http 代码?
- python - 如何使用Python提取可变长度的子字符串
- c# - 如何从 c#(统一)将图像发布到 Twitter
- javascript - require('path'); 有什么区别?和要求('路径').resolve; 在这个例子中的性能方面?
- json - Serde:如何有条件地转换案例?
- java - 如何防止从 close_wait 连接打开太多文件