【问题标题】:Android set rintone to one existing in libraryAndroid将铃声设置为库中现有的铃声
【发布时间】:2020-07-18 12:06:37
【问题描述】:

我希望我的应用设置铃声。用户在使用系统选择器之前从现有的库条目中选择了一个,并获得了额外的返回:RingtoneManager.EXTRA_RINGTONE_PICKED_URI

在这个例子中,我从默认铃声中选择了“Andromeda”并获得了这个路径:content://media/internal/audio/media/103

当我尝试在给定时间设置它时,我会运行以下代码:

Uri ur = Uri.parse(ringtoneFile.getAbsolutePath()); RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, uri);

我也试过这个版本:

Uri ur = Uri.parse(ringtoneFile.getAbsolutePath()); android.provider.Settings.System.putString(context.getContentResolver(), android.provider.Settings.System.RINGTONE, uri.toString());

两者都不起作用。系统的声音设置如下所示:

只显示了 103,而不是我所期望的“仙女座”。当我调用模拟器时,它只会发出叮当声,因此它可能无法播放所需的文件并使用一些备用文件。

这里有很多示例,人们从文件系统中选择自定义文件并使用“ContentValues”将其重新添加到库中。但是我不想自己添加任何东西,我只想从默认铃声中设置一个。

作为替代方案,我也尝试过编写代码。它确实向库中添加了一个附加条目。不幸的是,旧的没有被删除,而是堆积起来。而且我在调用模拟器时也听到了同样的叮当声,而不是我选择的那个。

private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context)
{
    Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, context.getResources().getString(R.string.app_name) + " ringtone");
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
    values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
    values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
    values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);

    Uri ur = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
    context.getContentResolver().delete(ur, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"", null);
    Uri uri = context.getContentResolver().insert(ur, values);

    try
    {
        RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, uri);
        Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + uri.toString(), 1);
        return true;
    }
    catch (Throwable t)
    {
        String message = "Error setting ringtone: " + Log.getStackTraceString(t);
        Miscellaneous.logEvent("e", "Profile", message, 1);
    }
    
    return false;
}

【问题讨论】:

    标签: android ringtone


    【解决方案1】:

    我的问题还没有完全解决,但至少找到了罪魁祸首。

    将文件设置为铃声的方法确实有效。但是源文件的路径不正确。这很奇怪,因为它是通过使用文件选择器确定的:

    Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
    fileIntent.setType("audio/*");
    startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
    

    这将作为路径返回:

    content://com.android.externalstorage.documents/document/primary%3AMusic%2Fmusicfile.mp3
    

    转换成 File 对象后会变成

    /document/primary%3AMusic%2F04.%20Elevator%20Girl.mp3
    

    当只是将路径硬编码到源代码中时(以普通 Linux 用户认为它需要的格式),它实际上很简单:

    /sdcard/Music/musicfile.mp3
    

    这完美无缺。我得弄清楚如何正确确定路径,但是将文件设置为铃声的方法是可行的。

    更新:我的路径问题有答案:Get Real Path For Uri Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多