2012-06-10 21 views
7

Android'in ContentResolver'u kullanarak, müzik çaların çalma listelerine eklenecek yeni bir Playlist oluşturmaya çalışıyorum, ancak kod çalıştığında, oynatma listesine ekleme null değerini döndürür. Uri) ve müzik çaların çalma listelerini kontrol ettiğimde yeni Playlist girişim yok. insert()'un null olması nedeninin, Playlist'i doğru şekilde oluşturmadığımdan şüpheleniyorum. Birisi, kodumun çalışmadığı sürece dinamik olarak yeni bir oynatma listesi oluşturmayı nasıl açıklayabileceğini açıklayabilir.ContentResolver'ı kullanarak yeni bir Çalma listesi oluşturma

ContentResolver resolver = getActivity().getContentResolver(); 

    Uri playlists = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI; 

    Log.d(A.TAG, "Checking for existing playlist for " + chart.getName()); 
    Cursor c = resolver.query(playlists, new String[] {"*"}, null, null, null); 
    long playlistId = 0; 
    c.moveToFirst(); 
    do { 
     String plname = c.getString(c.getColumnIndex(MediaStore.Audio.Playlists.NAME)); 
     if (plname.equalsIgnoreCase(chart.getName())) { 
      playlistId = c.getLong(c.getColumnIndex(MediaStore.Audio.Playlists._ID)); 
      break; 
     } 
    } while (c.moveToNext()); 
    c.close(); 

    if (playlistId!=0) { 
     Uri deleteUri = ContentUris.withAppendedId(playlists, playlistId); 
     Log.d(A.TAG, "REMOVING Existing Playlist: " + playlistId); 

     // delete the playlist 
     resolver.delete(deleteUri, null, null); 
    } 

    Log.d(A.TAG, "CREATING PLAYLIST: " + chart.getName()); 
    ContentValues v = new ContentValues(); 
    v.put(MediaStore.Audio.Playlists.NAME, chart.getName()); 
    v.put(MediaStore.Audio.Playlists.DATE_MODIFIED, System.currentTimeMillis()); 
    Uri newpl = resolver.insert(playlists, v); 
    Log.d(A.TAG, "Added PlayLIst: " + newpl); 

    Uri insUri = Uri.withAppendedPath(newpl, MediaStore.Audio.Playlists.Members.CONTENT_DIRECTORY); 

    int order = 1; 
    Log.d(A.TAG, "Playlist Members Url: " + insUri); 
    c = getContentManager().queryWhere(getActivity(), Song.class, Song.Fields.LIBRARYID + " != 0 and " + Song.Fields.CHARTID + " = " + chart.getId(), (String[])null); 
    if (c.moveToFirst()) { 
     Log.d(A.TAG, "Adding Songs to PlayList **"); 
     do { 
      long id = c.getLong(c.getColumnIndex(Song.Fields.LIBRARYID)); 
      ContentValues cv = new ContentValues(); 
      cv.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, order++); 
      cv.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, id); 
      Uri u = resolver.insert(insUri, cv); 
      Log.d(A.TAG, "Added Playlist Item: " + u + " for AUDIO_ID " + id); 
     } while (c.moveToNext()); 
    } 
    c.close(); 

GÜNCELLEME ... (benim arama, ben çalma listeleri sorgulamak için birkaç yol buldum, ama hiçbir şey aslında yeni bir tane oluşturur) İşte

benim kod: Kısmen Çözüldü **

Yukarıdaki kod, 4.0.3 numaralı yeni bir Çalma Listesini doğru şekilde ekliyor, ancak 2.3'da değil. 4.0.3 için tek sorun alanları, Oynatma Listesi'nde DATE_MODIFIED'un ayarlandığından ve Oynatma Listesi öğesinde PLAY_ORDER'un ayarlandığından emin olmaktı.

Niçin 2.x'te bir oynatma listesi oluşturmayacağına dair hiçbir fikrim yok. Bu nedenle, üzerinde herhangi bir düşünce varsa, bilmek isterim.

cevap

8

Bu benim özel inşa AsyncTask kullandığımız koddur ve 2.3, 3.1 ve 4.03 üzerinde çalışır:

  ContentValues mInserts = new ContentValues(); 
      mInserts.put(MediaStore.Audio.Playlists.NAME, mPrefs.getString(AM.MEDIASTORECHANGE_NEWPLAYLISTNAME, "New Playlist")); 
      mInserts.put(MediaStore.Audio.Playlists.DATE_ADDED, System.currentTimeMillis()); 
      mInserts.put(MediaStore.Audio.Playlists.DATE_MODIFIED, System.currentTimeMillis()); 
      mUri = mCR.insert(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, mInserts); 
      if (mUri != null) { 
       mPlaylistId = -1; 
       mResult = FM.SUCCESS; 
       c = mCR.query(mUri, PROJECTION_PLAYLIST, null, null, null); 
       if (c != null) { 
        // Save the newly created ID so it can be selected. Names are allowed to be duplicated, 
        // but IDs can never be. 
        mPlaylistId = c.getInt(c.getColumnIndex(MediaStore.Audio.Playlists._ID)); 
        c.close(); 
       } 
       if (DBG.AUDIO) { 
        Log.d(TAG, "PLAYLIST_ADD - mPlaylistId: " + mPlaylistId 
          + " mSelectString: " + mSelectString + " mUri: "+ mUri.toString()); 
       } 

      } 

