【问题标题】:Playing a ringtone from an activity stops abruptly从活动中播放铃声突然停止
【发布时间】:2025-12-02 11:30:01
【问题描述】:

在我的 android 应用程序中,我正在尝试播放我的活动的当前默认铃声 onCreate。但是铃声不会每次都完全播放并以任意长度停止。

代码尽可能简单,任何帮助将不胜感激。

Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(this.context, 
    RingtoneManager.TYPE_RINGTONE);
Ringtone ringtone = RingtoneManager.getRingtone(this.context,currentUri);
if (ringtone != null){
    ringtone.play();
}

【问题讨论】:

  • 我有同样的问题,如果我找到解决方案会返回。

标签: android media ringtone


【解决方案1】:

我正在使用 TYPE_NOTIFICATION 但我的代码或多或少完全相同。

我发现在新的 Handler 中播放声音对我来说很有帮助:

        Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(
                this.context, RingtoneManager.TYPE_RINGTONE);
        final Ringtone ringtone = RingtoneManager.getRingtone(this.context,
                currentUri);
        if (ringtone != null) {
            new Handler().post(new Runnable() {

                @Override
                public void run() {
                    ringtone.play();
                }
            });
        }

为什么这能解决问题?

我相信 RingtoneManager 可能会使用 UI 线程来播放声音,因此如果 UI 线程习惯于在播放声音的同时创建/绘制视图或进行计算,则可能会被中断。

当使用新的处理程序时,播放会排入队列,直到其他操作之后,声音不会中断。

至少这是我的看法:What exactly does the post method do?

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,上面的答案在我的情况下不起作用。

    但是通知中铃声正常,所以我做了一个通知(没有内容)

    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
            NotificationCompat.Builder mBuilder;
            mBuilder =
                    new NotificationCompat.Builder(this)
                    .setSound(alarmSound)
                    .setVibrate(new long[]{1000,1000});
    
            mNotificationManager.notify(ANY_INT_WILL_DO_HERE, mBuilder.build());
    

    它在我的情况下有效。我希望这也适用于你。

    但我不确定如果我只是为了播放铃声而发出这个虚假通知是否会造成任何伤害

    【讨论】: