Android:如何将SD卡中的音频设置为手机铃声

3

我正在尝试从我的应用程序中保存到SD卡的音频文件设置铃声,经过阅读所有相关帖子后,我相信我已经接近成功了,只是没有正确定义URI。

       File ringPath = new File(path, filename);

       ContentValues values = new ContentValues();
       values.put(MediaStore.MediaColumns.DATA, ringPath.getAbsolutePath());
       values.put(MediaStore.MediaColumns.TITLE, "temptitle");
       values.put(MediaStore.MediaColumns.SIZE, ringPath.length());
       values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");
       values.put(MediaStore.Audio.Media.ARTIST, "tempartist");
       values.put(MediaStore.Audio.Media.IS_RINGTONE, true);

       uri = Uri.fromFile(ringPath);
       RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, uri);

通常,URI 的定义更像是:

Uri uri = MediaStore.Audio.Media.getContentUriForPath(ringPath.getAbsolutePath());
Uri newUri = main.getContentResolver().insert(uri, values);

但是我并不是很明白这一切的意义,而且它给了我相当令人讨厌的错误(虽然它们可能比我的当前错误更糟糕)。我确定这是必须要这样做的方式,但我的代码中的URI实际上返回了正确的路径(另一个没有返回正确路径,可能是由于我的误用),所以我不明白为什么它不能工作。虽然说实话,我并不明白为什么必须使用URI来完成这项任务,而不是指定路径。
如果有人能够给我一点解释,或者链接我到某个地方去,让我真正理解这个问题,并解决这个问题,我会非常感激。

你的应用程序有哪些权限?你必须确保你的应用程序有访问SD卡的权限。 - SpencerElliott
我已经授予写入外部存储的权限,并且我知道它已正确设置,因为我可以将声音保存到SD卡上。我不认为需要任何权限才能从卡中读取,并且我刚刚再次检查以确保。 - Peacecraft
2个回答

0

我认为你的问题不在于获取路径。因此,我建议你首先检查此行代码后文件是否真的存在。

 File ringPath = new File(path, filename);

使用代码:

boolean b=ringPath.exists();

如果它返回 true,那么你就能从中获取 URI。然后我认为你的代码中不会出现任何错误。

我之前用过那个检查来确保它是正确的,但我又重新做了一遍,是的,它返回true。经过一番摆弄后,声音现在确实出现在铃声列表中并且可以正常工作,但当它第一次尝试将其设置为铃声时,它会以某种默认铃声替换它。最坏的情况是我可以这样使用它,但我更希望当用户要求时完全设置铃声。 - Peacecraft

0

关闭手机调试,请进入菜单->设置->应用程序->开发,然后取消勾选框。就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接