public static final String[] PROJECTION_PLAYLIST = new String[] { 
    MediaStore.Audio.Playlists._ID, 
    MediaStore.Audio.Playlists.NAME, 
    MediaStore.Audio.Playlists.DATA 
}; 

doğru Uri çalma üye eklemek için almak için, Id gerekir. Çalma listesine şarkı eklemek için, oynatma listesinin şu anki durumunda bulunan PLAYORDER öğesinin geçerli yüksek su işaretini de bilmeniz gerekir. Aksi takdirde MediaStore ContentResolver, oynatma listesi üyelerini aynı oynatma sırasına eklemeye çalıştığınız için gag olacaktır. Dolayısıyla, en yüksek PLAYORDER değerini elde etmek için önce Playlist Uri'yi sorgulamanız ve bunu ContentValues ​​eklentileriniz için başlangıç ​​noktası olarak kullanmanız gerekir.

Her seferinde bir çalma listesi üyesi eklemeyi denedim, ancak teorik olarak toplu bir ekleme yapabileceksiniz. Aşağıdaki kod, gelecekte bir yığın eklemeye dönüştürmek üzere ayarlanmıştır, ancak şu anda yalnızca bir seferde bir tane eklenmiştir. MediaStore.Audio.Media şarkılarının imlecini alır ve bunları SharedPreferences'da depolanmış bir oynatma listesi kimliğine ekler.

private void addSongsInCursorToPlaylist(Cursor c) { 
    int mIdCol; 
    int mCount; 
    int mPercent = 0; 
    ContentResolver mCR = mContext.getContentResolver(); 
    ContentProviderClient mCRC = null; 
    try { 
     mCount = c.getCount(); 
     mIdCol = c.getColumnIndex(MediaStore.Audio.Media._ID); 
     ContentValues[] mInsertList = new ContentValues[1]; 
     mInsertList[0] = new ContentValues(); 
     int mPlaylistId = mPrefs.getInt(AM.PLAYLIST_NOWPLAYING_ID, AM.PLAYLIST_ID_DEFAULT); 
     Uri mUri = MediaStore.Audio.Playlists.Members.getContentUri("external", mPlaylistId); 
     Cursor c2 = mCR.query(mUri, 
       PROJECTION_PLAYLISTMEMBERS_PLAYORDER, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER + " DESC "); 
     int mPlayOrder = 1; 
     if (c2 != null) { 
      if (c2.moveToFirst()) { 
       mPlayOrder = (c2.getInt(c2.getColumnIndex(MediaStore.Audio.Playlists.Members.PLAY_ORDER))) + 1; 
      } 
      c2.close(); 
     } 
     mCRC = mCR.acquireContentProviderClient(mUri); 
     if (DBG.AUDIO) { 
      Log.d(TAG, "addSongsInCursorToPlaylist -Content Uri: " + mUri.toString() 
        + " PlaylistID: " + mPlaylistId + " mPlayOrder: " + mPlayOrder); 
     } 
     for (int i=0; i< mCount; i++) { 
      if (c.moveToPosition(i)) { 
       // Don't pollute with progress messages..has to be at least 1% increments 
       int mTemp = (i * 100)/(mCount); 
       if (mTemp > mPercent) { 
        mPercent = mTemp; 
        publishProgress(mPercent); 
       } 
       mInsertList[0].put(MediaStore.Audio.Playlists.Members.AUDIO_ID, c.getLong(mIdCol)); 
       mInsertList[0].put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, mPlayOrder++); 
       mCR.insert(mUri, mInsertList[0]); 
       if (DBG.AUDIO) { 
        Log.d(TAG, "addSongsInCursorToPlaylist -Adding AudioID: " + c.getLong(mIdCol) + " to Uri: " + mUri.toString() ); 
       } 
      } 
      mCRC.release(); 
     } 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 

} 
    // Projection to get high water mark of PLAY_ORDER in a particular playlist 
public static final String[] PROJECTION_PLAYLISTMEMBERS_PLAYORDER = new String[] { 
    MediaStore.Audio.Playlists.Members._ID, 
    MediaStore.Audio.Playlists.Members.PLAY_ORDER 
}; 
// Projection to get the list of song IDs to be added to a playlist 
public static final String[] PROJECTION_SONGS_ADDTOPLAYLIST = new String[] { 
    MediaStore.Audio.Media._ID, 
}; 
+1

Teşekkürler @MarkG. Sonunda işe yaradım. Benim 2.x cihazımda çalışmamanın sebebinin miui çalıştığıydı. Tahminimce miui standart oynatma listesi içerik sağlayıcısını kullanmıyor. Cihazı siyanojen mod ile tekrar çektiğimde, hepsi işe yaradı. – stuckless

+1

uygulaması bu satırda çöküyor mPlaylistId = c.getInt (c.getColumnIndex (MediaStore.Audio.Playlists._ID)); –

+1

nevermind kendi gereksinimlerime göre değiştirdim, sadece onaylamak için İmleç c = mCR.query (mUri, PROJECTION_PLAYLIST, null, null, MediaStore.Audio.Playlists.DATE_MODIFIED); if (c! = Null) \t c.moveToLast(); –