Звук уведомления, вибрация и светодиоды не работают
Я пытаюсь установить пользовательские цвета Sound, Vibration и LED для Notificaitons в моем приложении, но это не сработает. Все остальное, как настройка названия, значка, цвета и т.д., Отлично работает. Я пробовал много решений, предлагаемых в Stackoverflow, но они тоже не работали, поэтому я задаю вопрос.
Вот мой код уведомления -
Intent resultIntent = new Intent(this, ActivityB.class);
Bundle b = new Bundle();
//Some bundle related Code
resultIntent.putExtra("bundle",b);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntent(new Intent(this, ActivityA.class));
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
android.support.v7.app.NotificationCompat.Builder builder = new android.support.v7.app.NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_small_logo);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_logo_large));
builder.setContentTitle(notification.getTitle());
builder.setContentText(notification.getBody());
builder.setColor(Color.parseColor("#FFFFFF"));
builder.setStyle(new NotificationCompat.BigTextStyle());
builder.setVibrate(new long[] { 1000, 100, 1000, 100, 1000 });
builder.setLights(Color.YELLOW, 3000, 3000);
builder.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notif1));
builder.setAutoCancel(true);
builder.setContentIntent(resultPendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
Я также добавил разрешение на вибрацию. Протестировано это на двух телефонах, работающих на Lollipop и Marshmallow.
Изменить 1:
Совместное использование всех разрешений, используемых моим приложением -
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>
Изменить 2: Работает на телефоне версии Marshmallow. Не работает на телефонах с Lollipop.
Изменить 3: Работает также с Нугой (One plus 3T Phone).
Ответы
Ответ 1
Основываясь на ваших комментариях, это, похоже, проблема с самим телефоном. Я просил в (1) относительно вибрации, потому что вы устанавливаете { 1000, 100, 1000, 100, 1000 }
, которая представляет собой задержку 1000 мс, за которой следует вибрация 100 мс. Это может быть слишком мало для обнаружения.
Во всяком случае, у меня была такая же проблема для вибрации на некоторых устройствах, поэтому вместо этого я использовал услугу вибратора. То, что я сделал, было таким, как после уведомления. Согласно вашему комментарию ниже, я также добавил раздел менеджера рингтонов.
// built the notification without vibration and sound
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
// start vibrator manually
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(new long[] {1000, 100, 1000, 100, 1000}, Constants.VIBRATION_ONCE);
// start sound manually
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notif1);
Ringtone ringtone = RingtoneManager.getRingtone(this, uri);
ringtone.play();
Это похоже на работу с большинством устройств. Что касается освещения уведомления, то в Official Document уже указано
Установите желаемый цвет индикатора индикатора на устройстве, а также рабочий цикл мигания (заданный в миллисекундах). Не все устройства будут соблюдать все (или даже любые) из этих значений.
Если вы используете устройства Mi, попробуйте "доверять" приложению и включите все разрешения, необходимые для уведомлений, включая "автозапуск". Он будет работать в большинстве случаев.
Ответ 2
Одна из причин, по которой звук не работает, заключается в том, что он не может найти изменение файла с builder.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notif1));
до
Строка uriSound = String.format( "android.resource://% s/raw/% s", getPackageName(), R.raw.notif1);
builder.setSound(uriSound);
Для огней используются комбинации RGB. builder.setLights(Color.rgb(130, 130, 130));
измените шаблон вибрации на нечто более однородное,
builder.setVibrate(new long[] { 50, 100, 150, 200, 250});