2010-03-24 101 views
6

我想更新/插入一個新的形象在MediaStore專輯,但我不能得到它的工作..如何使用contentResolver更新專輯封面?

這是我的代碼:

public void updateAlbumImage(String path, int albumID) { 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Audio.Albums.ALBUM_ART, path); 

    int n = contentResolver.update(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, values, MediaStore.Audio.Albums.ALBUM_ID + "=" + albumID, null); 
    Log.e(TAG, "updateAlbumImage(" + path + ", " + albumID + "): " + n); 
} 

的錯誤是:

03-24 03:09:46.323: ERROR/AndroidRuntime(5319): java.lang.UnsupportedOperationException: Unknown or unsupported URL: content://media/external/audio/albums 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:131) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:111) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at android.content.ContentProviderProxy.update(ContentProviderNative.java:405) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at android.content.ContentResolver.update(ContentResolver.java:554) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at com.liviu.app.smpp.managers.AudioManager.updateAlbumImage(AudioManager.java:563) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at com.liviu.app.smpp.ShowAlbumsActivity.saveImageFile(ShowAlbumsActivity.java:375) 
03-24 03:09:46.323: ERROR/AndroidRuntime(5319):  at com.liviu.app.smpp.ShowAlbumsActivity.onClick(ShowAlbumsActivity.java:350) 

謝謝!

回答

9

看到這個職位:

Android set Album Thumbnail

您所需要的位是在這裏:

ContentResolver res = context.getContentResolver(); 
    Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id); 
    if (uri != null) { 
     InputStream in = null; 
     try { 
      in = res.openInputStream(uri); 
      return BitmapFactory.decodeStream(in, null, sBitmapOptions); 
     } catch (FileNotFoundException ex) { 
      // The album art thumbnail does not actually exist. Maybe the user deleted it, or 
      // maybe it never existed to begin with. 
      Bitmap bm = getArtworkFromFile(context, null, album_id); 
      if (bm != null) { 
       // Put the newly found artwork in the database. 
       // Note that this shouldn't be done for the "unknown" album, 
       // but if this method is called correctly, that won't happen. 

       // first write it somewhere 
       String file = Environment.getExternalStorageDirectory() 
        + "/albumthumbs/" + String.valueOf(System.currentTimeMillis()); 
       if (ensureFileExists(file)) { 
        try { 
         OutputStream outstream = new FileOutputStream(file); 
         if (bm.getConfig() == null) { 
          bm = bm.copy(Bitmap.Config.RGB_565, false); 
          if (bm == null) { 
           return getDefaultArtwork(context); 
          } 
         } 
         boolean success = bm.compress(Bitmap.CompressFormat.JPEG, 75, outstream); 
         outstream.close(); 
         if (success) { 
          ContentValues values = new ContentValues(); 
          values.put("album_id", album_id); 
          values.put("_data", file); 
          Uri newuri = res.insert(sArtworkUri, values); 
          if (newuri == null) { 
           // Failed to insert in to the database. The most likely 
           // cause of this is that the item already existed in the 
           // database, and the most likely cause of that is that 
           // the album was scanned before, but the user deleted the 
           // album art from the sd card. 
           // We can ignore that case here, since the media provider 
           // will regenerate the album art for those entries when 
           // it detects this. 
           success = false; 
          } 
         } 
         if (!success) { 
          File f = new File(file); 
          f.delete(); 
         } 
        } catch (FileNotFoundException e) { 
         Log.e(TAG, "error creating file", e); 
        } catch (IOException e) { 
         Log.e(TAG, "error creating file", e); 
        } 
       } 
      } else { 
       bm = getDefaultArtwork(context); 
      } 
      return bm; 
     } finally { 
      try { 
       if (in != null) { 
        in.close(); 
       } 
      } catch (IOException ex) { 
      } 
     } 
    } 
+0

謝謝你,它確實有效:)!對不起延遲接受這個答案。當我發佈這個問題時,沒有人回答,所以我在單獨的數據庫中創建了一個新列,但現在我遇到了同樣的問題,我搜索了一個解決方案,並且看到了您的回覆。再次感謝。 – 2012-02-12 21:19:00

+0

我認爲這段代碼是用來插入一行的。如何更新我剛插入的行? – 2015-12-10 19:14:14

+0

如果您想要更新並且不只是插入:在此代碼之前使用此代碼contentResolver.delete( ContentUris.withAppendedId(sArtworkUri,song.getAlbumID()),null,null); – 2016-01-19 07:22:31