Android系统客户预置的铃声默认在铃声列表的最前面

客户需求:
客户预置的铃声默认在铃声列表的最前面。
解决方法:
需要对读取铃声的getCursor()和getNewCursor()重新排序后赋值
首先读取需要排列表最前面的铃声,然后在取出剩余铃声,然后用MatrixCursor重新组合Cursor

   public static MatrixCursor matrixCursorFromCursor(Cursor cursor) {
        String title = null;
        if (cursor == null) {
            return null;
        }

        String[] columnNames = cursor.getColumnNames();
        if (columnNames == null) {
            columnNames = new String[] {};
        }
        MatrixCursor newCursor = new MatrixCursor(columnNames);
        int numColumns = cursor.getColumnCount();
        Log.d(TAG, "Bob.chen: cursor numColumns= " + numColumns);
        String data[] = new String[numColumns];
       
        cursor.moveToPosition(-1);
        while (cursor.moveToNext()) {
           title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));			
           Log.d(TAG, "Bob.chen: matrixCursorFromCursor. title= " + title);

           if(title.contains("UNEFON") || title.contains("AT&T")){
		        for (int i = 0; i < cursor.getColumnCount(); i++) {
						Log.d(TAG, "for i = " + i + " , cursor.getString1 = " + cursor.getString(i));
				        data[i] = cursor.getString(i);

		        }
                newCursor.addRow(data);
            }
        }

        cursor.moveToPosition(-1);
        while (cursor.moveToNext()) {
           title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
           if(!title.contains("UNEFON") && !title.contains("AT&T")){
		        for (int i = 0; i < cursor.getColumnCount(); i++) {
						Log.d(TAG, "for i = " + i + " , cursor.getString2 = " + cursor.getString(i));
				        data[i] = cursor.getString(i);
		        }
				newCursor.addRow(data);
            }
        }
       


        newCursor.moveToFirst();
        
            return newCursor;
  
}

Note:
需要注意的是因为系统读取铃声也是分为3个方法

		final Cursor internalCursor = getInternalRingtones();  //读取内部铃声
        final Cursor drmCursor = mIncludeDrm ? getDrmRingtones() : null;   //读取drm铃声
        final Cursor mediaCursor = getMediaRingtones();// 读取外部铃声

然后重新根据铃声的title排序
mCursor = new SortCursor(new Cursor[] { internalCursor, drmCursor,
mediaCursor }, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
如果3个方法中cursor的列长度不一致,会导致过滤铃声cursor.getColumnCount()数组越界,所以在这3个方法中,获取cursor时候的条件数组String长度最好保持一致

    private static final String[] INTERNAL_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
        "\"" + MediaStore.Audio.Media.INTERNAL_CONTENT_URI + "\"",
        MediaStore.Audio.Media.TITLE_KEY,
 +       MediaStore.Audio.Media.IS_DRM,    /// M: add for handling OMA DRM v1 content
 +       MediaStore.Audio.Media.DRM_METHOD /// M: add for handling OMA DRM v1 content
    };

    private static final String[] DRM_COLUMNS = new String[] {
        DrmStore.Audio._ID, DrmStore.Audio.TITLE,
        "\"" + DrmStore.Audio.CONTENT_URI + "\"",
        DrmStore.Audio.TITLE + " AS " + MediaStore.Audio.Media.TITLE_KEY,
+        MediaStore.Audio.Media.IS_DRM,    /// M: add for handling OMA DRM v1 content
+        MediaStore.Audio.Media.DRM_METHOD /// M: add for handling OMA DRM v1 content
    };

    private static final String[] MEDIA_COLUMNS = new String[] {
        MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
        "\"" + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "\"",
        MediaStore.Audio.Media.TITLE_KEY,
        MediaStore.Audio.Media.IS_DRM,    /// M: add for handling OMA DRM v1 content
        MediaStore.Audio.Media.DRM_METHOD /// M: add for handling OMA DRM v1 content
    };
发布了13 篇原创文章 · 获赞 4 · 访问量 4536

猜你喜欢

转载自blog.csdn.net/a785722173/article/details/88879003