android服务之MP3播放(2)

该播放器将会直接从网络上获取资源进行播放,并提供进度条显示的功能

布局文件



布局文件中使用Seekbar组件来显示进度条

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="开始播放"
    android:onClick="play"/>
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="暂停播放"
    android:onClick="pause"/>
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="继续播放"
    android:onClick="continuePlay"/>
<SeekBar
    android:id="@+id/sb"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

Activity



在Activity中需要做两件事情,第一:从消息队列中获取关于当前MP3的播放进度,通过播放进度修改SeekBar的属性。第二:因为可以通过进度条来控制播放进度,所以获取进度条的相关信息来控制播放进度。

package xidian.dy.com.chujia;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.SeekBar;

public class MainActivity extends AppCompatActivity {
    IMusic music;
    static SeekBar sb;
    static Handler handler = new Handler(){
        public void handleMessage(Message msg){
            Bundle bundle = msg.getData();
            sb.setMax(bundle.getInt("duration"));
            sb.setProgress(bundle.getInt("current"));
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        bindService(intent, new MyConnection(), BIND_AUTO_CREATE);
        sb = (SeekBar) findViewById(R.id.sb);
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                music.seekTo(seekBar.getProgress());
            }
        });
    }

    public void play(View v){
        music.play();
    }

    public void pause(View v){
        music.pause();
    }

    public void continuePlay(View v){
        music.continuePlay();
    }

    class MyConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            music = (IMusic) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }
}

Service



在Service中需要过去当前的播放信息,并将其写在消息队列中传递给Activity线程。并且向外提供一个提供改变当前播放进度接口

package xidian.dy.com.chujia;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.Log;

import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by dy on 2016/7/29.
 */
public class MusicService extends Service {
    MediaPlayer player;
    Timer timer;

    @Override
    public void onCreate() {
        player = new MediaPlayer();
        timer = new Timer();
        super.onCreate();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    public void continuePlay(){
        player.start();
    }

    public void pause(){
        player.pause();
    }

    public void play(){
        player.reset();
        try {
            player.setDataSource("http://123.206.68.138/mg.mp3");
            player.prepareAsync();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            Bundle bundle = new Bundle();
                            bundle.putInt("duration", player.getDuration());
                            bundle.putInt("current", player.getCurrentPosition());
                            Message msg = MainActivity.handler.obtainMessage();
                            msg.setData(bundle);
                            MainActivity.handler.sendMessage(msg);
                            Log.i("duration", String.valueOf(player.getDuration()));
                        }
                    }, 5, 500);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
        timer.cancel();
    }

    class MyBinder extends Binder implements IMusic{
        @Override
        public void play() {
            MusicService.this.play();
        }

        @Override
        public void pause() {
            MusicService.this.pause();
        }

        public void seekTo(int msc){
            player.seekTo(msc);
        }
        @Override
        public void continuePlay() {
            MusicService.this.continuePlay();
        }
    }
}

接口



该接口是连接service和Activity的

package xidian.dy.com.chujia;

/**
 * Created by dy on 2016/7/29.
 */
public interface IMusic {
    void play();
    void pause();
    void continuePlay();
    void seekTo(int msc);
}

清单文件



在清单文件中需要开启网络权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.dy.com.chujia">
<uses-permission android:name="android.permission.INTERNET"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="主界面">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name=".MusicService"/>
</application>
</manifest>
时间: 2024-10-11 04:40:26

android服务之MP3播放(2)的相关文章

Android练习项目 Mp3播放器实现(一)

对于Android的学习,需要掌握的东西有点多,需要我们认真,小心,不断的进取.前天突然有个想法,觉得Mp3播放器是一个可以练习的项目,于是在网上搜了下,发现有人已经写了博客,看了他们的博客后,我觉得他们说的一点很对,Mp3播放器基本用到了Android里面的许多知识点,做完这个过后,可能对于Android整个架构有了一定了解,我于是也想尝试下,于是准备边做,编写博客,来记录自己开发的过程,这个也许叫作项目开发日志吧. 第一个我的想法是先做:本地音乐播放器. 于是我用了个粗浅的方法来加载mp3文

Android练习项目 Mp3播放器实现(二)

在经过几天的折腾之后,迎来了Mp3播放器的第二篇博客,这篇文章主要将如何实现播放器的播放,下一首,上一首,顺序播放,循环播放,随机播放,单曲循环等操作. 其实操作的过程中主要是通过参数的传递来实现功能的. 在activity里面互相传参有很多中方法,但对于activity和service进行交互有些方法并不适合,通过对Broadcast和BroadcastReceiver等操作,来控制播放的实现. 我们先设定好广播,然后通过发送信号来进行传递数据. 主要在activity里面动态注册广播,通过传

Android练习项目 Mp3播放器实现 歌词同步播放(四)

其实到后面就需要我们如何显示歌词,对于歌词的同步显示还是比较好实现的,主要通过判断当前播放的时间和每个结点的歌词的时间的大小,来同步对应到结点的数据,现在就是如何来实现这个问题. 其实,这个时候就需要自定义控件来实现. 第一步需要自定义View的属性. 第二步需要实现在View的构造方法中获得我们自定义的属性. 主要通过初始化函数,init() 第三步,重写ondraw函数. LrcView.java package com.flashmusic.View; import android.con

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android Service AIDL 远程调用服务 简单音乐播放实例的实现

Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成. AIDL 是什么 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activi

【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

通过调用安卓的MediaPlayer可以直接完成Mp3等主流音频的播放,同时利用ContentResolver与Cursor可以直接读取安卓内在数据库的信息,直接获取当前sdcard中所有音频的列表,无须像<[Android]内存卡图片读取器,图库app>(点击打开链接)一样利用原始的Java代码去遍历整个sdcard卡,直接调用安卓固有的类既便捷又快速.最后,读取出来的Mp3可以通过适配器直接加载到ListView列表,做出如下所示的内存卡Mp3播放器app效果.本app在自己的真实的16G

Android Mediaplayer本地音乐播放器(绑定服务)

本文章介绍MediaPlayer本地音乐播放器,而当应用程序不再位于前台且没有正在使用它的活动时,为了确保音频继续播放,我们需要建立一个服务Service. Activity与绑定服务Service之间的交互是本文章的重点(这里需要说明一点的是,Activity不能直接访问服务对象中的方法,所以才有了我们一下的介绍,这也是为服务的安全等方面的考虑). 直接上代码: 布局文件:activity_main: <LinearLayout xmlns:android="http://schemas

android实现MP3播放器

前一段时间考试,这个做好的项目一直没有时间总结.虽然在做项目的期间,把用到的各种技术都记录下来写成blog了,但还是应该有一个总体上的概括与总结. 这是自己做的第一个比较大型的项目,这个项目也就是mars大大视频第一季里最后介绍的那个项目.但自己坚持做下来,还是收货颇多.自己完完整整的做一个项目,与在视频了看mars大大啪啪啪的键盘打过去是完全不一样的感觉,过程中遇见了无数的困难,自己克服了无数的困难,只有自己做一遍,才真正能够有所体会. 好啦,下面来介绍一下这个简单的MP3播放器. 首先,是画

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们可以在无形中使我们的软件和网络.数据库.系统等进行交互,之后通过UI(Notification就是一种展示方式)把结果展现在我们面前.可以说,他们是android生命体系里面的神经系统,通过反射条件让身体展现不同的状态.在整个系统中,广播接收器充当着是传输者和监听者的角色,它把系统的一点点变化都反馈上去,之后