2

在 Jelly Bean 18 级之前,我可以使用不在媒体存储中的音乐文件(例如,private文件夹中的 .mp3 文件包含.nomedia文件,因此 Media Scanner 不会扫描此文件夹并且不知道此文件)但来自 Android 4.3 (在 Nexus 4 上测试)我不能这样做,它只适用于媒体扫描仪已经扫描过的音乐文件。

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

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

有没有人有解决方法来使用私人文件(未扫描且媒体扫描仪无法识别)作为铃声?

这是我设置铃声的方法:

    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);            
    }       
4

2 回答 2

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。

希望这会帮助你。如果您没有得到解决方案,请随时询问。

享受 Coding... :)

于 2013-10-08T05:02:53.117 回答
0

这是我的解决方法:

  • 将媒体文件复制到铃声文件夹 (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)),如果该文件夹不存在,请记住创建该文件夹。
  • 使用问题中的相同代码将该文件设置为默认铃声。
于 2013-10-10T03:06:52.800 回答