• 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" />
  • 相关阅读:
    关于easuiy中的datetimebox与数据库中的时间的交互的使用
    datagrid的getdata和getrows
    easyui中的datagrid的数据加载的问题
    数据库中的数据在datagrid显示footer的显示
    关于网页间传递汉字出现乱码的情况
    使用OpenCL(二) 设备上下文
    使用OpenCL
    复合、源文件组织、类别
    内存管理
    Foundation Kit介绍
  • 原文地址:https://www.cnblogs.com/Chenshuai7/p/5429695.html
Copyright © 2020-2023  润新知