当前位置: 首页 > 面试题库 >

在Android中获取专辑封面的最可靠方法

张兴旺
2023-03-14
问题内容

请注意,我在这里和其他网站上已经遇到过类似的问题及其答案。我也有一种适用于某些设备的解决方案(我的G2X运行CyanogenMod
7.1,我妻子的HD2运行自定义ROM,模拟器运行Android 2.1)。但是没有,但是在我的运行CyanogenMod的Nook上可以使用。

我的问题是:在所有android设备上获取专辑封面的最可靠,最通用的方法是什么?特定设备,版本或音乐应用程序的陷阱是什么(我不是说第三方播放器,我是指Google音乐与旧版音乐客户端)?我当前的代码是:

// Is this what's making my code fail on other devices?
public final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");

// This works, and well on all devices
private int[] getAlbumIds(ContentResolver contentResolver)
{
    List<Integer> result = new ArrayList<Integer>();
    Cursor cursor = contentResolver.query(MediaStore.Audio.Media.getContentUri("external"), new String[]{MediaStore.Audio.Media.ALBUM_ID}, null, null, null);

    if (cursor.moveToFirst())
    {
        do{
            int albumId = cursor.getInt(0);
            if (!result.contains(albumId))
                result.add(albumId);
        } while (cursor.moveToNext());
    }

    int[] resultArray = new int[result.size()];
    for (int i = 0; i < result.size(); i++)
        resultArray[i] = result.get(i);

    return resultArray;
}

// This is the bit I want to make more robust, make sure that it works on all devices
private Shader getAlbumArt(ContentResolver contentResolver, int albumId, int width, int height)
{
    Uri uri = ContentUris.withAppendedId(sArtworkUri, albumId);
    InputStream input = null;
    try {
        input = contentResolver.openInputStream(uri);
        if (input == null)
            return null;

        Bitmap artwork = BitmapFactory.decodeStream(input);
        input.close();
        if (artwork == null)
            return null;

        Bitmap scaled = Bitmap.createScaledBitmap(artwork, width, height, true);
        if (scaled == null)
            return null;

        if (scaled != artwork)
            artwork.recycle();
        artwork = scaled;

        return new BitmapShader(artwork, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

在此先感谢,Ananth


问题答案:

在这里,我可以附加一个功能,即从媒体商店返回专辑封面。在函数中,我们只需要传递从Media store获得的album_id。

   public Bitmap getAlbumart(Long album_id) 
   {
        Bitmap bm = null;
        try 
        {
            final Uri sArtworkUri = Uri
                .parse("content://media/external/audio/albumart");

            Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);

            ParcelFileDescriptor pfd = context.getContentResolver()
                .openFileDescriptor(uri, "r");

            if (pfd != null) 
            {
                FileDescriptor fd = pfd.getFileDescriptor();
                bm = BitmapFactory.decodeFileDescriptor(fd);
            }
    } catch (Exception e) {
    }
    return bm;
}


 类似资料:
  • 在Java中获得文件扩展名的可靠方法是什么? 我不是在讨论对执行/,因为它对复杂的扩展(如等)毫无用处。(这是所有的库(Commons IO、Guava等)似乎都在做的。我正在寻找一种更复杂/可靠的方法来返回真正的扩展。

  • 瞧,它确实返回了一个比我最初预期的更大的数字,迫使我使用行中第一个单元格中的值作为循环的退出条件,如下所示: 这对我来说很有效,但我想知道是否有更好的方法。

  • 如果没有其他帮助,我会在我的应用程序中设置一个对话框或菜单,这样用户就可以在那里选择它。但我想先确认一下这个装置是否有可靠的可能性。

  • 问题内容: 首先,MSISDN与电话号码相同。我一直在研究是否有可能从Andoid电话中获取电话号码。 我的研究结果是肯定的。 可以使用TelephonyManager和getLine1Number()。但是,这是不可靠的。 我已经使用Motorola Atrix测试了上述内容,但该操作未检索到有效的电话号码。那么死在水中吧? 好吧,我能够使用TelephonyManager和getVoiceMa

  • 本文向大家介绍Android中检测当前是否为主线程最可靠的解决方法,包括了Android中检测当前是否为主线程最可靠的解决方法的使用技巧和注意事项,需要的朋友参考一下 如果在Android中判断某个线程是否是主线程?对于这个问题,你可能说根据线程的名字,当然这个可以解决问题,但是这样是最可靠的么?万一某天Google一下子将线程的名字改称其他神马东西呢。 方法揭晓 下面的方法是最可靠的解决方案。

  • 问题内容: 在Android中获取星期几的最简单方法是什么? 问题答案: 使用Java 类。