繁体   English   中英

Android 自定义通知声音不起作用?

[英]Android Custom Notification sound is Not working?

我从通知中获取自定义声音名称并根据键添加条件,但始终只在我的通知中播放。

我想根据声音键播放不同的声音,以及如何处理任何有想法的人。

         
          if (playOrderAssignmentTone) {
              if(key.equalsIgnoreCase("sound")){
                  alarmSound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.sound);
              } else {
                  alarmSound = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.sound2);
              }

          } else {
              alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
          }
      } catch (Exception e) {
          LoggerUtility.PrintTrace(e);
          FirebaseCrashlytics.getInstance().log(e.getMessage());
          FirebaseCrashlytics.getInstance().recordException(e);
          alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
      } 

Notification Builder

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ONE_ID)
              .setSmallIcon(R.drawable.notification_icon)
              .setContentTitle(notificationTitle)
              .setContentText(notificationBody)

              //Optional fields
              .setPriority(NotificationCompat.PRIORITY_MAX)
              .setCategory(NotificationCompat.CATEGORY_STATUS)
              .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
              .setTicker(notificationTicker)
              .setContentIntent(pendingIntent)
              .setAutoCancel(true)
              .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
              .setWhen(System.currentTimeMillis())
              //.setSound(alarmSound)
              //.setShowWhen(true)
              .setOngoing(isOngoing);

// Setting notification sound based on channel id
if (!CHANNEL_ONE_ID.equalsIgnoreCase("auto")) {
          notificationBuilder.setSound(alarmSound);
      }

因此,您的代码的问题是您需要为不同的声音创建单独的通知通道才能工作。 以上是将声音附加到通知通道的代码。

    private void createNotificationChannel() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);

            Uri audio = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator
                    + File.separator + getApplicationContext().getPackageName() + File.separator + R.raw.notification);

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

            channel.setSound(audio, attributes);

            NotificationManager notificationManager = getSystemService(NotificationManager.class);

            if (notificationManager != null) {

                notificationManager.createNotificationChannel(channel);

            }
        }
    }

因此,当您想通过通知播放某些特定声音时,请将该通知CHANNEL_ID与通知生成器一起使用。

您必须在 NotificationChannel 实例上调用 setSound() 方法。

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

val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH).apply {
setSound(soundUri, audioAttributes)
}

从您的手机中选择通知音:

  Uri ringtone=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);;
                    Intent intent=new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtone);
                    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, ringtone);
                    ((Activity) getContext()).startActivityForResult(intent , 1);

在 onActivity 结果中获取铃声路径:

 if (resultCode == MainActivity.RESULT_OK && requestCode == 1) {
   uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
 path = uri.toString();
}

将此路径保存在 sqlite 数据库中,并在您触发通知时从服务中检索播放此声音一次:

Uri uri;
 uri = Uri.parse(myDb.alarmGetRingtone(requestcode));
  r = RingtoneManager.getRingtone(getApplicationContext(), uri);
 r.play();

我希望这段代码能帮助你
谢谢你

暂无
暂无

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

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