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

2023-12-15

我正在开发一个应用程序,用户可以使用两个开关按钮打开/关闭通知和通知声音。我创建了在状态栏上弹出的通知,我想在它们出现时播放默认声音。我编写了以下代码,但它似乎不起作用。关于如何让通知声音播放有什么想法吗?

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;
                    }
                });






            }}


您应该定义一个标志来打开/关闭声音。这可以是由第二个开关控制的布尔值。然后在创建通知时检查该标志的状态并决定是否设置声音。

也许分割Notification来自NotificationBuilder来控制声音。

1-创建标志作为类属性

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

// Sound disabled by default
boolean enableSound = false;

2-用第二个开关控制标志

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

3- 使用NotificationBuilder来控制声音。替换第一个开关中的这段代码

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();

我希望它有帮助!

UPDATE

我想我知道为什么它不播放声音了。我刚刚创建了一个新的 Android Studio 项目并复制粘贴您的代码,通知被触发,声音播放,但我无法关闭声音(恰恰相反)。我猜你的问题与通知渠道。然后我修改了我的应用程序,它成功了!

首先,让我纠正一下自己。这PRIORITY自 API 级别 26 以来已被弃用(你正在使用的根据@TargetApi(Build.VERSION_CODES.O))而你应该使用的是IMPORTANCE in the NotificationChannel。通知通道的问题是一旦创建就无法对其进行编辑(除非卸载应用程序)。所以如果一开始你使用的是lowimportant 通道,然后将其更改为high一则不会产生任何效果。

因此,您真正需要的是两个通知通道:一个有声音,一个无声,然后借助之前创建的标志选择适当的通道。

所以现在,第一个开关的代码是:请注意,我重新安排了它,因此我首先创建了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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在弹出通知时播放声音? 的相关文章

随机推荐