我的音乐播放器(3)逻辑代码

package com.jk.activity;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;

import com.jk.impl.IMusic;
import com.jk.impl.onMusicOver;
import com.jk.service.musicService;

public class MainActivity extends Activity {
    ListView lv_sing;
    SeekBar seekbar;
    ImageView iv_zt, iv_up, iv_play, iv_next, iv_list;
    private SimpleAdapter adapter;

    private List<Map<String, String>> musicList = new ArrayList<Map<String, String>>();
    private String musicPath;
    private String musicName;
    private String musicAlbum;
    private String musicArtist;
    private String musicAlbumKey;
    private String musicAlbumArtPath;
    private IMusic binder;
    private int musicid=10000;
    private String action = "com.jk.service.musicservice";
    private boolean f = false;
    private int size=0;
    private int musicTime;
    private long mExitTime = 0;
    Intent in = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.mainactivity);
        musicList = loadSongs();
        intitView();
        if (musicList.size() > 0) {
            //绑定服务
            in = new Intent(MainActivity.this, musicService.class);
            in.putExtra("path", musicList.get(0).get("path"));
            bindService(in, conn, BIND_AUTO_CREATE);
        }
        initEvent();
    }

    /**
     * 初始化事件监听
     */
    private void initEvent() {
        lv_sing.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Map<String, String> m = new HashMap<String, String>();
                m = musicList.get(position);
                if(musicid==Integer.parseInt(m.get("id"))){//点击同一首歌
                    start(null);//改变播放状态
                }else{
                    musicid = Integer.parseInt(m.get("id"));
                    if (binder != null) {
                        binder.dorevmo();//handle.removeCallbacks(runnable);
             binder.doRset();//mp.release();
             unbindService(conn);
             in.putExtra("path", m.get("path"));
             bindService(in, conn, Context.BIND_AUTO_CREATE);

                    new Thread(new Runnable() {//初始化seekbar
                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    Thread.sleep(500);
                                    if (binder != null) {
                                        binder.init(seekbar, new onMusicOver() {
                                            @Override
                                            public void onMusicOver() {
                                                // TODO Auto-generated method stub
                                                next(null);
                                            }
                                        });

                                    }
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }

                            }
                        }).start();

                        f = true;
                        iv_play.setBackgroundResource(R.drawable.start);
                    }
                }
            }
        });
    }
    public void start(View v){
        Log.i("tag", "start"+f);
        if(f){//正在播放
            binder.dopause();
            iv_play.setBackgroundResource(R.drawable.start);
            f = false;
        }else{
            binder.dostart();
            iv_play.setBackgroundResource(R.drawable.pause);
            f = true;
        }
    }
    public void next(View v){
        Map<String, String> m = new HashMap<String, String>();
        musicid = (musicid+1)%musicList.size();
        m = musicList.get(musicid);
        if (binder != null) {
            binder.dorevmo();
            binder.doRset();//mp.release();
            unbindService(conn);
            in.putExtra("path", m.get("path"));
            bindService(in, conn, Context.BIND_AUTO_CREATE);
            new Thread(new Runnable() {//初始化seekbar
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        Thread.sleep(500);
                        if (binder != null) {
                            binder.init(seekbar, new onMusicOver() {
                                @Override
                                public void onMusicOver() {
                                    next(null);
                                }
                            });

                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }).start();

            f = true;
            iv_play.setBackgroundResource(R.drawable.start);
        }
    }
    /**
     * 视图初始化
     */
    private void intitView() {
        lv_sing = (ListView) findViewById(R.id.lv_sing);
        seekbar = (SeekBar) findViewById(R.id.seekBar1);
        iv_zt = (ImageView) findViewById(R.id.img_zj);
        iv_up = (ImageView) findViewById(R.id.img_up);
        iv_play = (ImageView) findViewById(R.id.img_pause);
        iv_next = (ImageView) findViewById(R.id.img_next);
        iv_list = (ImageView) findViewById(R.id.img_menu);

        adapter = new SimpleAdapter(getApplicationContext(), musicList,
                R.layout.song_item, new String[] { "musicName", "musicArtist",
            "musicTime", "musicPath", "musicRating" }, new int[] {
            R.id.tv_name, R.id.tv_songer, R.id.tv_time,
            R.id.tv_musicPath, R.id.tv_musicRating });
        lv_sing.setAdapter(adapter);
    }
    ServiceConnection conn = new ServiceConnection() {
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            System.out.println("onServiceDisconnected");
        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            System.out.println("onServiceConnected");
            binder = (IMusic) service;

        }

    };

    /**
     * 获取歌曲信息
     * @return
     */
    public List<Map<String, String>> loadSongs() {
        // 查找sdcard卡上的所有歌曲信息
        // 加入封装音乐信息的代码
        // 查询所有歌曲
        ContentResolver musicResolver = this.getContentResolver();
        Cursor musicCursor = musicResolver.query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
                MediaStore.Audio.Media.SIZE + ">80000", null, null);
        int musicColumnIndex;
        if (null != musicCursor && musicCursor.getCount() > 0) {
            for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor
                    .moveToNext()) {
                Map musicDataMap = new HashMap();

                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns._ID);
                int musicRating = musicCursor.getInt(musicColumnIndex);
                musicDataMap.put("musicRating", musicRating + "");
                musicDataMap.put("id",size+"");
                size=size+1;
                // 取得音乐播放路径
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
                musicPath = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("musicPath", musicPath);
                // 取得音乐的名字
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);
                musicName = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("musicName", musicName);
                // 取得音乐的专辑名称
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);
                musicAlbum = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("musicAlbum", musicAlbum);
                // 取得音乐的演唱者
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);
                musicArtist = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("musicArtist", musicArtist);
                // 取得歌曲对应的专辑对应的Key
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY);
                musicAlbumKey = musicCursor.getString(musicColumnIndex);
                // 取得歌曲的大小
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.DURATION);
                musicTime = musicCursor.getInt(musicColumnIndex);

                //
                // Time musicTime = new Time();
                // musicTime.set(musicTime);
                String readableTime =  ":" ;
                int m=musicTime% 60000/1000;
                int o=musicTime / 60000;
                if(o==0){
                    readableTime="00"+readableTime;
                }else if(0<o&&o<10){
                    readableTime="0"+o+readableTime;
                }else{
                    readableTime=o+readableTime;
                }
                if(m<10){
                    readableTime=readableTime+"0"+m;
                }else{
                    readableTime=    readableTime+m;
                }
                musicDataMap.put("musicTime", readableTime);
                //
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
                String path = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("path", path);

                //
                musicColumnIndex = musicCursor
                        .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);
                String display = musicCursor.getString(musicColumnIndex);
                musicDataMap.put("displayName", display);

                String[] argArr = { musicAlbumKey };
                ContentResolver albumResolver = this.getContentResolver();
                Cursor albumCursor = albumResolver.query(
                        MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null,
                        MediaStore.Audio.AudioColumns.ALBUM_KEY + " = ?",
                        argArr, null);
                if (null != albumCursor && albumCursor.getCount() > 0) {
                    albumCursor.moveToFirst();
                    int albumArtIndex = albumCursor
                            .getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART);
                    musicAlbumArtPath = albumCursor.getString(albumArtIndex);
                    if (null != musicAlbumArtPath
                            && !"".equals(musicAlbumArtPath)) {
                        musicDataMap.put("musicAlbumImage", musicAlbumArtPath);
                    } else {
                        musicDataMap.put("musicAlbumImage",
                                "");
                    }
                } else {
                    // 没有专辑定义,给默认图片
                    musicDataMap.put("musicAlbumImage",
                            "");
                }
                musicList.add(musicDataMap);
            }
        }
        return musicList;

    }

    public static byte[] read(InputStream in) {
        // TODO Auto-generated method stub
        ByteArrayOutputStream outs = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        try {
            while ((len = in.read(buffer)) != -1) {
                outs.write(buffer, 0, len);
            }
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return outs.toByteArray();
    }

}

