zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Python学习 Day 1-简介 安装 Hello world
    R Programming week2 Functions and Scoping Rules
    R in action读书笔记(6)-第七章:基本统计分析(中)
    R in action读书笔记(5)-第七章:基本统计分析
    Redis进阶应用:Redis+Lua脚本实现复合操作
    一个项目的SpringCloud微服务改造过程
    中间件增强框架之-CaptureFramework框架
    关系型数据库全表扫描分片详解
    AI中台——智能聊天机器人平台的架构与应用(分享实录)
    如何设计实时数据平台(设计篇)
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5721147.html
Copyright © 2011-2022 走看看