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

简介:

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

原文地址

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

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

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

<pre>Cursor c = this .getContentResolver().</pre>
<pre>query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,</pre>
/*这个字符串数组表示要查询的列*/
new  String[]{MediaStore.Video.Media.TITLE, //音乐名
MediaStore.Audio.Media.DURATION, //音乐的总时间
MediaStore.Audio.Media.ARTIST, //艺术家
MediaStore.Audio.Media._ID, //id号
MediaStore.Audio.Media.DISPLAY_NAME, //音乐文件名
MediaStore.Audio.Media.DATA          //音乐文件的路径
},
null ,                       //查询条件,相当于sql中的where语句
null ,                       //查询条件中使用到的数据
null );                      //查询结果的排序方式
  通过MediaStore.Audio.Media.XXX来访问音乐文件的一些信息,这里只列出了一部分,可以根据需要进行增添和删除。
 至此,Cursor c就已经保存了sdcard内所以音频文件的信息,下面的操作就是围绕这个Cursor展开的。
首先定义三个数组:
private  int [] _ids;     //存放音乐文件的id数组
private  String[] _titles;  //存放音乐文件的标题数组
private  String[] _path; //存放音乐文件的路径
_ids保存了所有音乐文件的_ID,用来确定到底要播放哪一首歌曲,_titles存放音乐名,用来显示在播放界面,而_path存
放音乐文件的路径(删除文件时会用到)。
  接下来再定义一个变量,用来定位选择的是哪一首音乐:
private int pos;
  接下来将音乐文件的信息存放在相应的数组中:  
c.moveToFirst();
_ids = new  int [c.getCount()];
_titles = new  String[c.getCount()];
_path = new  String[c.getCount()];
for ( int  i=0;i<c.getCount();i++){
_ids[i] = c.getInt(3);          
_titles[i] = c.getString(0);
_path[i] = c.getString(5).substring(4);
c.moveToNext();
}        
有人可能会问为什么获取路径的格式是_path[i]=c.geString(5).substring(4)?因为MediaStore.Audio.Media.DATA
得到的内容格式为/mnt/sdcard/[子文件夹名/]音乐文件名,而我们想要得到的是/sdcard/[子文件夹名]音乐文件名,
所以要做相应的裁剪操作。
  接下来把Cursor中的信息显示到listview中:
MusicListAdapter adapter = new  MusicListAdapter( this , c);
listview.setAdapter(adapter);
MusicListAdapter是一个自定义的Adapter,继承自BaseAdapter,这里只贴出代码,不做讲解。
package com.alex.video;
 
import android.content.Context;
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" );
}
}
 
这样,音乐的信息就显示在了列表中了
 

下一节将讲解更新列表的操作。



本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/3429414.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
4月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
284 1
|
6月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
122 0
|
4月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
132 1
|
4月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
121 0
|
4月前
|
Android开发 开发者 UED
Android项目架构设计问题之加载数据到列表如何解决
Android项目架构设计问题之加载数据到列表如何解决
34 0
|
6月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
6月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
5月前
|
Android开发
Android kernel 操作gpio
Android kernel 操作gpio
50 0