独立开发音乐播放器

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

时间: 2024-11-06 21:23:13

独立开发音乐播放器的相关文章

Xamarin.Android开发音乐播放器

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐. 先show一组界面啊,话说有图有真相啊: 项目结构如图: Lrc是歌词处理方法 MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

Android开发之startService和onBinderService混合开发音乐播放器

一.首先你需要知道MediaPlayer这个类的一些方法: int getDuration():获取流媒体的总播放时长,单位是毫秒. int getCurrentPosition():获取当前流媒体的播放的位置,单位是毫秒. void seekTo(int msec):设置当前MediaPlayer的播放位置,单位是毫秒. void setLooping(boolean looping):设置是否循环播放. boolean isLooping():判断是否循环播放. boolean  isPla

10个免费开源的JS音乐播放器插件

音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的,如果需要用到微信或手机上,可根据自己需要求,选择对应的网页播放器.  ● Codrops Audio Codrops Audio 界面使用纯CSS编写,支持响应式,可以方便在桌面.平板以及手机设备上使用.界面因为是CSS编写,所以如果懂CSS样式,可以自己设计一个新的样式来修改. 演示&下载 ● Dark

Java音乐播放器-乐乐音乐(PC版)

乐乐音乐目前是基于musique开发的一个java音乐播放器,之前开发了一个android版本的音乐播放器,现在把android版本的代码移植过来PC版本这里.不过遇到了一个难题,就是java如果要播放mp3等歌曲,要安装jmf,我觉得安装这jmf真是太麻烦了,电脑是64位的伤不起啊.于是我从网上搜了一下,搜到了不少的开源播放器,如: (1)YOYOPlayer,感觉 YOYOPlayer整体上都不错,我的歌词也参考了一下它的实现,不过它在播放的时候,有一个问题,就是快进的时候,拖动条上显示的时

iOS开发拓展篇—音频处理(音乐播放器2)

iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 2.两种方法的分析 可以使用模态的方法,添加一个控制器,让这个控制器和音乐播放控制器类进行关联,脱线,设置标识符且在cell的点击事件中执行segue即可. 步骤说明: (1)在storyboard中新拖入一个控制器,然后设置和playing控制器类相关联. (2)设置手动跳转 (3)设置segue

iOS开发拓展篇—音频处理(音乐播放器5)

iOS开发拓展篇—音频处理(音乐播放器5) 实现效果: 一.半透明滑块的设置 1 /** 2 *拖动滑块 3 */ 4 - (IBAction)panSlider:(UIPanGestureRecognizer *)sender { 5 6 //1.获得挪动的距离 7 CGPoint t=[sender translationInView:sender.view]; 8 //把挪动清零 9 [sender setTranslation:CGPointZero inView:sender.view

手机音乐播放器开发

<DOCTYPE html> <html> <head> <title>手机音乐播放器</title> <style> *{margin:0;padding:0;} body{ background:#000000; /*性能优化:一个优秀的开发工程师一定是为服务器,CPU考虑(提高代码的加载效率网站打开效率)*/ } #music{ position:relative; width:322px; height:635px; //ba

仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)

转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出来,给学习duilib布局的朋友做个demo.现在编写的仿酷狗选项设置窗体和原酷狗的窗体不细看几乎看不出差别,控件的布局位置和原酷狗最多只有几个像素的位置差别. 先来看一下原酷狗的选项设置窗体的其中一个页面: 如果还不太会布局的朋友可以先看我前些日子写的关于duilib布局的博客<duilib各种布

iOS开发拓展篇—音频处理(音乐播放器3)

iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewController.music=self.music[indexPath.row];不能满足 第二种做法:把整个数组传递给它 第三种做法:设置一个数据源,设置播放控制器的数据源是这个控制器.self.parentViewController.dataSource=self;好处:没有耦合性,任何实现了协议