簡體   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