Генерация уведомления с указанием c даты и времени - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать приложение, в котором пользователь может установить дату и время для своих задач. Как только пользователь определит свою задачу и выйдет из приложения, он должен получить уведомление от приложения о задаче, которую он определил в приложении. Ниже приведен фрагмент кода, который я пробовал.

todocreate. java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_todo_create);
        getSupportActionBar().setTitle("ToDoList Create");

        myToDoHelper = new myDBHelper(todo_create.this);


        titleText = (EditText)findViewById(R.id.getTitle);
        dateText = (EditText)findViewById(R.id.getDate);
        timeText = (EditText)findViewById(R.id.getTime);

        pickDate = (Button)findViewById(R.id.pickDate);
        pickTime = (Button)findViewById(R.id.pickTime);

        c = Calendar.getInstance();
        pickDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mDay = c.get(Calendar.DAY_OF_MONTH);
                mMonth = c.get(Calendar.MONTH);
                mYear = c.get(Calendar.YEAR);
                DatePickerDialog datePickerDialog = new DatePickerDialog(todo_create.this, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                        dateText.setText(dayOfMonth +"-"+(month+1)+"-"+year);
                        c.set(Calendar.DAY_OF_MONTH,dayOfMonth);
                        c.set(Calendar.MONTH,month+1);
                        c.set(Calendar.YEAR,year);
                    }
                }, mYear, mMonth, mDay);
                datePickerDialog.show();
            }
        });

        pickTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mHour = c.get(Calendar.HOUR_OF_DAY);
                mMinute = c.get(Calendar.MINUTE);
                TimePickerDialog timePickerDialog = new TimePickerDialog(todo_create.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        timeText.setText(hourOfDay +":"+minute);
                        c.set(Calendar.HOUR_OF_DAY,hourOfDay);
                        c.set(Calendar.MINUTE,minute);
                        c.set(Calendar.SECOND,0);
                        c.set(Calendar.MILLISECOND,0);
                    }
                }, mHour, mMinute, false);
                timePickerDialog.show();
            }
        });
    }

    //function to save todo task with alarm manager
    public void saveToDo(String todoTaskInput, String todoDateInput, String todoTimeInput){
        //createNotification(todoTaskInput);
        boolean isInserted = myToDoHelper.createToDo(todoTaskInput, todoDateInput,todoTimeInput);
        if(isInserted == true){
            AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            Intent alarmShowIntent = new Intent(this, BroadcastReceiver.class);
            alarmShowIntent.putExtra("TodoTitle",todoTaskInput);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,alarmShowIntent,0);
            Calendar c1 = Calendar.getInstance();
            long currentTime = c1.getTimeInMillis();
            alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis()-currentTime,pendingIntent);
            Toast.makeText(getApplicationContext(),"ToDo Item created successfully",Toast.LENGTH_LONG).show();
        }else {
            Toast.makeText(getApplicationContext(),"Error occured ! Please try again after sometime",Toast.LENGTH_LONG).show();
        }
        this.finish();
    }

BroadcastManager. java

package com.example.mytodoapp;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

import java.io.Console;

public class BroadcastManager extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        createNotification(context,intent,"myToDo App",intent.getStringExtra("TodoTitle"));
    }

    public void createNotification(Context context,Intent intent,CharSequence ticker, CharSequence title){
        //Intent intent = new Intent(this,todo_home.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"todoAppChannel");
        builder.setSmallIcon(R.drawable.ic_note_add_black_24dp);
        builder.setContentTitle("todo App");
        builder.setContentText(title);
        builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
        builder.setContentIntent(pendingIntent);
        builder.setAutoCancel(true);

        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
        notificationManagerCompat.notify(200,builder.build());
    }
}

home. java Создан следующий метод для создания канала уведомлений при загрузке приложения.

public void createNotificationChannel(){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            CharSequence name = "todoAppChannel";
            String description = "temp";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel("todoAppChannel",name,importance);
            channel.setDescription(description);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }

AndroidManifest. xml Следующая строка обновлен в файле.

<receiver android:name=".BroadcastManager"/>

Мне удалось создать уведомление по нажатию кнопки, но не по указанной c дате в указанное время c. Однако я не могу генерировать уведомления для определенной c даты в указанное c время. В чем может быть проблема.

1 Ответ

0 голосов
/ 01 мая 2020

Вы забыли добавить фильтры намерений в свой приемник (поправьте меня, если я ошибаюсь).

 <receiver
     android:name="BroadcastManager">
     <intent-filter>
         <action android:name="ALARM" />
         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</receiver>

Также добавьте это разрешение

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...