2011-07-06 12 views
4

私は既に類似の質問とその回答をここや他のウェブサイトで行っています。私はまた、いくつかのデバイス(私のG2XはCyanogenMod 7.1、私の妻のHD2はカスタムROMを実行し、エミュレータはAndroid 2.1を実行しています)で動作するソリューションを持っています。しかし、私の鼻でCyanogenModを動かすのではありません。Androidでアルバムアートをフェッチする最も堅牢な方法

私の質問は、すべてのアンドロイドデバイスでアルバムアートをフェッチする最も堅牢で一般的な方法は何ですか?特定の端末、バージョン、音楽アプリケーションには何がありますか(サードパーティのプレイヤーを意味するものではありません。私はGoogle Musicと古いMusicクライアントを意味します)。私の現在のコードは次のとおりです。ここでは、事前に

// 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

答えて

15

私はメディアストアからアルバムアートを返すある一つの機能を付加することができます。関数では、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; 
} 
+0

は、あなたの答えをありがとう、URIはあなたのコード(と私)で参照してください常に有効使用していますか? sdcardがないデバイスでも? – Ani

+0

ここでは、デバイスにsdcardが挿入されている場合のみuriが必要です。 –

+0

ありがとうございました! :D –

0

このコードスニペットは、MediaStoreに存在するアルバムアートキャッシュのURIを返します。これが助けになるかもしれません。

  Cursor cursorAudio = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, {MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DATA}, MediaStore.Audio.Media.DATA+ " LIKE \"" + path+ "\"", null, null);if(cursorAudio != null && cursorAudio.moveToFirst()){ 
     Long albumId = Long.valueOf(cursorAudio.getString(cursorAudio.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))); 
     cursorAudio.close(); 
     Cursor cursorAlbum = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, MediaStore.Audio.Albums._ID+ "=" + albumId, null, null); 
     if(cursorAlbum != null && cursorAlbum.moveToFirst()){ 
      String uri = cursorAlbum.getString(cursorAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART)); 
      cursorAlbum.close(); 
      if(uri != null){ 
       return Uri.parse(uri); 
      } 
     } 
2
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id); 
ContentResolver res = context.getContentResolver(); 
InputStream in = res.openInputStream(uri); 
Bitmap artwork = BitmapFactory.decodeStream(in); 

より完全なサンプルコードは、ここでAndroidの音楽プレーヤーのソースhttps://github.com/android/platform_packages_apps_music/blob/master/src/com/android/music/MusicUtils.java方法getArtworkQuickで見つけることができます。

0

ピカソライブラリを使用してChirag Ravalの回答を修正したいと思います。それは使いやすく、非常に強力です。完全なドキュメントについては

final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart"); 
    Uri uri = ContentUris.withAppendedId(sArtworkUri, arrayList.get(i).getArt()); 
    Picasso.with(context).load(uri).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher) 
      .into(ivPic); 

this.

関連する問題