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

Broadcast Receiver を使用してそれを実現することはできません。ブロードキャスト インテント フィルターは、一部のアプリがその特定のインテントをブロードキャストする場合にのみ機能します。たとえば、接続状態が変更された、画面がオフになった、バッテリーが少ないなどは、システム ブロードキャストの正しい例です。カレンダーイベントの作成はブロードキャストできませんが、それが受信できない理由です。

ブロードキャストレシーバーに関するアンドロイドのドキュメントから:

ブロードキャスト レシーバは、システム全体のブロードキャスト アナウンスに応答するコンポーネントです。多くのブロードキャストは、システムから発信されます。たとえば、画面がオフになったこと、バッテリーが少なくなったこと、または画像がキャプチャされたことを通知するブロードキャストです。アプリケーションは、ブロードキャストを開始することもできます。たとえば、一部のデータがデバイスにダウンロードされ、使用できるようになったことを他のアプリケーションに知らせることができます。ブロードキャスト レシーバーはユーザー インターフェイスを表示しませんが、ブロードキャスト イベントが発生したときにユーザーに警告するステータス バー通知を作成する場合があります。ただし、より一般的には、ブロードキャスト レシーバは他のコンポーネントへの単なる「ゲートウェイ」であり、最小限の作業を行うことを目的としています。たとえば、イベントに基づいて何らかの作業を実行するサービスを開始する場合があります。

目的の機能を実現するには、アクティビティのインテント フィルターを登録する必要があります。また、マニフェストには、読み取り/書き込みカレンダーのアクセス許可と、イベントの編集/挿入のインテント フィルターが含まれている必要があります。

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

それをテストするには、いくつかのテストボタンの onclick で以下を実行します:-

@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 Chooser ダイアログにアプリを表示するのにうまく機能します。 ここに画像の説明を入力

これで、アクティビティで getIntent() を使用してこのインテントを処理し、それに応じてアクションを実行できます。 カレンダー イベントでサポートされている追加機能については、こちらをご覧ください。Events.TITLE、Events.EVENT_LOCATIONなどと同様です。独自のカレンダー イベント クリエーターを作成する場合は、優れたユーザー エクスペリエンスを実現するために、そのようなすべてのエクストラを適切に処理する必要があります。

于 2013-05-01T09:48:15.343 に答える
1

レシーバーのクラス名<receiver>は.android:namecom.johnny.CalendarTestCalendarTest

こちらをご覧ください

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

于 2013-04-25T03:46:27.630 に答える
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>

これは私が使用した正確なコードであり、機能しました。The Answers のほとんどは、反応を得るのに役立ちました。報酬は、それに最も力を入れ、結果を達成した人に贈られました。

于 2013-05-02T01:36:28.037 に答える