播放歌曲改变后,先将前一个播放的进度线程移除handler,

释放资源,解除绑定,重新绑定

binder.dorevmo();//handle.removeCallbacks(runnable);
  binder.doRset();//mp.release();
  unbindService(conn);
  in.putExtra("path", m.get("path"));
  bindService(in, conn, Context.BIND_AUTO_CREATE);
 使用一个线程来执行seekbar的初始化,和播放完成回调方法的设置

new Thread(new Runnable() {//初始化seekbar
                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    Thread.sleep(500);
                                    if (binder != null) {
                                        binder.init(seekbar, new onMusicOver() {
                                            @Override
                                            public void onMusicOver() {
                                                // TODO Auto-generated method stub
                                                next(null);
                                            }
                                        });

                                    }
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }

                            }
                        }).start();
时间: 2024-10-17 02:38:37

我的音乐播放器(3)逻辑代码的相关文章

基于jQuery仿QQ音乐播放器网页版代码

基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m_player" id="divplayer" role="application" onselectstart="return false" style="left: 0px;"> <div class=&

音乐播放器的实现

音乐播放器的实现 我用的是网易云音乐的外链播放器,其他的播放器也大都差不多,只不过个人比较喜欢网易云音乐的歌单,如果歌单内容有变化的话,播放列表会随之更新,还是比较不错的. 实现步骤 找到自己喜欢的歌单,然后进入页面会看见生成外链播放器的选项,点击进入之后,根据自己的需求来配置相关选项,然后复制最后的代码,直接粘贴到markdown文件之中就OK了. 大专栏  音乐播放器的实现代码是我本页面播放器的代码:" class="headerlink" title="下面的

html 音乐 QQ播放器 外链 代码 播放器 外链 代码

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha QQ播放器 外链 代码 播放器 外链 代码 ======== 歌曲链接 QQ播放器 外链 代码 播放器 外链 代码 <EMBED src="音乐url" autostart="true" loop="true" width="80" height="20"> 在网易云音乐, 搜索一首

JS单曲调用百度mp3音乐播放器代码

在网上找的单曲调用百度mp3音乐播放器的代码,改了改,文本框输入歌曲名,中文逗号,歌手名,回车就可以试听了.几点说明:  百度音乐api 音乐文件地址,span,p,div,等都可以,ID 必须是songplay:  参数说明,第一个是歌曲名字,第二个是演唱者,最后一个如果为空则自动播放,不为空则手动播放.  参数间用中文逗号 , 分隔 ,点击按钮或者回车都可以播放. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN

每天看一片代码系列(三):codepen上一个音乐播放器的实现

今天我们看的是一个使用纯HTML+CSS+JS实现音乐播放器的例子,效果还是很赞的: codePen地址 HTML部分 首先我们要思考一下,一个播放器主要包含哪些元素.首先要有播放的进度信息,还有播放/暂停或者上一首下一首等必要的按钮,同时还要显示一些当前播放的音乐名称等信息.播放多首歌曲时,要显示播放列表...因此,从语义上可以构造出基本的HTML结构: // 背景区块,用于显示当前播放音乐的图片 <div class='background' id='background'></di

网站添加左下角某易云音乐播放器代码

<!-- 音乐播放器 --><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css"> <div class="aplayer" data-id="2440040711" data-server="netease" data-type="playlis

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

4个小时实现一个HTML5音乐播放器

技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐播放器就要非常了解在Web中音频播放的方式,通常都采用HTML5的audio标签关于audio标签,它有大量的属性.方法和事件,在这里我就做一个大致的介绍. 属性:src:必需,音频来源:controls:常见,设置后显示浏览器默认的audio控制面板,不设置默认隐藏audio标签:autoplay

一步一步实战HTML音乐播放器

在这里我用HTML5从头开始一步一步来制作一个简约的音乐播放器,大家可以参考一下,接下来正式开始. 音乐播放器效果 播放器分析 这里将播放器分两块来做: 视图层(html + css) 逻辑层 ( js ) 视图层分析 视图中包含: 播放器容器 播放器名称 音乐专辑图 音乐信息 歌曲名 歌手 专辑名 控制区 上一曲 播放 下一曲 播放进度条 播放时间 当前时间 歌曲总时间 音频控件 页面背景 逻辑层分析 逻辑层处理包括: 加载歌单 渲染歌曲信息 专辑图 歌曲名 歌手 专辑名 歌曲时长 歌曲音频地

Android开发6:Service的使用(简单音乐播放器的实现)

前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service 进行后台工作, 学会使用 Service 与 Activity 进行通信,并在此知识基础上学会使用 MediaPlayer和简单的多线程编程.使用 Handle 更新 UI,并设计成功一个简单的音乐播放器. 是不是很高大上呢~一起来学习~ 基础知识 Service作为Android四大组件之一,在每