独立开发音乐播放器

第一先整体布置好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后台依然在唱歌   还有一个就是进度条跟随播放 前进

posted on 2014-10-27 17:49  大有@  阅读(269)  评论(0编辑  收藏  举报

导航