如何将不在Media Store中的音乐文件设置为铃声

时间:2013-08-27 07:46:19

标签: android mediastore ringtone android-4.3-jelly-bean

在Jelly Bean等级18之前,我可以使用不在媒体商店中的音乐文件(例如,文件夹中的private .mp3文件包含.nomedia文件,因此Media Scanner不扫描此文件文件夹,但不知道这个文件)但是从Android 4.3(在Nexus 4上测试)我不能这样做,它只适用于已经被Media Scanner扫描的音乐文件。

此问题的真正原因是我无法使用MediaColumns插入ContentValues.DATA是Media Scanner未扫描的文件的绝对路径,insert方法始终返回null。

Uri newUri = getCR().insert(uri, contentValues); // returns null in Android 4.3 

是否有人有办法使用私人文件(未扫描且未被Media Scanner识别)作为铃声?

以下是我设置铃声的方法:

    File ringtoneFile = new File(audio.getPath());

    ContentValues cv = new ContentValues();
    cv.put(MediaColumns.DATA, ringtoneFile.getAbsolutePath());
    cv.put(MediaColumns.TITLE, audio.getTitle());

    cv.put(MediaColumns.MIME_TYPE, "audio/*");
    if (audio.getArtist() != null)
        cv.put(Media.ARTIST, audio.getArtist());

    cv.put(Media.IS_RINGTONE, true);
    cv.put(Media.IS_NOTIFICATION, false);
    cv.put(Media.IS_ALARM, false);
    cv.put(Media.IS_MUSIC, false);

    Uri uri = Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
    Uri newUri = getCR().insert(uri, cv); ////return null in Android 4.3
    if (newUri == null)
    {
        Cursor c = getCR().query(uri, new String[] { Media._ID }, Media.DATA + "=?",
                new String[] { ringtoneFile.getAbsolutePath() }, null);
        long id = -1;
        if (c != null && c.moveToFirst())
        {
            id = c.getLong(c.getColumnIndex(Media._ID));
            newUri = Uri.parse(uri.toString() + "/" + id);
            c.close();
        }
    }       

    if (newUri != null)
    {
        RingtoneManager.setActualDefaultRingtoneUri(getAppContext(), RingtoneManager.TYPE_RINGTONE, newUri);            
    }       

2 个答案:

答案 0 :(得分:1)

我已尝试过一些东西,并为我做了一些工作。希望它也能帮到你。

我使用以下方法获取设备中的所有可用歌曲:

public static long [] getAllSongs(Context context) {
    //System.out.println("In get All Songs Method");
    Cursor c = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[] {MediaStore.Audio.Media._ID}, MediaStore.Audio.Media.IS_MUSIC +"!= 0",
            null, MediaStore.Audio.Media.TITLE + " ASC");
    try {
        if (c == null || c.getCount() == 0) {
            return null;
        }
        int len = c.getCount();
        long [] list = new long[len];
        for (int i = 0; i < len; i++) {
            c.moveToNext();
            list[i] = c.getLong(0);
            //System.out.println("ID IS: "+c.getLong(0));
        }
        //System.out.println("Total Songs are: );

       // ALL_SONGS_ID = list;
        return list;
    } finally {
        if (c != null) {
            c.close();
        }
    }
}

获取歌曲后我选择声音文件并将其设置为铃声,代码如下:

 static void setRingtone(Context context, long id) {
   ContentResolver resolver = context.getContentResolver();
   // Set the flag in the database to mark this as a ringtone
   Uri ringUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
   try {
       ContentValues values = new ContentValues(2);
       values.put(MediaStore.Audio.Media.IS_RINGTONE, "1");
       values.put(MediaStore.Audio.Media.IS_ALARM, "1");
       resolver.update(ringUri, values, null, null);
   } catch (UnsupportedOperationException ex) {
       // most likely the card just got unmounted
       Log.e("Music app", "couldn't set ringtone flag for id " + id);
       return;
   }

   String[] cols = new String[] {
           MediaStore.Audio.Media._ID,
           MediaStore.Audio.Media.DATA,
           MediaStore.Audio.Media.TITLE
   };

   String where = MediaStore.Audio.Media._ID + "=" + id;
   Cursor cursor = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
           cols, where , null, null);
   try {
       if (cursor != null && cursor.getCount() == 1) {
           // Set the system setting to make this the current ringtone
           cursor.moveToFirst();
           Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString());
           String message = context.getString(R.string.ringtone_set, cursor.getString(2));
           Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
       }
   } finally {
       if (cursor != null) {
           cursor.close();
       }
   }

}

在上面的方法中,id是所选歌曲的歌曲ID。

希望这会对你有所帮助。如果你没有得到解决方案,可以随意询问。

享受Coading ......:)

答案 1 :(得分:0)

这是我的解决方法:

  • 将媒体文件复制到Ringtones文件夹(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)),如果文件夹不存在,请记得创建该文件夹。
  • 使用问题中的相同代码将该文件设置为默认铃声。