简体   繁体   English

弹出通知时如何播放声音?

[英]How to play sound when a notification pops up?

I'm working on an app where using two switch buttons the user can turn on/off notifications and notification sound.我正在开发一个应用程序,用户可以使用两个开关按钮打开/关闭通知和通知声音。 I created the notifications that pop up on the status bar and I want to play a default sound when they appear.I wrote the following code but it doesn't seem to work.我创建了在状态栏上弹出的通知,我想在它们出现时播放默认声音。我编写了以下代码,但它似乎不起作用。 Any ideas about how can I make the notification sound play ?关于如何播放通知声音的任何想法?

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.Switch;

import java.util.Set;

import androidx.annotation.RequiresApi;

import static android.app.PendingIntent.getActivity;
import static android.content.Context.NOTIFICATION_SERVICE;
import static com.example.myevents.R.drawable.notification;


public class Settings extends AppCompatActivity {
    Switch simpleswitch1;
    Switch simpleswitch2;
    private Notification notification;
    NotificationManager manager;
    Notification myNotication;
    boolean enableSound = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);


        simpleswitch1 = (Switch) findViewById(R.id.simpleswitch1);
        simpleswitch2 = (Switch) findViewById(R.id.simpleswitch2);
        simpleswitch1.setChecked(false);
        simpleswitch2.setChecked(false);
        simpleswitch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @TargetApi(Build.VERSION_CODES.P)
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        int notifyID = 1;
                        String CHANNEL_SOUND_ID = "channel SOUND";// The id of the channel.
                        CharSequence NAME_SOUND = "channel 1";// The user-visible name of the channel.
                        String CHANNEL_SILENT_ID = "channel SILENT";// The id of the channel.
                        CharSequence NAME_SILENT = "channel 2";// The user-visible name of the channel.
                        int importance_sound = NotificationManager.IMPORTANCE_HIGH;
                        int importance_silent = NotificationManager.IMPORTANCE_LOW;
                        NotificationChannel mChannel_sound = new NotificationChannel(CHANNEL_SOUND_ID, NAME_SOUND, importance_sound);
                        NotificationChannel mChannel_silent = new NotificationChannel(CHANNEL_SILENT_ID, NAME_SILENT, importance_silent);

                        // Crete both notification channels
                        NotificationManager mNotificationManager =
                                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                        mNotificationManager.createNotificationChannel(mChannel_sound);
                        mNotificationManager.createNotificationChannel(mChannel_silent);

                        Intent intent = new Intent(Settings.this, Visitor.class);
                        intent.putExtra("yourpackage.notifyId", notifyID);
                        PendingIntent pIntent = PendingIntent.getActivity(Settings.this, 0, intent,
                                PendingIntent.FLAG_UPDATE_CURRENT);


                        // Select the correct notification channel
                        String selectedChannelId;
                        if (enableSound) {
                            selectedChannelId = CHANNEL_SOUND_ID;
                        } else {
                            selectedChannelId = CHANNEL_SILENT_ID;
                        }

                        // Create a notification and set the notification channel.
                        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Settings.this, selectedChannelId);
                        notificationBuilder.setSmallIcon(R.drawable.cheers);
                        notificationBuilder.setContentTitle("Title");
                        notificationBuilder.setContentText("Notification");
                        notificationBuilder.setContentIntent(pIntent);
                        notificationBuilder.setChannelId(selectedChannelId);

                        Notification notification = notificationBuilder.build();


                        // Issue the notification.
                        mNotificationManager.notify(notifyID, notification);

                    }}});
                simpleswitch2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        enableSound = isChecked;
                    }
                });






            }}

You should define a flag to toggle the sound on/off.您应该定义一个标志来打开/关闭声音。 This could be a boolean value controlled by the second switch.这可能是由第二个开关控制的布尔值。 Then check the status of that flag when creating the notification and decide to set or not the sound.然后在创建通知时检查该标志的状态并决定是否设置声音。

And maybe split the Notification from the NotificationBuilder to control the sound.也许分裂NotificationNotificationBuilder控制声音。

1- Create the flag being a Class attribute 1-创建标志是一个类属性

Switch simpleswitch1;
Switch simpleswitch2;
private Notification notification;
NotificationManager manager;
Notification myNotication;

// Sound disabled by default
boolean enableSound = false;

2- Control the flag with the second switch 2-用第二个开关控制标志

simpleswitch2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        enableSound = isChecked;
    }
});

