Intereting Posts
Связь с клиентским сервером Android Произошел утечка объекта SQLiteConnection для базы данных! Пожалуйста, исправьте свое заявление Android: Canvas.drawText () размер текста на разных разрешениях экрана Как создать собственный приватный плагин в телефонной запинке Остановка и запуск музыки при входящих вызовах Каков правильный способ импорта проекта Android Studio в репозиторий SVN? Тестирование устройств Android с помощью Junit: тестирование сетевых / bluetooth-ресурсов Android: почему мой OnKeyListener () не вызван? Правильный способ получения DisplayMetrics: getResources () или getWindowManager () «Ожидание отладчика для подключения», даже если он не работает в режиме отладки При тестировании пользовательского интерфейса Android, как правильно подождать, пока пользовательский интерфейс будет готов? Сохранение позиции в ListView после вызова notifyDataSetChanged Пользовательское название с изображением Добавление бесконечного фона параллакса в cocos2d android Android http-тестирование с помощью Robolectric

Как создать новый плейлист с помощью ContentResolver

Я пытаюсь создать новый Playlist с использованием ContentResolver Android, который будет добавлен в плейлисты музыкального плеера, но когда код запускается, вставка в список воспроизведения возвращает значение 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.3 , но не в 2.3 . Единственными проблемными областями для 4.0.3 было то, что мне нужно было убедиться, что DATE_MODIFIED был установлен в DATE_MODIFIED воспроизведения и что PLAY_ORDER был установлен в элементе Playlist.

Я до сих пор не знаю, почему он не создал плейлист на 2.x, поэтому, если у кого-то есть какие-то мысли, я бы хотел знать.

Solutions Collecting From Web of "Как создать новый плейлист с помощью ContentResolver"

Это код, который я использую в пользовательской 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 для добавления членов списка воспроизведения, вам нужен идентификатор. Чтобы добавить песни в список воспроизведения, вам также нужно знать текущую отметку высокого уровня PLAYORDER в текущем состоянии плейлиста. В противном случае MediaStore ContentResolver будет gag, потому что вы пытаетесь вставить элементы списка воспроизведения с тем же порядком воспроизведения. Таким образом, вам нужно сначала запросить плейлист Uri, чтобы получить самое высокое значение PLAYORDER, и использовать его в качестве отправной точки для вставок ContentValues.

Я только попытался вставить одного члена списка воспроизведения одновременно, хотя теоретически вы могли бы сделать объемную вставку. Код ниже настроен для преобразования в объемную вставку в будущем, но в настоящее время он только один раз вставляет. Он перемещает курсор в MediaStore.Audio.Media и вставляет их в идентификатор списка воспроизведения, который хранился в SharedPreferences.

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