我已经阅读了一段时间以及关于服务的一切,我不是所有的开发者,我对这些东西都是新手并且想要学习,作为一个测试,我试图制作在线广播流应用。我已经做到了它并且它完美无缺,我唯一的问题是我似乎无法找到使服务工作或如何工作的方式,我知道你们大多数都是关于android的伟大开发者而且只是寻找老师或愿意告诉我如何的人
这是我的代码:
public class MainActivity extends AppCompatActivity
{
Button b_play1;
MediaPlayer mediaPlayer;
boolean prepared;
String stream = "http://73.160.214.181:8000/stream";
private boolean started;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, mServices.class));
b_play1 = (Button) findViewById(R.id.play1);
b_play1.setEnabled(false);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
new PlayerTask().execute(stream);
b_play1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
if (started) {
started = false;
mediaPlayer.pause();
b_play1.setBackground(getDrawable(play));
} else {
started = true;
mediaPlayer.start();
b_play1.setBackground(getDrawable(pause));
}
}
});
}
@Override
protected void onPause()
{
super.onPause();
if(started){
mediaPlayer.pause();
}
}
@Override
protected void onResume()
{
super.onResume();
if(started){
mediaPlayer.start();
}
}
@Override
protected void onDestroy()
{
super.onDestroy();
if(prepared){
mediaPlayer.release();
}
}
class PlayerTask extends AsyncTask<String, Void, Boolean>
{
@Override
protected Boolean doInBackground(String... strings) {
try {
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.prepare();
prepared = true;
} catch (IOException e) {
e.printStackTrace();
}
return prepared;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
b_play1.setEnabled(true);
}
}}
答案 0 :(得分:0)
创建一个像
这样的服务类.playground
在Manifest.xml文件中添加以下行
public class MyService extends Service {
MediaPlayer mPlayer;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show();
mPlayer = MediaPlayer.create(this, R.raw.laila);
mPlayer.setLooping(false); // Set looping
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
mPlayer.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
mPlayer.stop();
}
}
您可以致电
开始服务<service android:name=".service.MyService" android:enabled="true"/>
并停止服务
startService(new Intent(this, MyService.class));
这是如何启动和停止服务的基本流程。您可以在此处阅读更多内容Service
答案 1 :(得分:0)
我在我的书中写了一个Android音频章节,在其中我提供了一个使用后台服务播放音乐的应用程序。 所以在这里我将总结它并使用您的代码稍微调整它以显示您应该如何从后台服务流式传输。您将拥有一个与执行流式传输的服务绑定的mainActivity,而不是在您的Activity中使用Async任务。
首先,您需要在清单中定义服务:(显然使用您的包名,而不是我在下面显示的)
<application
<service
android:name="com.wickham.android.musicservice.MusicService"
android:label="Music Service"
android:enabled="true">
</service>
然后,您需要将Activity绑定到服务。 Activity可用于控制服务,例如启动和停止流:(以下代码块进入您的主要活动,即现在拥有所有内容的地方)
// Bind the Service
bindService(new Intent(this,MusicService.class), Scon,Context.BIND_AUTO_CREATE);
// Connect to Service
public void onServiceConnected(ComponentName name, IBinder binder) {
mServ = ((MusicService.ServiceBinder)binder).getServiceInstance();}
// Start the service
Intent music = new Intent();
music.setClass(this,MusicService.class);
startService(music);
// Controlling the service
mServ.resumeMusic();
mServ.pauseMusic();
然后,在你正在进行实际流式传输的服务类中,你可以这样实现它:(我没有包括名为resumeMusic()和pauseMusic()的两个方法,但那些进入服务并基本上做你在活动中已经拥有的东西。
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 {
public MusicService getServiceInstance() {
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent arg0){return mBinder;}
@Override
public void onCreate () {
super.onCreate();
mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setOnErrorListener(this);
mPlayer.setLooping(false);
mPlayer.setVolume(100,100);
mPlayer.setOnErrorListener(new OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
onError(mPlayer, what, extra);
return true;
}
});
}
}
希望这有点帮助。