3- Use the NotificationBuilder to control the sound. 3- 使用NotificationBuilder来控制声音。 Replace this piece of code from first switch从第一个开关替换这段代码

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Settings.this, CHANNEL_ID);
notificationBuilder.setSmallIcon(R.drawable.notification);
notificationBuilder.setContentTitle("NOTIFICATION TITLE");
notificationBuilder.setContentText("You have a new notification");
notificationBuilder.setChannelId(CHANNEL_ID);

if (enableSound){
    notificationBuilder.setSound(android.provider.Settings.System.DEFAULT_NOTIFICATION_URI);
    notificationBuilder.setVibrate(new long[]{1000,100});
}

Notification notification = notificationBuilder.build();

I hope it helps!我希望它有帮助!

UPDATE更新

I think I know why it's not playing a sound.我想我知道为什么它没有播放声音。 I've just created a new Android Studio Project and copy-paste your code and the notifications is fired, the sound plays and I can not turn the sound off (just the oppostite).我刚刚创建了一个新的 Android Studio 项目并复制粘贴您的代码并触发通知,播放声音并且我无法关闭声音(只是相反)。 And I'm guessing your problem is related to the notification channel .我猜你的问题与通知渠道有关 Then I modify my App and it worked!然后我修改了我的应用程序并且它起作用了!

First, let me correct myself.首先,让我纠正一下自己。 The PRIORITY has been deprecated since api level 26 ( which you are using according to @TargetApi(Build.VERSION_CODES.O) ) and what you should use instead is the IMPORTANCE in the NotificationChannel .自 api 级别 26(您根据@TargetApi(Build.VERSION_CODES.O)使用)以来, PRIORITY已被弃用,您应该使用的是NotificationChannelIMPORTANCE The problem with a notification channel is that you can not edit it once created (unless you uninstall your app).通知渠道的问题在于一旦创建就无法对其进行编辑(除非您卸载应用程序)。 So if at first you where using a low importance channel and then change it to a high one it won't take any effect.因此,如果一开始您使用重要性通道,然后将其更改为重要性通道,则不会产生任何影响。

So what you really need is two notifications channel: one with sound and one silent, and then select the appropiate channel with the help of the previously created flag.所以你真正需要的是两个通知频道:一个有声,一个无声,然后在之前创建的标志的帮助下选择合适的频道。

So now, the code for the first switch would be: Notice I re-arrange it so I first create the NotificationChannel (for better readability)所以现在,第一个开关的代码是:注意我重新排列它所以我首先创建了 NotificationChannel(为了更好的可读性)

if (isChecked){
    int notifyID = 1;
    String CHANNEL_SOUND_ID = "channel SOUND";// The id of the channel.
    CharSequence NAME_SOUND = "channel 1";// The user-visible name of the channel.
    String CHANNEL_SILENT_ID = "channel SILENT";// The id of the channel.
    CharSequence NAME_SILENT = "channel 2";// The user-visible name of the channel.
    int importance_sound = NotificationManager.IMPORTANCE_HIGH;
    int importance_silent = NotificationManager.IMPORTANCE_LOW;
    NotificationChannel mChannel_sound = new NotificationChannel(CHANNEL_SOUND_ID, NAME_SOUND, importance_sound);
    NotificationChannel mChannel_silent = new NotificationChannel(CHANNEL_SILENT_ID, NAME_SILENT, importance_silent);

    // Crete both notification channels
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.createNotificationChannel(mChannel_sound);
    mNotificationManager.createNotificationChannel(mChannel_silent);

    Intent intent = new Intent(Settings.this, Visitor.class);
    intent.putExtra("yourpackage.notifyId", notifyID);
    PendingIntent pIntent = PendingIntent.getActivity(Settings.this, 0, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);


    // Select the correct notification channel
    String selectedChannelId;
    if (enableSound){
        selectedChannelId = CHANNEL_SOUND_ID;
    }else{
        selectedChannelId = CHANNEL_SILENT_ID;
    }

    // Create a notification and set the notification channel.
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Settings.this, selectedChannelId);
    notificationBuilder.setSmallIcon(R.drawable.notification);
    notificationBuilder.setContentTitle("Title");
    notificationBuilder.setContentText("Notification Text");
    notificationBuilder.setContentIntent(pIntent);
    notificationBuilder.setChannelId(selectedChannelId);

    Notification notification = notificationBuilder.build();


        // Issue the notification.
    mNotificationManager.notify(notifyID , notification);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM