Хотите написать код, чтобы отправлять уведомления только в определенное время, но каким-то образом не работает alarmManager, и он показывает некоторые ошибки - PullRequest
0 голосов
/ 26 марта 2019

Не отправлять уведомление в выбранное время, когда я запустил свой код, напрямую показал уведомление и также показал ошибку. Вот сообщение об ошибке: E / NotificationManager: notifyAsUser: tag = null, id = 12345, user = UserHandle {0}Я думал, что сообщение об ошибке было связано с Build.VERSION.SDK_INT, но после добавления этого сообщения об ошибке все еще там.

Поместите все это в onCreate:

 Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 13);
        calendar.set(Calendar.MINUTE,9)

;

    Intent intent = new Intent ();
    intent.setAction("com.example.Broadcast");

    PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

// PendingIntent alarmIntent = PendingIntent.getBroadcast (this, 0, intent, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, contentIntent);

и вот расширение.

public class wakeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    setNotification(context);


}


protected void setNotification(Context context){

    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, MainActivity.class), 0);

    String ChannelId = "12345";
    int uniID = 12345;

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context,ChannelId )
            .setSmallIcon(R.mipmap.ic_launcher_round)
            .setContentTitle("Hi")
            .setAutoCancel(true)
            .setWhen(System.currentTimeMillis())
            .setContentText("Please Rate.");


    builder.setContentIntent(contentIntent);

// // Отправка уведомления на ваше устройство NotificationManager manager = (NotificationManager) context.getSystemService (Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        builder.setChannelId("com.myApp");
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(
                "com.myApp",
                "My App",
                NotificationManager.IMPORTANCE_DEFAULT
        );
        if (manager != null) {
            manager.createNotificationChannel(channel);
        }
    }
    manager.notify(uniID, builder.build());

}

}

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 27 марта 2019

Вы очень смущены.

В своем коде вы звоните NotificationManager.notify(). Это покажет Notification немедленно.

Вы делаете:

Intent intent = new Intent(this, MainActivity.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this,0, intent,0);

Это не сработает. Вы создали PendingIntent, который будет отправлен через broadcast с использованием Intent для Activity! Что ты хочешь случиться? Вы хотите, чтобы Activity был запущен, или вы хотите, чтобы BroadcastReceiver был запущен?

Я думаю, что вы хотите сделать следующее:

  • Создайте Intent для BroadcastReceiver, оберните его в PendingIntent, используя getBroadcast(), и передайте его в AlarmManager, чтобы трансляция Intent была установлена ​​в будущем.
  • Создайте класс, который extends BroadcastReceiver. В onReceive() создайте Notification и позвоните NotificationManager.notify(), чтобы опубликовать Notification. В Notification вы можете установить PendingIntent, который открывает ваш Activity, так что если пользователь нажмет на Notification, ваш Activity будет запущен. Для этого позвоните PendingIntent.getActivity() и передайте Intent, содержащий MainActivity.class.
...