Как воспроизвести звук при появлении уведомления? - PullRequest
0 голосов
/ 02 апреля 2020

Я работаю над приложением, в котором с помощью двух кнопок переключения пользователь может включать / выключать уведомления и звук уведомлений. Я создал уведомления, которые появляются в строке состояния, и я хочу воспроизводить звук по умолчанию, когда они появляются. Я написал следующий код, но, похоже, он не работает. Любые идеи о том, как заставить звучать уведомления звучат?

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






            }}

1 Ответ

0 голосов
/ 02 апреля 2020

Вы должны определить флаг для включения / выключения звука. Это может быть логическое значение, контролируемое вторым переключателем. Затем проверьте состояние этого флага при создании уведомления и решите установить или нет звук.

И, возможно, разделите 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();

Надеюсь, это поможет!

ОБНОВЛЕНИЕ

Я думаю, я знаю, почему он не воспроизводит звук. Я только что создал новый Android Studio Project и скопировал и вставил ваш код, и уведомления запускаются, звук воспроизводится, и я не могу отключить звук (только противоположность). И я предполагаю, что ваша проблема связана с каналом уведомлений . Затем я модифицирую свое приложение, и оно заработало!

Сначала позвольте мне исправить себя. PRIORITY устарел начиная с уровня API 26 (, который вы используете в соответствии с @TargetApi(Build.VERSION_CODES.O)), и вместо него следует использовать IMPORTANCE в NotificationChannel. Проблема с каналом уведомлений заключается в том, что вы не можете редактировать его после создания (если только вы не удалите свое приложение). Так что если сначала вы используете канал важности low , а затем измените его на канал high , это не даст никакого эффекта.

Так что вам действительно нужно это два канала уведомлений: один со звуком, а другой без звука, а затем выберите соответствующий канал с помощью ранее созданного флага.

Итак, теперь код для первого переключателя будет: Замечание I переставьте его так, чтобы я сначала создал 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);
}
...