你应该是用Mediaplayer这个类实现播放的吧,这个类在播放时,是异步加载的,也就是说会有一段准备时间,播放的状态变化参照下图,你放在全局的话,是最先加载的,所以当你点击播放时,音乐已经准备好了,而如果设为局部,且放在onCreate里,当start调用时,音乐文件可能还没加载好。
安卓系统在开机的时候就会自动检测SD卡的文件,并将音乐文件搜集生成一个数据库文件。我们只需访问数据库表中的信息就能得到所需的文件
代码如下
<span style="font-size:14px; white-space: pre;"> </span><span style="font-size:14px;">// 获取所有歌曲
Cursor cursor = crquery(
MediaStoreAudioMediaEXTERNAL_CONTENT_URI, null, null,
null, MediaStoreAudioMediaDEFAULT_SORT_ORDER);</span>
得到cursor对象就能访问cursor里的媒体资源
if (cursormoveToFirst()) {
do {
String title = cursorgetString(cursor
getColumnIndex(MediaStoreAudioMediaTITLE));
String singer = cursorgetString(cursor
getColumnIndex(MediaStoreAudioMediaARTIST));
String album = cursorgetString(cursor
getColumnIndex(MediaStoreAudioMediaALBUM));
long size = cursorgetLong(cursor
getColumnIndex(MediaStoreAudioMediaSIZE));
long time = cursorgetLong(cursor
getColumnIndex(MediaStoreAudioMediaDURATION));
String url = cursorgetString(cursor
getColumnIndex(MediaStoreAudioMediaDATA));
int _id = cursorgetInt(cursor
getColumnIndex(MediaStoreAudioMedia_ID));
String name = cursorgetString(cursor
getColumnIndex(MediaStoreAudioMediaDISPLAY_NAME));
String sbr = namesubstring(namelength() - 3,
namelength());
} while (cursormoveToNext());
<p>
</p>
<p>
<span style="font-size:14px; color:#3366ff; background-color:rgb(255,255,255)">但是如果你的手机在开机后又下载了新的歌曲文件通过上面的方法是访问不到的,因为它还没有被加到数据表中,这样我们就要重写文件搜索的方法。</span>
</p>
<p>
<br>
</p>
<pre name="code" class="java">//获取该路径下的所有文件
public static List<String> getAllFile(String path){
List<String> fileList = new ArrayList<String>();
File folder = new File(path);
addFile(fileList, folder);
return fileList;
}
public static void addFile(List<String> fileList,File f){
if(fisDirectory()){
File[] files = flistFiles();
for(File f1 : files){
addFile(fileList, f1);
}
}else{
String filename = fgetName();
if(filenamelength()>4&&filenamesubstring(filenamelength()-4)equalsIgnoreCase("mp3")){
fileListadd(fgetAbsolutePath());
}
}
}</pre><span style="font-size:14px"><br>
</span>我们只需在需要的地方调用<pre name="code" class="java">getAllFile(EnvironmentgetExternalStorageDirectory()getAbsolutePath());</pre><br>
<br>
<pre></pre>
<p></p>
<pre></pre>
ContentResolver mResolver = getContentResolver();
Cursor cursor = mResolverquery(MediaStoreAudioMediaEXTERNAL_CONTENT_URI, null, null, null, MediaStoreAudioMediaDEFAULT_SORT_ORDER);
int i = 0;
int cursorCount = cursorgetCount();
if (cursorCount >0 )
{
cursormoveToFirst();
while (i < cursorCount)
{
//歌曲文件的路径 :MediaStoreAudioMediaDATA
url = cursorgetString(cursorgetColumnIndexOrThrow(MediaStoreAudioMediaDATA));
if(urltoLowerCase()indexOf("指定的歌曲路径") > 0)
{
}
i++;
cursormoveToNext();
}
cursorclose();
}
这是抽取专辑的方法,扫描歌曲的时候自己把歌曲的id和专辑的id传进去就能获取
private static final Uri sArtworkUri = Uri
parse("content://media/external/audio/albumart");
/
将MP3里读取出来
@param context
@param songid
@param albumid
@return
/
public static Bitmap getMusicBitemp(Context context, long songid,
long albumid) {
Bitmap bm = null;
// 专辑id和歌曲id小于0说明没有专辑、歌曲,并抛出异常
if (albumid < 0 && songid < 0) {
throw new IllegalArgumentException(
"Must specify an album or a song id");
}
try {
if (albumid < 0) {
Uri uri = Uriparse("content://media/external/audio/media/"
+ songid + "/albumart");
ParcelFileDescriptor pfd = contextgetContentResolver()
openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfdgetFileDescriptor();
bm = BitmapFactorydecodeFileDescriptor(fd);
}
} else {
Uri uri = ContentUriswithAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = contextgetContentResolver()
openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfdgetFileDescriptor();
bm = BitmapFactorydecodeFileDescriptor(fd);
} else {
return null;
}
}
} catch (FileNotFoundException ex) {
}
return bm;
}
另一种:
// 查找sdcard卡上的所有歌曲信息
public List> getMultiData() {
ArrayList> musicList = new ArrayList>();
// 加入封装音乐信息的代码
// 查询所有歌曲
ContentResolver musicResolver = thisgetContentResolver();
Cursor musicCursor = musicResolverquery(
MediaStoreAudioMediaEXTERNAL_CONTENT_URI, null, null, null,
null);
int musicColumnIndex;
if (null != musicCursor && musicCursorgetCount() > 0) {
for (musicCursormoveToFirst(); !musicCursorisAfterLast(); musicCursor
moveToNext()) {
Map musicDataMap = new HashMap();
Random random = new Random();
int musicRating = Mathabs(randomnextInt()) % 10;
musicDataMapput("musicRating", musicRating);
// 取得音乐播放路径
musicColumnIndex = musicCursor
getColumnIndex(MediaStoreAudioAudioColumnsDATA);
musicPath = musicCursorgetString(musicColumnIndex);
musicDataMapput("musicPath", musicPath);
// 取得音乐的名字
musicColumnIndex = musicCursor
getColumnIndex(MediaStoreAudioAudioColumnsTITLE);
musicName = musicCursorgetString(musicColumnIndex);
musicDataMapput("musicName", musicName);
// 取得音乐的专辑名称
musicColumnIndex = musicCursor
getColumnIndex(MediaStoreAudioAudioColumnsALBUM);
musicAlbum = musicCursorgetString(musicColumnIndex);
musicDataMapput("musicAlbum", musicAlbum);
// 取得音乐的演唱者
musicColumnIndex = musicCursor
getColumnIndex(MediaStoreAudioAudioColumnsARTIST);
musicArtist = musicCursorgetString(musicColumnIndex);
musicDataMapput("musicArtist", musicArtist);
// 取得歌曲对应的专辑对应的Key
musicColumnIndex = musicCursor
getColumnIndex(MediaStoreAudioAudioColumnsALBUM_KEY);
musicAlbumKey = musicCursorgetString(musicColumnIndex);
String[] argArr = { musicAlbumKey };
ContentResolver albumResolver = thisgetContentResolver();
Cursor albumCursor = albumResolverquery(
MediaStoreAudioAlbumsEXTERNAL_CONTENT_URI, null,
MediaStoreAudioAudioColumnsALBUM_KEY + " = ",
argArr, null);
if (null != albumCursor && albumCursorgetCount() > 0) {
albumCursormoveToFirst();
int albumArtIndex = albumCursor
getColumnIndex(MediaStoreAudioAlbumColumnsALBUM_ART);
musicAlbumArtPath = albumCursorgetString(albumArtIndex);
if (null != musicAlbumArtPath
&& !""equals(musicAlbumArtPath)) {
musicDataMapput("musicAlbumImage", musicAlbumArtPath);
} else {
musicDataMapput("musicAlbumImage",
"file:///mnt/sdcard/albjpg");
}
} else {
// 没有专辑定义,给默认
musicDataMapput("musicAlbumImage",
"file:///mnt/sdcard/albjpg");
}
musicListadd(musicDataMap);
}
}
return musicList;
}
如果我们在此基础上更深入一步,控制音乐播放的同时,我们还需要得到正在播放的音乐名称,这又该怎么实现呢?Android Framework 提供了非常棒的 androidmedia,凡音乐播放都离不开 MediaPlayer,该类定义了七个内部类,其中 MediaPlayerOnPreparedListener 是这么描述的:Interface definition for a callback to be invoked when the media source is ready for playback媒体文件准备结束,准备播放时,Android 就会调用这个这个内部类,在 MediaPlaybackService 则是 notifyChange(String what) 方法进行处理:private void notifyChange(String what) { Intent i = new Intent(what); iputExtra(”id”, IntegervalueOf(getAudioId())); iputExtra(”artist”, getArtistName()); iputExtra(”album”,getAlbumName()); iputExtra(”track”, getTrackName()); sendBroadcast(i); // …… }那么在我们的应用当中,则需要创建 一个BroadcastReceiver,过滤对应的 action name,也就是常量 META_CHANGED 对应的值即可达到目标。 查看原帖>>
以上就是关于android的本地音频播放问题为什么不能播放音乐全部的内容,包括:android的本地音频播放问题为什么不能播放音乐、android音乐播放器怎么搜索SD卡上的音乐文件、Android 怎么读取指定目录下的音乐文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)