【问题标题】:how can i open the calendar from my app?如何从我的应用程序中打开日历?
【发布时间】:2011-02-17 21:18:15
【问题描述】:

我正在为 android 构建一个应用程序,我不需要我的应用程序包含日历(而且它会破坏目的),我的应用程序允许用户收听广播电台,并且需要选项将事件设置为(记住在特定时间收听广播),如果应用程序有自己的日历,那么事件警报只有在用户打开应用程序时才会响起......毫无意义。我一直在寻找但找不到,有没有办法使用意图或其他东西来打开谷歌日历或 Android 可能拥有的其他日历? 我需要将我的意图(/其他代码)放在我已经拥有的监听器中,现在看起来像这样

private View.OnClickListener reminder = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
                  // open calendar code goes here.

            }
};

我不需要应用程序预先填写日历中的任何字段,只需打开它,我将把其余的留给用户。 欢迎所有帮助,谢谢

【问题讨论】:

    标签: java android android-intent


    【解决方案1】:

    如果您只想打开日历,您可以使用这些组件名称中的任何一个(如果您想支持旧手机,则可能需要同时满足这两个名称)

    Intent i = new Intent();
    
    //Froyo or greater (mind you I just tested this on CM7 and the less than froyo one worked so it depends on the phone...)
    cn = new ComponentName("com.google.android.calendar", "com.android.calendar.LaunchActivity");
    
    //less than Froyo
    cn = new ComponentName("com.android.calendar", "com.android.calendar.LaunchActivity");
    
    i.setComponent(cn);
    startActivity(i);
    

    如果您想进入添加事件屏幕(听起来更适合您的目的),请使用以下内容:

     //all version of android
     Intent i = new Intent();
    
     // mimeType will popup the chooser any  for any implementing application (e.g. the built in calendar or applications such as "Business calendar"
     i.setType("vnd.android.cursor.item/event"); 
    
     // the time the event should start in millis. This example uses now as the start time and ends in 1 hour
     i.putExtra("beginTime", new Date().getTime()); 
     i.putExtra("endTime", new Date().getTime() + DateUtils.HOUR_IN_MILLIS);
    
     // the action
     i.setAction(Intent.ACTION_EDIT);
     startActivity(i);
    

    (代码未经测试,从现有项目复制)

    【讨论】:

    • 我怎样才能运行这个 ComponentName?或者我如何处理我制作的这个新的 ComponentName?
    • 抱歉,我点击了标签,它在我添加多汁的东西之前输入了我的评论
    • 这些都不是特别安全。第二个更接近,因为设备碰巧支持该 MIME 类型的可能性更大。但是,Android 操作系统中没有日历应用程序。某些设备上可能没有日历应用程序,如果有,它可能不是com.android.calendar。此外,欢迎核心 Android 团队重构他们的应用程序并破坏此代码,这已从两个可能的Intents 中得到证明。
    • 上面的代码导致我的应用程序崩溃,只是说已经意外停止,请再试一次......我现在正在虚拟机上测试它..你认为我需要测试它吗一个真正的确定知道吗?你会建议什么,你发布的内容正是我想要做的,我就是不明白
    • AFAIK 模拟器没有日历应用程序,因此它无法找到应用程序(根据 CommonsWare 的评论)并且会崩溃。 @CommonsWare 是的,是的,是的,但是我不知道打开日历应用程序的更好方法,否则我会使用它:)
    最近更新 更多