android 操作sdcard中的多媒体文件(1)——音乐列表的制作

android操作sdcard中的多媒体文件(一)——音乐列表的制作?最近做了一个android音乐播放器,个人感觉最难的就

android 操作sdcard中的多媒体文件(一)——音乐列表的制作

?

最近做了一个android音乐播放器,个人感觉最难的就是“后台播放”以及有关“播放列表”的部分,但是总算是找到了实现的方式。不同的人实现的方式可能不一样,这里我就分享一下自己对“播放列表”这个模块的一些实现方法,“后台播放”会在下一篇博文中进行介绍,希望大家也能分享一下自己的一些思路。

?? ? android使用ContentProvider来支持不同应用程序的数据共享,为了方便其他应用程序对sdcard中的数据进行操作,sdcard也提供了ContentProvider接口,这里就以访问音频文件为例,视频以及图片的操作也类似,这里就不在赘述。

  访问sdcard中的音频文件的URI为MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,为了使播放列表显示所以音乐文件的信息,这里需要查询sdcard里的音频文件,并把查询到的信息保存在Cursor中,具体代码如下:

?

?

import android.database.Cursor;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView; public class MusicListAdapter extends BaseAdapter{    private Context myCon;    private Cursor myCur;    private int pos=-1;         public MusicListAdapter(Context con,Cursor cur){        this.myCon = con;        this.myCur = cur;    }         @Override    public int getCount() {                 return this.myCur.getCount();    }     @Override    public Object getItem(int position) {                 return position;    }     @Override    public long getItemId(int position) {                 return position;    }     @Override    public View getView(int position, View convertView, ViewGroup parent) {        convertView = LayoutInflater.from(myCon).inflate(R.layout.musiclist,                null);        myCur.moveToPosition(position);        TextView videoTitle = (TextView)convertView.findViewById(R.id.musictitle);        if (myCur.getString(0).length()>24){            try {                String musicTitle = bSubstring(myCur.getString(0).trim(),24);                videoTitle.setText(musicTitle);            } catch (Exception e) {                                 e.printStackTrace();            }        }else {            videoTitle.setText(myCur.getString(0).trim());        }        TextView videoArtist = (TextView)convertView.findViewById(R.id.musicartist);        if (myCur.getString(2).equals("<unknown>")){            videoArtist.setText("未知艺术家");        }else{            videoArtist.setText(myCur.getString(2));        }        TextView videoTime = (TextView)convertView.findViewById(R.id.musictime);        videoTime.setText(toTime(myCur.getInt(1)));        ImageView videoItem = (ImageView)convertView.findViewById(R.id.musicitem);        videoItem.setImageResource(R.drawable.item);        return convertView;    }         /*时间格式转换*/    public String toTime(int time) {         time /= 1000;        int minute = time / 60;        int hour = minute / 60;        int second = time % 60;        minute %= 60;        return String.format("%02d:%02d", minute, second);    }     /*字符串裁剪*/    public static String bSubstring(String s, int length) throws Exception      {                byte[] bytes = s.getBytes("Unicode");          int n = 0; // 表示当前的字节数          int i = 2; // 要截取的字节数,从第3个字节开始          for (; i < bytes.length && n < length; i++)          {              // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节              if (i % 2 == 1)              {                  n++; // 在UCS2第二个字节时n加1              }              else            {                  // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节                  if (bytes[i] != 0)                  {                      n++;                  }              }          }          // 如果i为奇数时,处理成偶数          if (i % 2 == 1)                {              // 该UCS2字符是汉字时,去掉这个截一半的汉字              if (bytes[i - 1] != 0)                  i = i - 1;              // 该UCS2字符是字母或数字,则保留该字符              else                i = i + 1;          }                return new String(bytes, 0, i, "Unicode");      }  }

?

android操作sdcard中的多媒体文件(二)——音乐列表的更新

?

?