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

标签 android

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

我已经尝试了很多,但我做不到。作为一名大学生,我尽力了,但真的需要别人的帮助..

如果有人知道,请告诉我解决方案(如果提供了示例,那将是一个很大的帮助(请不要只告诉我有关 api、使用日历提供程序的信息,我需要适当的示例))。 .

提前致谢

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

//Froyo 或更高版本(请注意,我刚刚在 CM7 上测试过这个,比 froyo 的效果还差,所以这取决于手机......) 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); 启动 Activity (i);

上面的代码显示了原生日历并允许用户自己设置事件。 但我不希望这种情况发生,相反,我希望 native 日历接受用户输入并设置事件。为此,我实现了以下代码: 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); 但这行不通。但是,我不想对其进行硬编码,它应该接受用户输入(动态地它应该工作,比如获取编辑文本数据并通过 Intent 传递)。 请问有人可以在这方面帮助我吗??

最佳答案

在单独使用这个答案之前,你必须先在谷歌上搜索一下。这是您以完美的方式学习新事物的唯一途径。
1) 报警管理器
2) 广播接收器
3)应用的 Intent 和上下文

好了,我们开始吧;
首先,您需要获取 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);                    

            }

接下来,您需要让接收器捕捉这个 Firing 事件并显示通知、发出声音、振动设备。为此,我将向项目添加 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>

希望对您有所帮助。
干杯!!!

我在谷歌上搜索了很多,但没有找到解决方案或任何实现它的提示。 而且这段代码也不适合我。它不会在 native 日历中创建任何事件。我检查了模拟器、bluestack 以及我的手机(未创建 apk 文件)。 请帮助我解决任何其他问题或改进这个问题
Link可以完全满足您的要求。

关于android - 如何通过用户应用程序将日期设置为设备日历并在android中获取提醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834800/

相关文章:

java - 我应该使用加速度计还是陀螺仪来测量 z 轴的角度

android - 在设备上存储应用内项目数据

android - 在android中卸载应用程序时如何清除数据库

android - 自定义 EditText 到 Android

android - "Error writing minivpn binary "连接打开 vpn Android

android - 如何在android中获得双点触控位置?

java - Android 上的摘要获取 401

android - 如何获取动态添加到 LinearLayout 中的点击 subview 的 ID?

java - ListView Adapter 如何跳过数据

android - 如何在单独的类中编写一个函数来显示警报框