zoukankan      html  css  js  c++  java
  • 独立开发音乐播放器

    第一先整体布置好ui布局   开始动手:
      先找好素材, 修改了mainActivity  去掉title

        去掉title 方法之前已近写过了就不多说了!

    定义main.xml 进入应用程序的布局  
     

     

    搞了一整天  主要是素材难搞

    main.xml 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
      
        <ImageView 
            android:id="@+id/mainIco"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:src="@drawable/backg"
            
            />
       <SeekBar 
           android:id="@+id/seekBar"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:minHeight="3pt"
           android:maxHeight="3pt"
           android:paddingLeft="2pt"
           android:paddingRight="2pt"
           android:scrollbars="horizontal"
           android:thumb="@drawable/bar"
           android:thumbOffset="1pt"
           />
    
       <RelativeLayout
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:layout_weight="1" >
    
           <TextView
               android:id="@+id/startTime"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_alignParentLeft="true"
               android:layout_alignParentTop="true"
               android:text="00:20" />
    
           <TextView
               android:id="@+id/startTime"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_alignParentRight="true"
               android:layout_alignParentTop="true"
               android:text="03:20" />
    
           <ImageButton
               android:id="@+id/play"
               android:layout_width="10pt"
               android:layout_height="10pt"
               android:layout_centerHorizontal="true"
               android:layout_centerVertical="true"
               android:background="@drawable/image_button"
               android:src="@drawable/play" 
               android:onClick="mediaPlay"
               />
    
           <ImageButton
               android:id="@+id/fast"
               android:layout_width="10pt"
               android:layout_height="10pt"
               android:layout_alignBottom="@id/play"
               android:layout_toRightOf="@id/play"
               android:background="@drawable/image_button"
               android:src="@drawable/fast" />
           <ImageButton
               android:id="@+id/next"
               android:layout_width="10pt"
               android:layout_height="10pt"
               android:layout_alignBottom="@id/fast"
               android:layout_toRightOf="@id/fast"
               android:background="@drawable/image_button"
               android:src="@drawable/next" />
           
           <ImageButton
               android:id="@+id/slow"
               android:layout_width="10pt"
               android:layout_height="10pt"
               android:layout_alignBottom="@id/play"
               android:layout_toLeftOf="@id/play"
               android:background="@drawable/image_button"
               android:src="@drawable/slow" />
           
           <ImageButton
               android:id="@+id/last"
               android:layout_width="10pt"
               android:layout_height="10pt"
               android:layout_alignBottom="@id/slow"
               android:layout_toLeftOf="@id/slow"
               android:background="@drawable/image_button"
               android:src="@drawable/last" />
           
       </RelativeLayout>
       
    </LinearLayout>
    package codefans.app.service;
    
    import java.io.File;
    import java.io.IOException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.os.Binder;
    import android.os.Environment;
    import android.os.IBinder;
    
    public class Mp3Service extends Service
    {
        private IBinder myBinder = new Mp3IBinder();
        private MediaPlayer mediaPlayer;
        private File musicFile;
        
        @Override
        public void onCreate()  
        {
            if(this.mediaPlayer == null)
            {
                this.mediaPlayer = new MediaPlayer();
            }
        }
        
        @Override
        public void onDestroy()
        {
            if(this.mediaPlayer != null)
            {
                this.mediaPlayer.stop();
                this.mediaPlayer.release();
                this.mediaPlayer = null;
            }
            super.onDestroy();
        }
        
        @Override
        public IBinder onBind(Intent intent)
        {
            return myBinder;
        }
    
        //开始播放
        private void playMusci(String fileName)
        {
            try
            {
                this.musicFile = new File(Environment.getExternalStorageDirectory(), fileName);
                this.mediaPlayer.setDataSource(musicFile.getAbsolutePath());
                this.mediaPlayer.prepare();
                this.mediaPlayer.setOnPreparedListener(new MyPreParedListenner());
            }
            catch (IllegalArgumentException e)
            {
                e.printStackTrace();
            }
            catch (IllegalStateException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            
        }
        
        //mediaPlayer缓存完执行事件
        private class MyPreParedListenner implements OnPreparedListener
        {
    
            public void onPrepared(MediaPlayer mp)
            {
                Mp3Service.this.mediaPlayer.start();
            }
            
        }
        
        /**
         * 新建一个内部类 Activity调用service时返回此binder
         * @author Codefans
         */
        private class Mp3IBinder extends Binder implements Player
        {
    
            public void playMusic(String filePath)
            {
                Mp3Service.this.playMusci(filePath);
            }
            
        }
    
    }

    service 播放功能

    package codefans.app.activity;
    
    import codefans.app.service.Player;
    import codefans.mp3layer.R;
    import android.app.Activity;
    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.view.View;
    import android.widget.ImageButton;
    
    public class Mp3PlayerActivity extends Activity
    {
        private boolean flag = false;
        private ImageButton playBt;
        private Player binder;
        private ServiceConnection myServiceConnection = new MyServiceConnection();
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            this.playBt = (ImageButton) findViewById(R.id.play);
            Intent intent = new Intent("codefans.action.Mp3Player");
            bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE);
            
    
        }
        
        
        //播放按钮点击
        public void mediaPlay(View v)
        {
            if(flag == false)  //改变播放按钮图标
            {
               playBt.setImageResource(R.drawable.stop);
               flag = true;
               
              this.binder.playMusic("qq.mp3");
               
               
               
            }
            else
            {
                 playBt.setImageResource(R.drawable.play);
                 flag = false;
            }
            
        }
        
        @Override
        protected void onDestroy()
        {
            
            unbindService(myServiceConnection);
            
            super.onDestroy();
        }
        
        
        
        //启动服务需要类
        private class MyServiceConnection implements ServiceConnection
        {
    
            public void onServiceConnected(ComponentName name, IBinder service)
            {
                Mp3PlayerActivity.this.binder = (Player) service;
                
            }
    
            public void onServiceDisconnected(ComponentName name)
            {
                Mp3PlayerActivity.this.binder = null;
            }
        }
    }

    这里用bindservice 好像不行,因为这样如果挂掉Activity 那个service服务也停止了  应该用startservice  ! 这个明天再写了 很迟了(嘿嘿)

    只写了一个播放功能

       

    package codefans.app.activity;
    
    import codefans.app.util.Mp3Util;
    import codefans.mp3layer.R;
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageButton;
    import android.widget.SeekBar;
    
    public class Mp3PlayerActivity extends Activity
    {
        private boolean flag = false;  //播放  暂停 变量判断
        
        private ImageButton playBt;
        private SeekBar seekBar;
        
        
        
        private Intent intent;   //播放信息意图
        private Bundle bundle;   //意图传递的信息
        
        private SeekBarReceiver receiver;
        private int position;   //播放进度条位置
        
        
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            this.playBt = (ImageButton) findViewById(R.id.play);
            this.seekBar = (SeekBar) findViewById(R.id.seekBar);
            
            
            //意图   启动service使用
            this.intent = new Intent("codefans.action.Mp3Player");
            bundle = new Bundle();
            
            
            //注册广播接受器
            receiver = new SeekBarReceiver();  
            IntentFilter filter = new IntentFilter();
            filter.addAction("codefans.intent.action.Mp3Player");
            this.registerReceiver(receiver, filter);
            
    
        }
        
        
        //播放按钮点击
        public void mediaPlay(View v)
        {
            if(flag == false)  //改变播放按钮图标
            {
               playBt.setImageResource(R.drawable.stop);
               flag = true;
               this.bundle.putString("filePath", "qq.mp3");
               this.bundle.putInt("operate", Mp3Util.PLAY);
               this.intent.putExtras(bundle);
               startService(intent);
               
               
            }
            else
            {
                 playBt.setImageResource(R.drawable.play);
                 flag = false;
                 
                 this.bundle.putInt("operate", Mp3Util.STOP);
                 this.intent.putExtras(bundle);
                 startService(intent);
                 
            }
            
        }
        
        @Override
        protected void onDestroy()
        {
            this.unregisterReceiver(receiver);  //解除接受广播 
            
            
            super.onDestroy();
        }
        
        
        
        
        
        
        
        /**
         *   bindService 实现需要  这里使用startservice 
         * @author Codefans
         *
        
        
        //启动服务需要类
        private class MyServiceConnection implements ServiceConnection
        {
    
            public void onServiceConnected(ComponentName name, IBinder service)
            {
                Mp3PlayerActivity.this.binder = (Player) service;
                
            }
    
            public void onServiceDisconnected(ComponentName name)
            {
                Mp3PlayerActivity.this.binder = null;
            }
            
            
        }
         */
        
        
        /**
         * 播放进度条 位置广播接受器
         * @author Codefans
         *
         */
        private class SeekBarReceiver extends BroadcastReceiver
        {
    
            @Override
            public void onReceive(Context context, Intent intent)
            {
                Mp3PlayerActivity.this.position = intent.getIntExtra("position", 0);
               
               //  Message msg = new Message();
                Mp3PlayerActivity.this.seekBar.setProgress(position);
                
            //    Log.i("result", String.valueOf(position));
               
            }
            
        }
        
        
    }
    package codefans.app.service;
    
    import java.io.File;
    import java.io.IOException;
    
    import codefans.app.util.Mp3Util;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.IBinder;
    
    public class Mp3Service extends Service
    {
        private MediaPlayer mediaPlayer;
        private File musicFile;
        private String name;
    
        @Override
        public void onCreate()
        {
            if (this.mediaPlayer == null)
            {
                this.mediaPlayer = new MediaPlayer();
            }
        }
    
        @Override
        public void onDestroy()
        {
            if (this.mediaPlayer != null)
            {
                this.mediaPlayer.stop();
                this.mediaPlayer.release();
                this.mediaPlayer = null;
            }
            super.onDestroy();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            Bundle bundle = intent.getExtras();
            switch (bundle.getInt("operate"))
            {
            case Mp3Util.PLAY:
                this.playMusci(bundle.getString("filePath"));
                break;
            case Mp3Util.STOP:
                this.stop();
                break;
            }
    
            return START_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent)
        {
            return null;
        }
    
        // 开始播放
        private void playMusci(String fileName)
        {
            try
            {
                if (fileName.equals(name))  //播放同文件  
                {
                    this.mediaPlayer.start();
                }
                else   //播放不同文件
                {
                    this.name = fileName;
                    this.musicFile = new File(
                            Environment.getExternalStorageDirectory(), fileName);
                    this.mediaPlayer.reset();
                    this.mediaPlayer.setDataSource(musicFile.getAbsolutePath());
                    this.mediaPlayer.prepare();
                    this.mediaPlayer
                            .setOnPreparedListener(new MyPreParedListenner());
                    
                    Thread t = new SendBroadCastThread();
                    t.start();
                    
                    
                    
                }
            }
            catch (IllegalArgumentException e)
            {
                e.printStackTrace();
            }
            catch (IllegalStateException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    
        }
    
        private void stop() //暂停
        {
            this.mediaPlayer.pause();
        }
    
        // mediaPlayer缓存完执行事件
        private class MyPreParedListenner implements OnPreparedListener
        {
    
            public void onPrepared(MediaPlayer mp)
            {
                mp.start();
            }
    
        }
    
        /**
         * 发送播放位置线程, 每隔一秒发送一次广播 改变播放器进度条
         * @author Codefans
         *
         */
        private class SendBroadCastThread extends Thread
        {
            
            @Override
            public void run()
            {
                while(true)
                {
                    Intent intent = new Intent();
                    intent.putExtra("position", Mp3Service.this.mediaPlayer.getCurrentPosition());
                    
                    intent.setAction("codefans.intent.action.Mp3Player");// action与接收器相同
                    sendBroadcast(intent);  //发送广播
                    
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    
                }
            }
            
            
        }
        
        
        
        /**
         * 新建一个内部类 Activity调用service时返回此binder
         * 
         * @author Codefans
         * 
         *         private class Mp3IBinder extends Binder implements Player {
         * 
         *         public void playMusic(String filePath) {
         *         Mp3Service.this.playMusci(filePath); }
         * 
         *         }
         */
    }

    今天主要写了关闭Activity后台依然在唱歌   还有一个就是进度条跟随播放 前进

  • 相关阅读:
    Python paramiko安装报错
    Python 函数返回值类型
    python 数据类型
    python — 模块(二)
    python — 模块(一)
    python 总结
    python 小知识3
    python 小知识3
    python 小知识2
    python — 计算机基础知识
  • 原文地址:https://www.cnblogs.com/a354823200/p/4054779.html
Copyright © 2011-2022 走看看