звукът на канала за уведомяване на android не работи

Знам, че има много публикации по въпроса. Опитах ги всичките. Ето стъпките, които направих.

Първо разбрах, че веднъж създаден канал не може да бъде променян. Единственият начин беше да преинсталирате приложението. Така че това направих и не се получи.

Второ, някои казват, че мога да изтрия канала, така че аз също го направих с този код

val channelList = mNotificationManager.notificationChannels
        var i = 0
        while (channelList != null && i < channelList.size) {
            Log.d("channelList","channel ID is ${channelList[i].id}")
            //mNotificationManager.deleteNotificationChannel(channelList[i].id)
            i++
        }

и след това повторно създаване на канала след изтриване.

Трето, опитах да използвам нов канал за уведомяване, но получавах грешка всеки път, когато използвам новия канал.

Ето кода, който използвам с всички тези решения, които опитах

 val audioAttributes = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build()


        val importance = NotificationManager.IMPORTANCE_DEFAULT

        val channelList = mNotificationManager.notificationChannels
        var i = 0
        while (channelList != null && i < channelList.size) {
            Log.d("channelList","channel ID is ${channelList[i].id}")
            mNotificationManager.deleteNotificationChannel(channelList[i].id)
            i++
        }

        Log.d("isnotification"," is it needed $isNotificationSoundNeeded importance is $importance")
        val mChannel = NotificationChannel(CHANNEL_ID, appName,  NotificationManager.IMPORTANCE_HIGH)
        mChannel.setShowBadge(false)
        mChannel.setSound(notifSound, audioAttributes)



        val mChannelnew = NotificationChannel(CHANNEL_ID2, appName,  NotificationManager.IMPORTANCE_DEFAULT)
        mChannelnew.setShowBadge(false)
        mChannelnew.setSound(notifSound, audioAttributes)




        mNotificationManager.createNotificationChannel(mChannel)

какво ми липсва Някакви идеи? Благодаря

Актуализация: ето кода за notifsound

val notifSound = Uri.parse("android.resource://" + packageName + "/" + R.raw.unconvinced)

person thenewbie    schedule 30.05.2019    source източник
comment
Къде е вашият код за създаване на обекта notifSound? Обърнете внимание, че деинсталирането/преинсталирането на приложението не нулира вашите канали - трябва да изчистите данните на приложението си.   -  person ianhanniballake    schedule 30.05.2019
comment
@ianhanniballake Актуализирах публикацията си   -  person thenewbie    schedule 31.05.2019
comment
Коя грешка получавате?   -  person Dmitriy Miyai    schedule 31.05.2019
comment
@DmitriyMiyai Ако използвам нов канал, ще получа грешка при повреден канал. Ако използвам оригинала, работи, но няма да регистрира никакъв звук. Толкова е странно.   -  person thenewbie    schedule 31.05.2019
comment
моля, проверете отговора ми!   -  person ismail alaoui    schedule 07.06.2019
comment
@thenewbie проверете моя отговор. Това ще ви даде всички решения за персонализирано известяване   -  person BlackBlind    schedule 08.06.2019


Отговори (3)


Първо не знам Вашето известие не работи на кои устройства като Oreo, Pie или по-ниски от N.

For your question StackOver Flow have lots of answer.

Сега според въпроса ви липсва само един ред код, но тук не можете да проверите целия си код за уведомяване, защото все още не сте поставили.

Тук поставям код за уведомяване, който просто изпълнява всичките ви изисквания за уведомяване. (Пълно персонализирано известие)

Известие с изображение

public void createNotificationWithImage(String title,String message ,Bitmap image) {
PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
            0 /* Request code */, resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

// Custom Sound Uri

Uri soundUri = Uri.parse("android.resource://" + mContext.getApplicationContext()
                .getPackageName() + "/" + R.raw.sniper_gun);

 mBuilder = new NotificationCompat.Builder(mContext);
 mBuilder.setSmallIcon(R.mipmap.notification_icon);

 // Pay attention on below line here (NOTE)
 mBuilder.setSound(soundUri);

if (image!=null) {
            mBuilder.setContentTitle(title)
                    .setContentText(message)
                    .setAutoCancel(false)
                    .setLargeIcon(image)
                    .setStyle(new NotificationCompat.BigPictureStyle()
                            .bigPicture(image).setSummaryText(message).bigLargeIcon(null))
                    .setColor(Color.GREEN)
                    .setContentIntent(resultPendingIntent);
        }
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

Сега поставям код за известяване, който ще работи над или на устройства OREO.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});

        if(soundUri != null){
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .build();
            notificationChannel.setSound(soundUri,audioAttributes);
        }

        assert mNotificationManager != null;
        mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
    assert mNotificationManager != null;
    mNotificationManager.notify(0 /* Request Code */, mBuilder.build());


