7

का उपयोग कर एक नई प्लेलिस्ट कैसे बनाएं I एंड्रॉइड के ContentResolver का उपयोग करके एक नया Playlist बनाने का प्रयास कर रहा है, जिसे संगीत प्लेयर की प्लेलिस्ट में जोड़ा जाएगा, लेकिन जब कोड चलता है, तो प्लेलिस्ट में डालने से शून्य मिलती है (के लिए Uri) और जब मैं संगीत प्लेयर की प्लेलिस्ट की जांच करता हूं, तो मेरी नई Playlist प्रविष्टि नहीं है। मुझे संदेह है कि insert() शून्य लौटाता है क्योंकि मैंने प्लेलिस्ट को सही तरीके से नहीं बनाया है। क्या कोई यह स्पष्ट कर सकता है कि गतिशील रूप से एक नई प्लेलिस्ट कैसे बनाएं, यह देखते हुए कि मेरा कोड काम नहीं करता है। (मेरी खोज में, मैं कई तरह से प्लेलिस्ट क्वेरी करने के लिए मिल गया है, लेकिन कुछ भी वास्तव में उसकी जगह एक नया)ContentResolver

यहाँ मेरी कोड है ...

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(); 

अद्यतन: आंशिक रूप से हल **

उपरोक्त कोड 4.0.3 पर एक नई प्लेलिस्ट सही ढंग से जोड़ता है, लेकिन 2.3 पर नहीं। के लिए एकमात्र समस्या क्षेत्र यह था कि मुझे यह सुनिश्चित करने की आवश्यकता है कि DATE_MODIFIED प्लेलिस्ट पर सेट किया गया था और PLAY_ORDER प्लेलिस्ट आइटम पर सेट किया गया था।

मुझे अभी भी पता नहीं है कि यह 2.x पर प्लेलिस्ट क्यों नहीं बनाएगा, इसलिए अगर किसी के पास कोई विचार है, तो मैं जानना चाहता हूं। आप ईद की जरूरत

  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 
}; 

सही उरी प्लेलिस्ट सदस्य जोड़ने के लिए प्राप्त करने के लिए,:

उत्तर

8

इस कोड को मैं एक कस्टम निर्मित AsyncTask में उपयोग है और यह 2.3, 3.1, और 4.03 पर काम करता है। प्लेलिस्ट में गाने जोड़ने के लिए, आपको प्लेलिस्ट के वर्तमान स्थिति में प्लेडर के वर्तमान उच्च जल चिह्न को भी जानने की आवश्यकता है। अन्यथा MediaStore ContentResolver gag जाएगा क्योंकि आप एक ही प्ले ऑर्डर के साथ प्लेलिस्ट सदस्यों को सम्मिलित करने का प्रयास कर रहे हैं। इसलिए, आपको उच्चतम प्लेडर मूल्य प्राप्त करने के लिए पहले प्लेलिस्ट उरी से पूछताछ करने की आवश्यकता है, और इसे अपने ContentValues ​​प्रविष्टियों के प्रारंभिक बिंदु के रूप में उपयोग करें।

मैंने एक समय में केवल एक प्लेलिस्ट सदस्य डालने का प्रयास किया है, हालांकि सिद्धांत में आप एक थोक सम्मिलित करने में सक्षम हो सकते हैं। नीचे दिया गया कोड भविष्य में एक थोक सम्मिलन में कनवर्ट करने के लिए सेट किया गया है, लेकिन वर्तमान में केवल एक ही समय में एक सम्मिलित करता है। यह MediaStore.Audio.Media गाने का कर्सर लेता है और उन्हें प्लेलिस्ट आईडी में डालता है जिसे साझा किए गए संदर्भों में संग्रहीत किया गया है।

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

धन्यवाद @ मार्कग। अंततः मुझे यह काम मिल गया। ऐसा लगता है कि यह मेरे 2.x डिवाइस पर काम नहीं कर रहा था यह था कि यह miui चल रहा था। मुझे लगता है कि miui मानक प्लेलिस्ट सामग्री प्रदाता का उपयोग नहीं कर रहा है। जब मैंने साइनोजन मोड के साथ डिवाइस को रीफ्लैश किया, तो यह सब काम किया। – stuckless

+1

ऐप इस लाइन पर क्रैश हो रहा है mPlaylistId = c.getInt (c.getColumnIndex (MediaStore.Audio.Playlists._ID)); –

+1

मैंने कभी भी अपनी खुद की जरूरतों के अनुसार इसे बदल दिया, बस कर्सर सी = mCR.query (mUri, PROJECTION_PLAYLIST, null, null, mediaStore.Audio.Playlists.DATE_MODIFIED) की पुष्टि करने के लिए; अगर (सी! = शून्य) { \t c.moveToLast(); –

संबंधित मुद्दे