如何播放机器人通知声音

我在想,如果不通过媒体流播放通知声音,我怎么能播放它呢。现在我可以通过媒体播放器做到这一点,但我不希望它作为一个媒体文件播放,我希望它作为一个通知或警报或铃声播放。下面是我的代码现在看起来是什么样子的一个例子:

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();
252605 次浏览

您可以使用 通知通知经理来显示所需的通知。然后,您可以自定义要在通知中播放的声音。

我认为“通知声音”的概念在某种程度上不适用于 Android 用户界面。

Android 期望的行为是使用标准通知来提醒用户。如果您播放的通知声音没有状态栏图标,您会让用户感到困惑(“那是什么声音?这里没有图标,也许我听力有问题?”).

例如,如何在通知上设置声音在这里: 设置通知声音

距离你的问题已经有一段时间了,但是... 你试过设置音频流类型吗?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

必须在准备之前完成。

我也有同样的问题。经过一些研究,我认为,如果你想播放默认系统的“通知声音”,你几乎必须显示一个通知,并告诉它使用默认声音。在其他一些回答中有一些关于这个问题的论点,如果你在播放一个通知声音,你也应该显示一些通知消息。

然而,稍微调整一下通知 API,您就可以接近您想要的效果了。您可以显示一个空白通知,然后在几秒钟后自动删除它。我认为这对我有用,也许对你也有用。

我已经在 com.globalmentor.android.app.Notifications.java中创建了一套方便的方法,它允许你创建一个像下面这样的通知声音:

Notifications.notify(this);

LED 也将闪光,如果你有振动许可,振动将发生。是的,一个通知图标将出现在通知栏,但会在几秒钟后消失。

此时,您可能意识到,因为通知无论如何都会消失,所以您可能在通知栏中有一个滚动的股票代码消息; 您可以这样做:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

这个类中还有许多其他方便的方法。您可以从 Subversion 存储库下载整个库并使用 Maven 构建它。它依赖于 globalmonitor-core 库,该库也可以用 Maven 构建和安装。

如果有人还在寻找这个问题的解决方案,我在 如何在 Android 中播放铃声/闹钟声音找到了答案

try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}

您可以将 TYPE _ NOTIFATION 更改为 TYPE _ ALARM,但是您需要跟踪您的铃声 r,以便停止播放它... 比如,当用户单击按钮或其他东西时。

现在可以通过在构建通知时包含声音而不是单独调用声音来实现这一点。

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(message)
.setSound(soundUri); //This sets the sound to play


//Display notification
notificationManager.notify(0, mBuilder.build());

试试这个:

public void ringtone(){
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
} catch (Exception e) {
e.printStackTrace();
}
}

如果您希望播放默认的通知声音,那么您可以使用 NotificationCompat.Builder类的 SetDefault (int)方法:

NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(getString(R.string.app_name))
.setContentText(someText)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true);

我相信这是完成任务最简单的方法。

Intent intent = new Intent(this, MembersLocation.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("type",type);
intent.putExtra("sender",sender);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);


String channelId = getString(R.string.default_notification_channel_id);


Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
// Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
if(type.equals("emergency"))
{
playSound=Emergency_sound_uri;
}
else
{
playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
}


NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setSound(playSound, AudioManager.STREAM_NOTIFICATION)
.setAutoCancel(true)
.setColor(getColor(R.color.dark_red))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent);


// notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...


NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_HIGH);
AudioAttributes att = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build();
channel.setSound(Emergency_sound_uri, att);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
}
}


if (notificationManager != null) {
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}

将声音设置为通知频道

        Uri alarmUri = Uri.fromFile(new File(<path>));


AudioAttributes attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.build();


channel.setSound(alarmUri, attributes);