码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-07-03 18:49:56      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

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();

 

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

标签:

原文地址:http://www.cnblogs.com/chengbao/p/5638496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!