首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaStore.Audio.Playlists.Members.moveItem有时无法工作

MediaStore.Audio.Playlists.Members.moveItem有时无法工作
EN

Stack Overflow用户
提问于 2015-02-24 23:16:08
回答 2查看 465关注 0票数 1

我遇到了一个我自己不能处理的问题,我检查了每一行代码,但它仍然不起作用。

我有代表播放列表(普通MediaStore.Audio.Playlist)的draggable listener和用于改变歌曲顺序的drop listener。

代码语言:javascript
复制
listView.setDropListener(new DragSortListView.DropListener() {
                @Override
                public void drop(int i, int i2) {
                    if(playlistId != -1) {
                        boolean moved = MediaStore.Audio.Playlists.Members.moveItem(getContentResolver(), playlistId, i, i2);
                        System.out.println("Item moved " + moved);
                    }
                }
            });

我还有contentObserver,它可以处理游标的重新加载。

代码语言:javascript
复制
private class MyContentObserver extends ContentObserver {
    MyContentObserver(Handler handler) {
        super(handler);
    }
    @Override
    public boolean deliverSelfNotifications() {
        return true;
    }
    @Override
    public void onChange(boolean selfChange,  Uri uri) {
        super.onChange(selfChange);
        System.out.println("Updated");
    }
}

当然句柄是注册的

代码语言:javascript
复制
getContentResolver().registerContentObserver(Uri.parse("content://media"), true, contentObserver);

但这里有一个问题- moveItem总是返回true,但歌曲的顺序保持不变。在2.3.6的moveItem上完全不能工作,在4.4.2上--有时,在装有4.4.4的索尼平板电脑上--一切都运行得很好。我也尝试了这个代码,得到了相同的结果

代码语言:javascript
复制
public static final boolean moveItem(ContentResolver res,
                                     long playlistId, int from, int to) {
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
            playlistId)
            .buildUpon()
            .appendEncodedPath(String.valueOf(from))
            .appendQueryParameter("move", "true")
            .build();
    ContentValues values = new ContentValues();
    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, to);
    return res.update(uri, values, null, null) != 0;
}
EN

回答 2

Stack Overflow用户

发布于 2015-02-28 22:19:05

我已经在我的播放列表细节上实现了拖放。大多数(如果不是全部来自这个论坛)if看起来比你的方法更复杂。也许下面的代码片段将帮助您在listview (播放列表上的曲目)的行上设置一个longclicklistener

代码语言:javascript
复制
private final class MyItemLongClickListener implements OnItemLongClickListener {
    public boolean onItemLongClick(AdapterView<?> arg0, View v,
                                   int row, long rowid) {
        if (android.os.Build.VERSION.SDK_INT > 10) {
            Cursor crs = (Cursor) mAdapter.getItem(row);
            int audio_id = crs.getInt(crs.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
            int _id = crs.getInt(crs.getColumnIndex(MediaStore.Audio.Playlists.Members._ID));
            int playorder_col = crs.getColumnIndexOrThrow(MediaStore.Audio.Playlists.Members.PLAY_ORDER);
            String playorder = crs.getString(playorder_col);
            String text = row + ":" + audio_id + ":" + lngplaylist_id + ":" +
                    playorder +
                    ":" + _id;
            ClipData.Item item = new ClipData.Item(text);
            ClipData dragData = new ClipData(text, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN, ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
            dragData.addItem(new ClipData.Item(String.valueOf(row)));
            mListView.setOnDragListener(new MyDragListener());

            DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
            v.startDrag(dragData, //data to be dragged
                    shadowBuilder, //drag shadow
                    v, //local data about the drag and drop operation
                    0   //no needed flags
            );
            //            v.setVisibility(View.INVISIBLE);
            return true;
        }
        return false;
    }


  class MyDragListener implements OnDragListener {
    public int PositionOfDraggedItem = -1;
    public int PositionOfItemDraggedOver = -1;

    @Override
    public boolean onDrag(View v, DragEvent event) {
        int row = 0;
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                PositionOfDraggedItem = mListView.pointToPosition((int) (event.getX()), (int) event.getY());
                return true;
            case DragEvent.ACTION_DRAG_ENTERED:
                row = mListView.getPositionForView(mListView);
                return true;
            case DragEvent.ACTION_DRAG_LOCATION:
            case DragEvent.ACTION_DROP:

   and so on
票数 0
EN

Stack Overflow用户

发布于 2015-05-15 22:48:38

代码语言:javascript
复制
public void drop(int i, int i2) {
    if(playlistId != -1) {
        boolean moved = MediaStore.Audio.Playlists.Members.moveItem(getContentResolver(), playlistId, i, i2);
        System.out.println("Item moved " + moved);

        // scan playlists
        String url = "file://" + Environment.getExternalStorageDirectory() + "/Playlists";
        Uri uri = Uri.parse(url);
        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28699465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档