2012-06-10 17 views
7

Ich versuche, eine neue Playlist zu erstellen, die ContentResolver von Android verwendet, die den Wiedergabelisten des Musik-Players hinzugefügt wird, aber wenn der Code ausgeführt wird, gibt die Einfügung in die Playlist null zurück (für die Uri) und wenn ich die Wiedergabelisten des Musik-Players überprüfe, ist mein neuer Eintrag Playlist nicht da. Ich vermute, dass der Grund dafür, dass insert() null zurückgibt, ist, weil ich die Playlist nicht korrekt erstellt habe. Könnte jemand erklären, wie man dynamisch eine neue Wiedergabeliste erstellt, da mein Code nicht funktioniert. (In meiner Suche, ich habe festgestellt, mehrere Art und Weise Playlisten abfragen, aber nichts schafft tatsächlich einen neuen)Erstellen einer neuen Playlist mit ContentResolver

Hier ist mein Code ...

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

UPDATE: teilweise gelöst **

Der obige Code fügt korrekt eine neue Playlist unter 4.0.3 hinzu, aber nicht unter 2.3. Das einzige Problem Bereiche für 4.0.3 war, dass ich sicherstellen musste, dass die DATE_MODIFIED wurde auf der Playlist gesetzt und dass PLAY_ORDER wurde auf der Playlist Artikel eingestellt.

Ich habe immer noch keine Idee, warum es keine Playlist auf 2.x erstellen würde, also wenn jemand darüber Gedanken hat, würde ich gerne wissen.

Antwort

8

Dies ist der Code, den ich in einem speziell angefertigten AsyncTask verwenden und es funktioniert auf 2.3, 3.1 und 4.03:

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

Um die richtige Uri Playlist Mitglieder hinzuzufügen erhalten Sie die Id brauchen. Um Titel zur Wiedergabeliste hinzuzufügen, müssen Sie auch die aktuelle Hochwassermarke von PLAYORDER im aktuellen Status der Wiedergabeliste kennen. Andernfalls wird der MediaStore ContentResolver geknebelt, weil Sie versuchen, Playlist-Mitglieder mit derselben Abspielreihenfolge einzufügen. Sie müssen also zuerst die Playliste Uri abfragen, um den höchsten PLAYORDER-Wert zu erhalten, und diesen als Startpunkt für Ihre ContentValues-Inserts verwenden.

Ich habe nur versucht, eine Wiedergabeliste Mitglied zu einer Zeit, obwohl in der Theorie können Sie möglicherweise eine Massen einfügen einfügen. Der folgende Code ist so konfiguriert, dass er in Zukunft in eine Masseneinfügung konvertiert werden kann. Derzeit wird jedoch nur jeweils eine Einfügung vorgenommen. Es nimmt einen Cursor von MediaStore.Audio.Media-Songs und fügt sie in eine Playlist-ID ein, die in SharedPreferences gespeichert wurde.

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

Dank @MarkG. Ich habe schließlich das funktioniert. Es scheint, dass der Grund, warum es nicht auf meinem 2.x-Gerät funktionierte, war, dass es miui lief. Ich vermute, miui verwendet nicht den Standard-Playlist-Content-Provider. Als ich das Gerät mit Cyanomod umflaggte, hat alles funktioniert. – stuckless

+1

App stürzt bei dieser Zeile ab mPlaylistId = c.getInt (c.getColumnIndex (MediaStore.Audio.Playlists._ID)); –

+1

grevermind ich änderte es nach meinen eigenen Bedürfnissen, nur um zu bestätigen Cursor c = MCR.query (mUri, PROJECTION_PLAYLIST, null, null, MediaStore.Audio.Playlists.DATE_MODIFIED); if (c! = Null) { \t c.moveToLast(); –

Verwandte Themen