代码之家  ›  专栏  ›  技术社区  ›  Wooram Jung

如何在Android O中动态更改通知声音

  •  10
  • Wooram Jung  · 技术社区  · 6 年前

    最近我使用通知通道来支持android O。 但问题是我无法动态更改声音Uri。 我们的应用程序具有通知声音设置,用户可以根据需要更改应用程序通知声音。 但正如你们所知,Android现在不允许开发者在用户重新安装应用程序之前更新通知通道。 在那里,我考虑了几种看起来不太好的可能解决方案。

    1. 使用ringtone manager播放铃声而不是设置声音。但当用户禁用应用程序中的通知设置时,铃声仍不会停止播放。(这将是糟糕的用户体验)

    2. 删除通知频道,并在用户更改铃声时创建新的通知频道。但这看起来也很糟糕,因为应用程序内设置google会显示已删除频道信息的历史记录。(实际上没有必要)

    有什么好的解决办法吗?

    2 回复  |  直到 6 年前
        1
  •  12
  •   ianhanniballake    6 年前

    在Android O+设备上,您应该删除应用程序中任何特定于通知的设置,并在设置屏幕中提供链接 open the system's notification channel settings ,用户可以直接调整通知频道的声音。

        2
  •  0
  •   Mugunthan24    3 年前

    @RequiresApi(api=Build.VERSION\u code.O) 私有void createChannels(){

        Nmanager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    
        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build();
    
        ArrayList arrayList = new ArrayList<String>();
        Field[] fields = R.raw.class.getFields();
        for (int i = 1; i < fields.length - 1; i++) {
            arrayList.add(fields[i].getName());
        }
    
    
        DBRingtone RDB = new DBRingtone(this);
        Cursor cursor = RDB.getringtone();
    
        if (cursor.getCount() > 0) {
    
            int ring = parseInt(cursor.getString(0));
    
             resID = getResources().getIdentifier((String) arrayList.get(ring), "raw", getPackageName());
    
            i=i+resID;
    
            uri = Uri.parse("android.resource://" + getPackageName() + "/" + resID);
        } else
            {
                i=i+10;
            uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.default_sound);
        }
    
        CHANNEL_ID = CHANNEL_ID+i;
    
        notificationChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
        notificationChannel.enableLights(true);
        notificationChannel.enableVibration(true);
        notificationChannel.setDescription("Your message");
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.setSound(uri, attributes);
        notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        Nmanager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        Nmanager.createNotificationChannel(notificationChannel);
    
    }
    

    大家好,我已经用上面的代码解决了这个问题,它正在工作。您还可以将CHANNEL\u ID=CHANNEL\u ID+resID直接分配给。为此,我使用变量i进行了赋值。我存储了用户首选的通知声音resID is SQLite数据库,并在createchannels类中使用游标检索该resID以创建uri的路径。希望这能帮助你谢谢你。。。