我创建了一个连续添加日历约会的应用程序。但是我现在希望能够点击日历程序中的“新事件”按钮,例如。 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!");
}
}
当我点击“新事件”按钮时,我没有在列表中获取我的应用程序。 我有一个环顾四周,认为我错过了一些简单的东西,或者我完全走错了路。
提前感谢您的帮助。
答案 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选择器对话框中显示你的应用程序,用于添加/编辑日历事件。
现在,在您的活动中,您可以使用getIntent()处理此意图并相应地执行操作。 You can have a look here 表示Calendar事件支持的其他内容。 如 Events.TITLE,Events.EVENT_LOCATION 等。如果您要创建自己的日历活动创建者,那么您需要优雅地处理所有此类附加功能,以获得出色的用户体验。
答案 1 :(得分:1)
最初使用<receiver>
,如果您希望注册接收者,则android:name
应为com.johnny.CalendarTest
,因为您的接收者类名称为CalendarTest
。
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>