客户需求:
客户预置的铃声默认在铃声列表的最前面。
解决方法:
需要对读取铃声的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
};