android - 如何从存储在外部存储器中的音频文件设置 Android 铃声

标签 android ringtone

我想从我的应用程序中从云端下载 mp3 文件,然后将下载的音频文件设置为铃声。我通过 stackoverflow 尝试了很多解决方案,并花了很多时间在谷歌中搜索,但没有任何好的结果。

更新:

我已经解决了我的问题并将我的解决方案放在下面的答案中。 如果您遇到我的问题,我希望这段代码可以帮助您解决问题。

谢谢

最佳答案

经过努力解决我的问题,尝试更多解决方案并将其中一些组合在一起。最后我修复了它,这是我编辑的最终代码:

    public void setAsRingtone(String url, String title) {
try {
    String path = Environment.getExternalStorageDirectory() + "/ringtones/";
    String fileName = title + ".mp3";
    File ringtone = new File(path, fileName);
    if (!ringtone.exists()) {
        // Download Ringtone from the storage
        Toast.makeText(com.tibadev.ahlyringtones.activities.MainActivity.this, "برجاء الانتظار لحين تحميل النغمة", Toast.LENGTH_SHORT).show();
        DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
        request.setAllowedOverRoaming(false);
        request.setTitle(title);
        request.setVisibleInDownloadsUi(true);
        File download = new File(Environment.getExternalStorageDirectory() + "/ringtones/", title + ".mp3");
        Uri parse = Uri.fromFile(download);
        request.setDestinationUri(parse);
        assert downloadManager != null;
        downloadManager.enqueue(request);
    }
    // Set mp3 file as ringtone
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, ringtone.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, title);
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put("_size", ringtone.length());
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(ringtone.getAbsolutePath());
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + ringtone.getAbsolutePath() + "\"", null);
    Uri newUri = com.tibadev.ahlyringtones.activities.MainActivity.this.getContentResolver().insert(uri, values);
    try {
        RingtoneManager.setActualDefaultRingtoneUri(getBaseContext(), RingtoneManager.TYPE_RINGTONE, newUri);
    } catch (Exception e) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
                        .setData(Uri.parse("package:" + getPackageName()))
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

关于android - 如何从存储在外部存储器中的音频文件设置 Android 铃声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676453/

相关文章:

java - 如何检查uri指向的铃声是否存在?

android - 从 Android 上的 SD 卡中选择歌曲并播放

java - 带有来自原始资源的自定义铃声的 RingtonePreference

java - Android:设置铃声,一切正常,但不响且无法播放

java - 如何在设置铃声之前清除 Mediastore

android - 尝试在从头开始训练的模型上使用 tensorflow classify android 示例时出现异常

android - 无法使用 Intents 在 Android Lollipop 5.0 中进行视频通话

android - 在两个按钮线性布局之间和上方放置一个按钮

android - 如何获取电子邮件?

java - 如何在 viewpager 中的 View 之间保存按钮按下的状态和值?