如何创建Receiver以创建新事件

时间:2013-04-11 02:52:34

标签: android calendar android-manifest

我创建了一个连续添加日历约会的应用程序。但是我现在希望能够点击日历程序中的“新事件”按钮,例如。 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!");

 }
}

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

提前感谢您的帮助。

8 个答案:

答案 0 :(得分:4)

你无法使用广播接收器实现它,广播意图过滤器仅在某些应用广播特定意图时才有效,例如连接状态改变,屏幕关闭,电池电量低等等正确的系统广播示例。虽然创建日历活动不能是广播&amp;这就是为什么你不能接收它。

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

  

广播接收器是响应系统范围的组件   广播公告。许多广播来自系统   例如,宣布屏幕已关闭的广播,   电池电量低或拍摄照片。应用程序也可以   发起广播 - 例如,让其他应用程序知道这一点   某些数据已下载到设备并可供他们使用   使用。虽然广播接收器不显示用户界面,   他们可能会创建一个状态栏通知,以便在a时提醒用户   广播事件发生。但更常见的是,广播接收器是   只是其他组件的“门户”,并打算做一个非常   最少的工作量。例如,它可能会启动服务   根据活动开展一些工作。

要获得所需的功能,您需要为您的活动注册intent-filter。 此外,您的清单应包含读/写日历权限和事件编辑/插入intent-filter,例如

<?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);
    }
}

点击我的测试按钮后,我得到了如下图所示的菜单,因此上面的代码可以很好地在App选择器对话框中显示你的应用程序,用于添加/编辑日历事件。 enter image description here

现在,在您的活动中,您可以使用getIntent()处理此意图并相应地执行操作。 You can have a look here 表示Calendar事件支持的其他内容。 如 Events.TITLE,Events.EVENT_LOCATION 等。如果您要创建自己的日历活动创建者,那么您需要优雅地处理所有此类附加功能,以获得出色的用户体验。

答案 1 :(得分:1)

最初使用<receiver>,如果您希望注册接收者,则android:name应为com.johnny.CalendarTest,因为您的接收者类名称为CalendarTest

See here

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

答案 2 :(得分: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

答案 3 :(得分: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处理。因此,在您的应用程序中无法接收此类意图。我认为Calendar App将其视为明确的意图,因为它将此视为应用内事件。如果这不是一个明确的意图,那么您的代码应该可以工作,因为Calendar App中的组件与您所做的几乎相同。

    <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>

答案 4 :(得分:0)

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

<receiver>用于接收BroadcastIntents,它们有点不同。

答案 5 :(得分:0)

aCalendar New Event Intent就是这样。

{act = android.intent.action.EDIT typ = vnd.android.cursor.item / event flg = 0x20000000 cmp = org.withouthat.acalendar / .edit.EditActivity(has extras)}

谷歌日历应用程序新事件意图就是这样。

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

他们是明确的意图。 您无法在自己的应用中收到此意图。 有关意图的更多信息,请点击here

答案 6 :(得分: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>

这是我使用的确切代码并开始工作。 大多数答案都有助于获得回复。 奖励归功于那些投入大量精力并取得成果的人。

答案 7 :(得分: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>