7

PlaylistAndroidを使用して、音楽プレーヤーのプレイリストに追加される新しいを作成しようとしてContentResolverいますが、コードが実行されると、プレイリストへの挿入はnullを返します(のUri場合)。音楽プレーヤーのプレイリストを確認すると、新しいPlaylistエントリが表示されます。ありません。insert()nullが返されるのは、プレイリストを正しく作成していないためだと思います。私のコードが機能しない場合、誰かが新しいプレイリストを動的に作成する方法を明確にすることができますか?(私の検索では、プレイリストをクエリするいくつかの方法を見つけましたが、実際には新しいものを作成するものはありません)

これが私のコードです...

    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.32.3。の唯一の問題領域は、プレイリストに設定されていることと、プレイリストアイテムに設定されて 4.0.3いることを確認する必要があることでした。DATE_MODIFIEDPLAY_ORDER

2.xでプレイリストが作成されない理由はまだわかりません。そのため、誰かがそれについて考えている場合は、知りたいと思います。

4

1 に答える 1

8

これは、カスタムビルドのAsyncTaskで使用するコードであり、2.3、3.1、および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
};

プレイリストメンバーを追加するための正しいURIを取得するには、IDが必要です。プレイリストに曲を追加するには、プレイリストの現在の状態でのPLAYORDERの現在の最高水準点も知っている必要があります。そうしないと、同じ再生順序でプレイリストメンバーを挿入しようとしているため、MediaStoreContentResolverがギャグします。したがって、最初にプレイリストURIをクエリして、最大のPLAYORDER値を取得し、それをContentValues挿入の開始点として使用する必要があります。

一度に1つのプレイリストメンバーを挿入しようとしましたが、理論的には一括挿入ができる場合があります。以下のコードは、将来的に一括挿入に変換するように設定されていますが、現在、一度に1つの挿入のみを実行します。MediaStore.Audio.Mediaの曲のカーソルを取得し、SharedPreferencesに保存されているプレイリストIDに挿入します。

    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,
};
于 2012-07-18T15:14:32.427 に答える