`
folksy
  • 浏览: 159831 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android自带音乐播放器专辑图片相同的问题

阅读更多

音乐播放器是从MediaProvider中获取音乐和音乐信息的,在插入SD卡后,MediaProvider启动扫描服务,文件解析通过opencore操作,扫描到的媒体文件由MediaProvider来保存到数据库,数据库位于

/data/data/com.android.providers.media/databases/external-*.db

 

 

在扫描时,扫描到的专辑图片存放于

Android/data/com.android.providers.media/albumthumbs/

 

 

专辑图片选用优先选择音乐内嵌专辑图片

 

如果音乐没有内嵌专辑图片,则在音乐目录下搜索(忽略根目录和下载目录)

 

             0 AlbumArt.jpg
             1 AlbumArt*Large.jpg
             2 Any other jpg image with 'albumart' anywhere in the name
             3 Any other jpg image
             4 any other png image

 

 

对于扫描的过程,详细可分析文件:

/android-2.2/packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java

 

 

 

 private ParcelFileDescriptor makeThumbInternal(ThumbData d) ---> getCompressedAlbumArt(getContext(), d.path);

 

 

 

如果音频文件中有专辑图片,用音频里的图片,如果没有,则按如下策略选择图片。    

    // Extract compressed image data from the audio file itself or, if that fails,
    // look for a file "AlbumArt.jpg" in the containing directory.

    private static byte[] getCompressedAlbumArt(Context context, String path) {
        byte[] compressed = null;

        try {
            File f = new File(path);
            ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f,
                    ParcelFileDescriptor.MODE_READ_ONLY);

            MediaScanner scanner = new MediaScanner(context);
            compressed = scanner.extractAlbumArt(pfd.getFileDescriptor());
            pfd.close();

            // If no embedded art exists, look for a suitable image file in the
            // same directory as the media file, except if that directory is
            // is the root directory of the sd card or the download directory.
            // We look for, in order of preference:
            // 0 AlbumArt.jpg
            // 1 AlbumArt*Large.jpg
            // 2 Any other jpg image with 'albumart' anywhere in the name
            // 3 Any other jpg image
            // 4 any other png image

           
            if (compressed == null && path != null) {
                int lastSlash = path.lastIndexOf('/');
                if (lastSlash > 0) {

                    String artPath = path.substring(0, lastSlash);
                    String sdroot = Environment.getExternalStorageDirectory().getAbsolutePath();
                    String dwndir = Environment.getExternalStoragePublicDirectory(
                            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();

                    String bestmatch = null;
                    synchronized (sFolderArtMap) {
                        if (sFolderArtMap.containsKey(artPath)) {
                            bestmatch = sFolderArtMap.get(artPath);
                        } else if (!artPath.equalsIgnoreCase(sdroot) &&
                                !artPath.equalsIgnoreCase(dwndir)) {
                            File dir = new File(artPath);
                            String [] entrynames = dir.list();
                            if (entrynames == null) {
                                return null;
                            }
                            bestmatch = null;
                            int matchlevel = 1000;
                            for (int i = entrynames.length - 1; i >=0; i--) {
                                String entry = entrynames[i].toLowerCase();
                                if (entry.equals("albumart.jpg")) {
                                    bestmatch = entrynames[i];
                                    break;
                                } else if (entry.startsWith("albumart")
                                        && entry.endsWith("large.jpg")
                                        && matchlevel > 1) {
                                    bestmatch = entrynames[i];
                                    matchlevel = 1;
                                } else if (entry.contains("albumart")
                                        && entry.endsWith(".jpg")
                                        && matchlevel > 2) {
                                    bestmatch = entrynames[i];
                                    matchlevel = 2;
                                } else if (entry.endsWith(".jpg") && matchlevel > 3) {
                                    bestmatch = entrynames[i];
                                    matchlevel = 3;
                                } else if (entry.endsWith(".png") && matchlevel > 4) {
                                    bestmatch = entrynames[i];
                                    matchlevel = 4;
                                }
                            }
                            // note that this may insert null if no album art was found
                            sFolderArtMap.put(artPath, bestmatch);
                        }
                    }

                    if (bestmatch != null) {
                        File file = new File(artPath, bestmatch);
                        if (file.exists()) {
                            compressed = new byte[(int)file.length()];
                            FileInputStream stream = null;
                            try {
                                stream = new FileInputStream(file);
                                stream.read(compressed);
                            } catch (IOException ex) {
                                compressed = null;
                            } finally {
                                if (stream != null) {
                                    stream.close();
                                }
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
        }

        return compressed;
    }

分享到:
评论

相关推荐

    Android 简易音乐播放器源码.rar

    而“Android 简易音乐播放器源码”很可能是整个项目的源代码文件夹,包含了所有的.java或.kt文件,以及可能的资源文件(如图片、xml布局文件等)。 通过学习和分析这个源码,开发者不仅可以掌握Android音乐播放器的...

    基于Android开发的音乐播放器

    MediaPlayer是Android自带的音频播放组件,支持多种音频格式,而ExoPlayer则提供了更高级的功能和更好的性能,尤其适合复杂的媒体播放需求。 5. **歌手专辑**:歌手和专辑的信息同样需要从服务器获取,然后在UI上...

    android 多功能播放器的设计,含源代码

    音乐播放器通常需要处理音频流的解码和播放,这可能涉及到了如MP3、AAC、FLAC等多种音频格式的支持。开发者可能使用了Android自带的MediaPlayer类或者第三方库如ExoPlayer来实现。视频播放器则需要处理视频流的解码...

    使用Android自带的Gallery控件实现CoverFlow

    `CoverFlow`效果是一种流行的设计模式,通常用于音乐播放器或图片浏览器,它呈现了一个富有立体感的视图,当前选中的元素居中且放大,两侧的元素则以一定的角度偏移并缩小。 要实现`CoverFlow`效果,我们需要做以下...

    MusicPlayer.rar

    2. 播放控制:项目使用Android自带的MediaPlayer类来播放音乐。MediaPlayer提供了播放、暂停、停止、快进、后退等基本操作,并支持流媒体播放。 3. 用户界面(UI):UI设计通常包含音乐列表、播放进度条、播放模式...

    Android的多媒体系统

    6. **ExoPlayer**: 虽然不是Android系统自带的组件,但ExoPlayer是由Google开发的一个强大且灵活的媒体播放器库,它比MediaPlayer更适合复杂的应用场景,如自定义渲染、多轨音频、DASH和HLS流媒体支持等。...

    Android 高斯模糊

    这种效果常被应用在音乐播放器等应用中,如将专辑封面图片进行模糊处理,用作背景,以营造出优雅且不干扰主要内容的界面设计。下面我们将深入探讨Android中实现高斯模糊的方法。 1. **基础知识**: - **Bitmap**:...

    应用源码之_packages_apps_apolloMod-master.zip

    "ApolloMod"可能是一个音乐播放器应用的修改版,因为原版的Apollo是Android系统自带的音乐播放器。"master"通常指的是Git仓库的主要分支,意味着这是项目的核心版本。 在Android源码学习中,我们主要会涉及到以下几...

    android 入门资料

    通过这个入门资料,你可以逐步学习和实践以上知识点,最终制作出自己的手机播放器、音乐应用或者各种创新的视频软件。随着技术的深入,你还可以学习更多高级主题,如Fragment管理、多进程通信、数据库操作、网络编程...

    Android操作系统详解[收集].pdf

    - **Music.apk**:音乐播放器,支持本地音乐播放。 - **MyFaves.apk**:T-Mobile定制应用程序,提供快速拨号功能。 - **PackageInstaller.apk**:APK安装程序,用于安装新应用程序。 - **Phone.apk**:电话拨号器,...

    MusicPlayer。安卓

    《MusicPlayer:安卓音乐播放器的设计与实现》 在当今移动设备盛行的时代,音乐播放器作为智能手机必备的应用之一,扮演着至关重要的角色。本篇将深入探讨“MusicPlayer”这款专为安卓平台设计的音乐播放软件,从其...

    影音管理系统

    3. **元数据编辑**:影音管理系统允许用户编辑媒体文件的元数据,如添加封面图片、修改歌曲标题、艺术家信息、专辑详情等,确保媒体库的整洁和准确性。 4. **媒体搜索**:内置强大的搜索引擎是影音管理系统的核心...

    JAVA上百实例源码以及开源项目源代码

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

Global site tag (gtag.js) - Google Analytics