below middle braces use for close your method.
}

Известие за без изображение

    public void createNotification(String title,String message){
    PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
                0 /* Request code */, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);

        Uri soundUri = Uri.parse("android.resource://" + mContext.getApplicationContext()
                .getPackageName() + "/" + R.raw.sniper_gun);



        mBuilder = new NotificationCompat.Builder(mContext);
        mBuilder.setSmallIcon(R.mipmap.notification_icon);
        mBuilder.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(),
                R.mipmap.icon));
        mBuilder.setSound(soundUri);
        mBuilder.setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(false)
                .setColor(Color.GREEN)
                .setStyle(new NotificationCompat.BigTextStyle())
                .setContentIntent(resultPendingIntent);

        mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//            notificationChannel.s

            if(soundUri != null){
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                notificationChannel.setSound(soundUri,audioAttributes);
            }

            assert mNotificationManager != null;
            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            mNotificationManager.createNotificationChannel(notificationChannel);

        }

        assert mNotificationManager != null;
        mNotificationManager.notify(0 /* Request Code */, mBuilder.build());

    }

ЗАБЕЛЕЖКА: В моя код споменах, че трябва да обърнете внимание на един конкретен ред, където описах да задам звуков Uri с известие. Можете да опишете така.

mBuilder.setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(false)
            .setSound(soundUri)
            .setColor(Color.GREEN)
            .setStyle(new NotificationCompat.BigTextStyle())
            .setContentIntent(resultPendingIntent);

но няма да възпроизведе звук за вашето устройство, тъй като след устройството Oreo звукът не е зададен като ниво на приоритет.

Така че винаги за звук използвайте кода, както описах.

person BlackBlind    schedule 07.06.2019
comment
Трябваше да променя аудио атрибутите си от типа на известието на аларма, както в тази публикация. - person Robert Bentley; 24.12.2019

предполагам, че използвате грешен тип употреба, моля, редактирайте вашата audioAttributes употреба на USAGE_NOTIFICATION

            val audioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .build()

От официалния документ:

USAGE_NOTIFICATION : Стойност на употреба, която да се използва, когато употребата е известие.

person ismail alaoui    schedule 06.06.2019

Трябва да използвате аудио атрибути и също трябва да дефинирате URI на мелодията с разрешение.

Така че първо дефинираме URI адреса на мелодията:

Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
boolean vibrate = true;
long[] vibratePattern = new long[]{0L, 1000L};



public constructor(){
 notificationBuilder = new NotificationCompat.Builder(mContext, app.getAppContext().getString(R.string.default_notification_channel_id));
        mNotifyManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        mContext.grantUriPermission("com.android.systemui", ringtoneUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
 public void showNotificationNormal(String notificationTitle, String notificationBody, Intent intent) {
    String id = mContext.getString(R.string.default_notification_channel_id);
    PendingIntent lowIntent = PendingIntent.getActivity(mContext, 100, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext, id);
    NotificationManager mNotifyManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = mContext.getString(R.string.default_notification_channel_name);
        String description = mContext.getString(R.string.default_notification_channel_description); //user visible
        int importance = NotificationManager.IMPORTANCE_HIGH;

        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();

        NotificationChannel mChannel = new NotificationChannel(id, name, importance);
        mChannel.setDescription(description);
        mChannel.enableLights(true);
        mChannel.enableVibration(vibrate);
        mChannel.setVibrationPattern(vibratePattern);
        mChannel.setLightColor(Color.RED);
        mChannel.setSound(ringtoneUri, att);
        mChannel.setBypassDnd(true);
        mChannel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC);
        mChannel.setShowBadge(true);

        if (mNotifyManager != null) {
            mNotifyManager.createNotificationChannel(mChannel);
        }

        notificationBuilder
                .setSmallIcon(R.mipmap.ic_launcher)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                .setVibrate(vibratePattern)
                .setSound(ringtoneUri)
                .setColor(ContextCompat.getColor(mContext, R.color.colorPrimary))
                .setContentTitle(notificationTitle)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(notificationBody))
                .setAutoCancel(true)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setContentIntent(lowIntent);

    } else {
        notificationBuilder.setContentTitle(notificationTitle)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setPriority(NotificationCompat.PRIORITY_MAX)
                .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                .setVibrate(vibratePattern)
                .setSound(ringtoneUri)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(notificationBody))
                .setColor(ContextCompat.getColor(mContext, R.color.colorPrimary))
                .setAutoCancel(true)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setContentIntent(lowIntent);

    }

    notificationBuilder.setContentText(notificationBody);

    if (mNotifyManager != null) {
        mNotifyManager.notify(AppConstants.NOTIFY_ID, notificationBuilder.build());
    }
}
person Raja chakraborty    schedule 07.06.2019