Могу ли я установить собственную мелодию звонка и шаблон вибрации для уведомления о пожарной базе? - PullRequest
0 голосов
/ 03 декабря 2018

Недавно я начал писать свой первый проект для Android, который включает в себя Firebase Cloud Messaging.Я использую Android SDK 21 (Android 5).

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

public synchronized static Uri getRingtoneUri(Context context) {
    Sharedpreferences prefs = context.getSharedPreferences("table_name", Context.MODE_PRIVATE);
    return Uri.parse(prefs.getString("ringtone_key"), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION).toString());
}

public synchronized static boolean shouldVibrateOnPush(Context context) {
    SharedPreferences prefs = context.getSharedPreferences("table_name", Context.MODE_PRIVATE);
    return prefs.getBoolean("vibration_flag", true);
}

Поэтому, когда я получаю Уведомление от Firebase, я хочу установить звук и шаблон вибрации, которые пользовательможно установить, используя методы выше.

Чтобы получить это, я переопределяю метод onMessageReceived в MyFirebaseMessagingService, который расширяется - кто ожидал этого - FirebaseMessagingService:

public void onMessageReceived(RemoteMessage msg) {
    super.onMessageReceived(msg);
    if (msg.getNotification() != null) {
        Intent activityIntent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(this, REQUEST_CODE, activityIntent, PendingIntent.FLAG_ONE_SHOT);

        Notification note = new NotificationCompat.Builder(this, "channel_id")
                .setSmallIcon(R.mipmap.icon)
                .setContentTitle(msg.getNotification().getTitle())
                .setContentText(msg.getNotification().getBody())
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                .setAutoCancel(true)
                .setContentIntent(contentIntent)
                .setSound(SettingsHandler.getRingtoneUri(this))
                .setVibrate(SettingsHandler.shouldVibrateOnPush ? new long[] {500, 500, 500, 500, 500} : new long[] {0, 0, 0, 0, 0})
                .build();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //create notification channels
        }
        NotificationManagerCompat manager = NotificationManagerCompat.from(this);
        manager.notify(1, note);
    }
}

Однако, когда я отправляю уведомление, по умолчаниюЗвук звучит всегда, поэтому я начал спрашивать себя, есть ли у меня ошибки в моем мышлении.Любой способ, как это сделать правильно?Спасибо вперед.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

создайте папку Resource (каталог res ), назовите ее raw и поместите в нее файл (звуковой файл name.mp3), а затем используйте следующий код для пользовательского звука

Notification note;
.....
......
note.sound = Uri.parse("android.resource://"+context.getPackageName()+"/"+R.raw.filename);//file name you want to play

для Oreo и более поздних версий SKD , которые необходимо вставить в канал уведомлений

Uri sounduri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.filename); //file name you want to play

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

        NotificationChannel Channel = new NotificationChannel("CHANNEL_ID","CHANNEL NAME", NotificationManager.IMPORTANCE_DEFAULT)
        AudioAttributes attributes;
        .... 
        ........
        Channel.setSound(sounduri, attributes); //set the sound


        if (notificationManager != null){
            notificationManager.createNotificationChannel(Channel);}
    }

ИЛИ с использованием класса MediaPlayer для воспроизведения звукадля уведомления

MediaPlayer sound = MediaPlayer.create(contex, R.raw.filename);
sound.start();
0 голосов
/ 04 декабря 2018

Попробуйте использовать это:
Вы можете выбрать мелодию звонка, используя следующий код:

selsound_button.setOnClickListener(new OnClickListener()
    {   
        public void onClick(View arg0)
        {
            Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select ringtone for notifications:");
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentUri);
    intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
    startActivityForResult( intent, 999);  
        }
    }); 

Затем вам нужно обработать currentUri в методе onActivityResult и сохранить его в sharedPreferences для будущего использования.

Фактическая работа идет здесь:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 999){
            if (data != null) {
                currentUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            }
            if (Settings.System.canWrite(this)){
                RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, currentUri);
            }else {
                Intent settings = new Intent("android.settings.action.MANAGE_WRITE_SETTINGS");
                startActivityForResult(settings, 124);
            }
        }
        if (requestCode == 124){
            if (resultCode == Activity.RESULT_OK){
                RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, currentUri);
            }
        }
    }

Теперь получите URI из сохраненных sharedPreferences и используйте в уведомлении как:

 notification.setSound(currentUri);
        notification.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }));

Примечание : Вам необходимоиметь разрешение WRITE_SETTINGS для этой задачи.

...