You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中使用Activity设置铃声失败求助

Android 设置铃声失败问题解决方案

针对你遇到的unsupported mimetype和invalid token错误,以下是针对性的解决步骤:

一、解决unsupported mimetype错误

  • 确认音频格式兼容性:Android官方支持的铃声格式为MP3、M4A、WAV、OGG,优先使用MP3或M4A格式,避免FLAC等非标准格式。
  • 动态获取正确MIME类型:不要硬编码MIME值,通过系统API获取准确类型:
    val mimeType = context.contentResolver.getType(audioUri)
    // 或针对文件路径
    val mimeType = MediaFile.getMimeType(filePath)
    

二、解决invalid token错误

这个错误通常是权限或URI格式问题导致,核心是必须使用Content URI而非File URI:

1. 将音频文件写入系统媒体库(Android 10+必做)

fun copyToRingtoneFolder(context: Context, sourceFile: File): Uri? {
    val contentValues = ContentValues().apply {
        put(MediaStore.Audio.Media.DISPLAY_NAME, "my_ringtone.mp3")
        put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
        put(MediaStore.Audio.Media.IS_RINGTONE, true)
        put(MediaStore.Audio.Media.RELATIVE_PATH, "Ringtones/")
    }

    return context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues)?.also { uri ->
        context.contentResolver.openOutputStream(uri)?.use { output ->
            sourceFile.inputStream().use { input ->
                input.copyTo(output)
            }
        }
    }
}

2. 设置铃声的核心代码

fun setSystemRingtone(context: Context, ringtoneUri: Uri) {
    try {
        RingtoneManager.setActualDefaultRingtoneUri(
            context,
            RingtoneManager.TYPE_RINGTONE,
            ringtoneUri
        )
        // 通知系统刷新铃声列表
        context.sendBroadcast(Intent(RingtoneManager.ACTION_RINGTONE_CHANGED))
    } catch (e: SecurityException) {
        // 处理权限异常
        e.printStackTrace()
    } catch (e: IllegalArgumentException) {
        // 处理URI无效异常
        e.printStackTrace()
    }
}

3. 权限配置

  • 在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    
  • Android 11+需引导用户开启全文件访问权限:
    if (!Environment.isExternalStorageManager()) {
        val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
        intent.data = Uri.parse("package:${context.packageName}")
        context.startActivity(intent)
    }
    

三、关键注意事项

  • 禁止直接使用file://格式的URI操作铃声,必须通过MediaStore生成Content URI。
  • 测试时使用未损坏的标准格式音频文件,避免因文件本身问题导致格式识别失败。
  • 不同Android版本的权限逻辑差异较大,需分版本做适配处理。

内容的提问来源于stack exchange,提问作者Executrix Apps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:06:05