如何通过用户应用程序将日期设置为设备日历并在Android中获取提醒?

时间:2014-04-03 10:27:34

标签: android

大家好,请有人帮助我,我想通过我的应用程序将事件设置到设备日历。我需要从edittext(这是用户输入)获取日期并点击按钮(比如设置日期)它应该作为事件保存到设备日历。在上述日期,它应该提醒应用程序用户有关该事件。

我已经尝试了很多,但我无法做到这一点。作为一名大学生,我尝试了我的水平,但真的需要别人帮助..

请人们,如果有人知道它让我知道解决方案(如果提供了示例,那将是一个很大的帮助(请不要只告诉我关于api,使用calendarprovider和这,我需要适当的例子))。

提前致谢

我已通过以下代码打开设备日历。这允许我手动设置事件,但我想在单击按钮后自动设置事件。 在这方面有人可以帮助我吗? 意图i =新的Intent();

// Froyo或更高(请注意,我刚刚在CM7上对此进行了测试,而且运行时间不够好,因此取决于手机......) cn = new ComponentName(“com.google.android.calendar”,“com.android.calendar.LaunchActivity”);

//小于Froyo cn = new ComponentName(“com.android.calendar”,“com.android.calendar.LaunchActivity”);

i.setComponent(CN); startActivity(ⅰ);

上面的代码显示了原生日历,并允许用户自己设置事件。 但我不希望这种情况发生,相反,我希望原生日历能够接受用户输入和放大。设置event.So为此我已经实现了以下代码: public void addCalendarEvent(){

    Calendar cal = Calendar.getInstance();     
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setType("vnd.android.cursor.item/event");
    intent.putExtra("beginTime", cal.getTimeInMillis());
    intent.putExtra("allDay", true);
    intent.putExtra("rrule", "FREQ=YEARLY");
    intent.putExtra("UNTIL=20140404T080000Z",true);
    intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000);
    intent.putExtra("title", "A Test Event from android app");
    intent.putExtra("description", "A Test Description from android app");
    intent.putExtra("eventLocation", "Geolocation");
    startActivity(intent);

  }

我在按钮onClick()方法中调用了这个方法。 我将日期硬编码为:intent.putExtra(“UNTIL = 20140404T080000Z”,true); 但这不起作用。但是,我不想硬编码它,它应该接受用户输入(动态它应该工作,比如获取edittext数据并通过意图)。 请有人帮我这方面吗?

1 个答案:

答案 0 :(得分:1)

在单独使用此答案之前,您必须在Google上进行一些搜索。那是你能以完美的方式学习新东西的唯一方法 1)报警管理器
2)广播接收器
3)意图和应用背景

好的,我们走了;
首先,您需要获取Calendar对象以将日期和时间设置到Android Alarm Manager中。这个方法在MainActivity.java中,在你的按钮点击事件中调用这个方法,同时传递相关参数。

public void addReminder(int mYear, int mMonth, int mDay, int mHour, int mMinute){
Calendar c = Calendar.getInstance();

                //set Reminder time and date into calendar object               
                c.set(Calendar.YEAR,mYear);
                c.set(Calendar.MONTH, mMonth);//Don't use exact numeric value of the month, use one minus.Ex: April=>as 3
                c.set(Calendar.DATE, mDay);
                c.set(Calendar.HOUR_OF_DAY, mHour);             
                c.set(Calendar.MINUTE, mMinute);
                c.set(Calendar.SECOND, 0);



                //Unique Alarm ID creation
int alrmId=0;
            alrmId=Integer.parseInt(mMonth+""+mDay+""+mHour+""+mMinute);
                //Alarm task creation
                Intent in=new Intent(this,ReminderReceiver.class);
                in.putExtra("text", "You have a Reminder!");
                in.putExtra("AlrmId", alrmId);

PendingIntent pi;

                pi = PendingIntent.getBroadcast( this, alrmId, in,0 );

AlarmManager am;


                am = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

                am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),pi);                    

            }

接下来,您需要让接收器捕捉此射击事件并显示通知,发出声音,振动设备。为此,我将ReminderReceiver类添加到项目中,

public class ReminderReceiver extends BroadcastReceiver {
// Vibrator object
public Vibrator vibrator;
long[] pattern = { 0L, 250L, 200L, 250L, 200L, 250L, 200L, 250L, 200L,
        250L, 200L, 250L, 200L, 250L, 200L };
// Ringtone object
Uri ringT;
Ringtone ringTone;

@Override
public void onReceive(Context context, Intent intent) {
    String remindText = intent.getStringExtra("text");
//Unique notification id for every alarm
    int receiverID = intent.getIntExtra("AlrmId", 0);
    // Notification creation
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            context).setSmallIcon(android.R.drawable.ic_popup_reminder)
            .setContentTitle("Reminder").setContentText(remindText);

    // Create vibrator pattern
    vibrator = (Vibrator) context
            .getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(pattern, -1);// No repetition

    // Notification tone creation and play
    ringT = RingtoneManager
            .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    ringTone = RingtoneManager.getRingtone(context, ringT);
    ringTone.play();
    // Create toast and show on center of the screen
    Toast toast = Toast.makeText(context, remindText, Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER, 0, 0);
    toast.show();
    // end of toast...

    // Show status bar notification
    NotificationManager mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(receiverID, mBuilder.build());

}

}
全部完成 !!!只需一件事,在Android Manifest.xml中设置权限

<uses-permission android:name="android.permission.VIBRATE" />

并注册ReminderReceiver类,在<application> </application>标记中添加此行(不在任何其他标记内部),

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

希望这会对你有所帮助。
干杯!!!

我已经google了很多,但我没有找到解决方案或任何提示来实现它。 这段代码也不适合我。它不会在本机日历中创建任何事件。我检查了模拟器,bluestack以及我的手机(apk文件没有被创建)。 请帮助我解决任何其他问题或改进这个解决方案 Link可能会满足您的要求。