私は既に類似の質問とその回答をここや他のウェブサイトで行っています。私はまた、いくつかのデバイス(私の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
は、あなたの答えをありがとう、URIはあなたのコード(と私)で参照してください常に有効使用していますか? sdcardがないデバイスでも? – Ani
ここでは、デバイスにsdcardが挿入されている場合のみuriが必要です。 –
ありがとうございました! :D –