zoukankan      html  css  js  c++  java
  • Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)

    效果:

    问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决)

    xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.chenshuai.myapplication.ActivityMusic"
        android:orientation="vertical">
        <ProgressBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:id="@+id/pb"
            />
    
        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/sbr" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40sp"
            android:text="播放状态"
            android:textSize="20sp"
            android:gravity="center_horizontal"
            android:id="@+id/tv_1"/>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="播放"
                android:onClick="play_onclick"/>
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="暂停"
                android:onClick="pause_onclick"/>
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="停止"
                android:onClick="stop_onclick"/>
            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="退出"
                android:onClick="exit_onclick"/>
        </LinearLayout>
    
    </LinearLayout>

    Service

    package com.example.chenshuai.myapplication;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.Binder;
    import android.os.IBinder;
    
    
    
    public class MyServiceMusic extends Service {
    
    
        public MyServiceMusic() {
    
    
        }
    
        public class Mybind extends Binder
        {
            //获取歌曲长度
            public int getMusicDuration()
            {
                int rtn = 0;
                if (mediaPlayer != null)
                {
                    rtn = mediaPlayer.getDuration();
                }
    
                return rtn;
            }
            //获取当前播放进度
            public int getMusicCurrentPosition()
            {
                int rtn = 0;
                if (mediaPlayer != null)
                {
                    rtn = mediaPlayer.getCurrentPosition();
    
                }
    
                return rtn;
            }
    
            public void seekTo(int position)
            {
                if (mediaPlayer != null)
                {
                    mediaPlayer.seekTo(position);
                }
            }
    
        }
    
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            //throw new UnsupportedOperationException("Not yet implemented");
            return  new Mybind();
        }
        private MediaPlayer mediaPlayer;
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            //获取意图传递的信息
            String action = intent.getStringExtra("action");
    
            switch (action)
            {
                case "play":
                    if (mediaPlayer == null)
                    {
                        mediaPlayer = MediaPlayer.create(this,R.raw.onceagain);
    
    
                    }
                    mediaPlayer.start();
    
                    break;
                case "stop":
                    if (mediaPlayer !=null)
                    {
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                        mediaPlayer.release();
                        mediaPlayer = null;
                    }
                    break;
                case "pause":
                    if (mediaPlayer !=null && mediaPlayer.isPlaying())
                    {
                        mediaPlayer.pause();
                    }
                    break;
            }
            return super.onStartCommand(intent, flags, startId);
        }
    }

    java

    package com.example.chenshuai.myapplication;
    
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.ProgressBar;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    public class ActivityMusicservice extends AppCompatActivity {
    
        TextView tv_1;
        ProgressBar pb;
        SeekBar sbr;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_activity_music);
    
            tv_1 = (TextView)findViewById(R.id.tv_1);
    
            tv_1.setText("播放状态11:停止播放。。。");
            pb = (ProgressBar)findViewById(R.id.pb);
            sbr = (SeekBar)findViewById(R.id.sbr);
    
        }
    
        ServiceConnection serviceConnection;
        MyServiceMusic.Mybind mybind;
    
        public void play_onclick(View view)
        {
            Intent intent = new Intent(this,MyServiceMusic.class);
    
            intent.putExtra("action","play");
    
            startService(intent);
    
            tv_1.setText("播放状态11:正在播放。。。");
    
            if (serviceConnection == null) {
                serviceConnection = new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
    
                        mybind = (MyServiceMusic.Mybind) service;
    
                        //设置进度条的最大长度
                        int max = mybind.getMusicDuration();
                        pb.setMax(max);
    
                        sbr.setMax(max);
                        sbr.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                            @Override
                            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    
                                mybind.seekTo(progress);
                            }
    
                            @Override
                            public void onStartTrackingTouch(SeekBar seekBar) {
    
                            }
    
                            @Override
                            public void onStopTrackingTouch(SeekBar seekBar) {
    
                            }
                        });
    
                        //连接之后启动子线程设置当前进度
                      new Thread()
                        {
                            public void run()
                            {
    
                                //改变当前进度条的值
                                //设置当前进度
                                while (true) {
                                    pb.setProgress(mybind.getMusicCurrentPosition());
                                   // sbr.setProgress(mybind.getMusicCurrentPosition());
    
                                    try {
                                        Thread.sleep(100);
                                    } catch (Exception e) {
    
                                        e.printStackTrace();
                                    }
                                }
                            }
    
                        }.start();
    
                    }
    
                    @Override
                    public void onServiceDisconnected(ComponentName name) {
    
                    }
                };
    
                //以绑定方式连接服务
                bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    
            }
    
        }
    
        public void stop_onclick(View view)
        {
            Intent intent = new Intent(this,MyServiceMusic.class);
    
            intent.putExtra("action","stop");
    
            startService(intent);
    
            tv_1.setText("播放状态11:停止播放。。。");
        }
        public void pause_onclick(View view)
        {
            Intent intent = new Intent(this, MyServiceMusic.class);
    
            intent.putExtra("action","pause");
    
            startService(intent);
    
            tv_1.setText("播放状态11:暂停播放。。。");
    
    
        }
        public void exit_onclick(View view)
        {
            stop_onclick(view);
            finish();
        }
    }

     manifest.xml

    <service
                android:name=".MyServiceMusic"
                android:enabled="true"
                android:exported="true" />
  • 相关阅读:
    C#中 @ 的用法
    ASP.NET页面间传值
    ASP.NET中常用的文件上传下载方法
    把图片转换为字符
    把图片转换为字符
    JavaScript 时间延迟
    Using WSDLs in UCM 11g like you did in 10g
    The Definitive Guide to Stellent Content Server Development
    解决RedHat AS5 RPM安装包依赖问题
    在64位Windows 7上安装Oracle UCM 10gR3
  • 原文地址:https://www.cnblogs.com/Chenshuai7/p/5429695.html
Copyright © 2011-2022 走看看