3

我创建了一个应用程序,可以将约会连续添加到日历中。但是我现在希望能够单击日历程序中的“新事件”按钮,例如。aCalendar 并弹出我的程序。我想我有点失落。

在我的 AndroidManifest.xml

    <receiver 
        android:name="com.johnny.CalendarAdd"
        android:enabled="true"
        >
        <intent-filter>
            <data android:pathPrefix="vnd.android.cursor.item/event" />
            <action android:name="android.intent.action.EDIT" />
        </intent-filter>
    </receiver>

试图将其更改为。

    <activity android:name="CalendarAdd">
      <intent-filter>
        <data android:pathPrefix="vnd.android.cursor.item/event" />
        <action android:name="android.intent.action.EDIT" /> 
      </intent-filter>
    </activity>

在类文件中

package com.johnny;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class CalendarTest extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.i("CalendarAdd", "CalendarAdd.onReceive called!");

 }
}

当我单击“新事件”按钮时,我的应用程序没有出现在列表中。我环顾四周,认为我错过了一些简单的事情,或者我完全走错了路。

感谢您提前提供任何帮助。

4

8 回答 8

4

您无法使用广播接收器来实现它,广播意图过滤器仅在某些应用程序广播该特定意图时才起作用,例如连接状态发生变化、屏幕关闭、电池电量不足等是系统广播的正确示例。虽然创建日历事件不能是广播,这就是您无法接收它的原因。

来自有关广播接收器的android文档:

广播接收器是响应系统范围的广播公告的组件。许多广播来自系统——例如,宣布屏幕已关闭、电池电量低或已捕获图片的广播。应用程序还可以发起广播——例如,让其他应用程序知道某些数据已下载到设备并可供他们使用。尽管广播接收器不显示用户界面,但它们可以创建状态栏通知以在广播事件发生时提醒用户。然而,更常见的是,广播接收器只是其他组件的“网关”,旨在完成非常少量的工作。例如,它可能会启动一项服务以根据事件执行某些工作。

为了实现所需的功能,您需要为您的活动注册意图过滤器。您的清单还应包含读/写日历权限和事件编辑/插入意图过滤器,例如

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.CalanderTest"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8"/>

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

    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="MyActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.EDIT" />
                <action android:name="android.intent.action.INSERT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/event" />
            </intent-filter>
        </activity>
    </application>
</manifest>

为了测试它,请在单击某些测试按钮时执行以下操作:-

@Override
public void onClick(View view) {
    super.onClick(view);    
    if (view.getId()==R.id.create_event)
    {
       Intent i = new Intent(Intent.ACTION_INSERT);
        i.setType("vnd.android.cursor.item/event");
        startActivity(i);
    }
}

单击我的测试按钮后,我得到了如下图所示的菜单,因此上面的代码可以很好地在应用选择器对话框中显示您的应用,以添加/编辑日历事件。 在此处输入图像描述

现在在您的活动中,您可以使用 getIntent() 处理此意图并相应地执行操作。 您可以在此处查看日历事件支持的附加功能。像Events.TITLE、Events.EVENT_LOCATION等。如果您要创建自己的日历事件创建者,那么您需要优雅地处理所有这些额外内容,以获得出色的用户体验。

于 2013-05-01T09:48:15.343 回答
1

但是我现在希望能够单击日历程序中的“新事件”按钮,例如。aCalendar 并弹出我的程序。

您是否尝试action过.category<intent-filter>

例如:

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <action android:name="android.intent.action.EDIT" />
        <action android:name="android.intent.action.PICK" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.OPENABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="application/myapp" />
    </intent-filter>

看看这些是否对你有帮助。

另请参阅:http: //developer.android.com/reference/android/content/Intent.html

于 2013-04-29T14:00:08.883 回答
1

<receiver>像你最初那样使用,如果你想注册你的接收器,android:name应该使用,因为你的接收器类名是.com.johnny.CalendarTestCalendarTest

看这里

android:name Required name of the class implementing the receiver, deriving from BroadcastReceiver.

于 2013-04-25T03:46:27.630 回答
1

CalendarController,我几乎可以确定这些意图是具有特定组件集的显式意图。例如,在launchEditEvent方法中。

private void launchEditEvent(long eventId, long startMillis, long endMillis, boolean edit) {
    Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventId);
    Intent intent = new Intent(Intent.ACTION_EDIT, uri);
    intent.putExtra(EXTRA_EVENT_BEGIN_TIME, startMillis);
    intent.putExtra(EXTRA_EVENT_END_TIME, endMillis);
    intent.setClass(mContext, EditEventActivity.class);
    intent.putExtra(EVENT_EDIT_ON_LAUNCH, edit);
    mEventId = eventId;
    mContext.startActivity(intent);
}

意图设置为由 EditEventActivity 处理。所以不可能在你的应用程序中接收到这样的意图。我认为日历应用程序将其作为一个明确的意图,因为它认为这是一个应用程序内事件。如果这不是一个明确的意图,您的代码应该可以工作,因为日历应用程序中的组件与您所做的几乎相同。

    <intent-filter>
        <action android:name="android.intent.action.EDIT" />
        <action android:name="android.intent.action.INSERT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/event" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.EDIT" />
        <action android:name="android.intent.action.INSERT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.dir/event" />
    </intent-filter>
于 2013-04-30T13:51:51.860 回答
0

<intent-filter>您定义的内容放在您的内部<activity>。应该为用户提供可以处理该操作的应用程序列表(包括您的应用程序),以便他们可以根据需要选择您的应用程序。

<receiver>s 用于接收 BroadcastIntents,这有点不同。

于 2013-04-11T03:21:19.897 回答
0
            <activity android:name="com.johny.CalendarTest"
        android:label="@string/app_name" >

        <intent-filter>
            <action android:name="android.intent.action.EDIT" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.ALTERNATIVE" />

            <data android:host="com.android.calendar" />
            <data android:host="calendar" />
            <data android:scheme="content" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.EDIT" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.ALTERNATIVE" />

            <data android:mimeType="vnd.android.cursor.item/event" />
        </intent-filter>
    </activity>

这是我使用并开始工作的确切代码。大多数答案都有助于获得响应。奖励给了付出最大努力并取得成果的人。

于 2013-05-02T01:36:28.037 回答
0

aCalendar New Event Intent 就是这样。

{act=android.intent.action.EDIT typ=vnd.android.cursor.item/event flg=0x20000000 cmp=org.withouthat.acalendar/.edit.EditActivity(有附加功能)}

而 Google Calendar App New Event Intent 就是这样。

{act=android.intent.action.VIEW cmp=com.android.calendar/.event.EditEventActivity

它们是明确的意图。您无法在您的应用中收到此意图。有关意图的更多信息,请单击此处

于 2013-04-30T13:52:03.280 回答
0

旧答案向我展示了方向,但我必须进行一些小修改才能使其正常工作:

<activity
        android:name=".YourActivity"
        android:exported="true">
    <intent-filter>
            <action android:name="android.intent.action.INSERT" />
            <action android:name="android.intent.action.EDIT" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android.cursor.dir/event" />
     </intent-filter>
</activity>
于 2018-01-23T07:19:41.037 回答