2013-04-11 5 views
3

J'ai créé une application qui ajoute successivement des rendez-vous à un calendrier. Cependant, je souhaite maintenant être en mesure de cliquer sur le bouton "Nouvel événement" dans un programme de calendrier par exemple. aCalendar et avoir mon programme popup. et je pense que je suis un peu perdu.Comment créer un récepteur pour créer un nouvel événement

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

tryed changer à.

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

Dans le fichier de classe

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!"); 

} 
} 

quand je clique sur le bouton « Nouveau événement » je ne suis pas mon application dans la liste. J'ai regardé autour de moi et pense que j'ai manqué quelque chose de simple ou que je suis totalement sur le mauvais chemin.

Merci pour toute aide à l'avance.

+0

comme suggestion dit ci-dessous, donc je changé l'exemple de code ci-dessus pour montrer ce que je tryed. – John

Répondre

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> 

C'était le code exact que j'ai utilisé et j'ai commencé à travailler. La plupart des réponses ont aidé à obtenir la réponse. La récompense a été versée à la personne qui y a consacré le plus d'efforts et qui a obtenu un résultat.

0

Placez à la place le <intent-filter> que vous avez défini à l'intérieur de votre <activity>. L'utilisateur devrait recevoir une liste d'applications (y compris la vôtre) qui peuvent gérer cette action, afin qu'il puisse sélectionner le vôtre s'il le souhaite.

<receiver> s sont pour recevoir BroadcastIntents, qui sont un peu différents.

1

Utilisez <receiver> comme vous l'avez fait à l'origine, et android:name devrait être com.johnny.CalendarTest si vous souhaitez enregistrer votre récepteur, puisque votre nom de classe de récepteur est CalendarTest.

See here

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

+0

OUI vous avez raison car c'est une erreur dans mon code. Cependant, cela ne me permet pas la nouvelle intention de nomination. Merci pour votre aide jusqu'à maintenant. d'autres idées. – John

+0

Que diriez-vous de 'android.intent.action.INSERT' – StoneBird

+0

Pas une telle chance. Merci quand même – John

1

Cependant, je voudrais maintenant pouvoir cliquer sur le bouton "Nouveau événement" dans un exemple de programme de calendrier . aCalendar et avoir mon programme popup.

Avez-vous essayé les différents action et category déclarations de filtre dans votre <intent-filter>.

Par exemple:

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

Voir si l'un de ceux qui vous aident.

Voir aussi: http://developer.android.com/reference/android/content/Intent.html

1

De CalendarController, je peux presque être sûr que ces intentions sont l'intention explicite avec jeu de composants spécifiques. Par exemple, dans la méthode 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); 
} 

L'intention est définie pour être gérée par EditEventActivity. Il est donc impossible de recevoir de telles intentions dans votre demande. Je pense que l'application Calendrier en fait une intention explicite car elle considère cela comme un événement intégré à l'application. Si ce n'est pas une intention explicite, votre code devrait fonctionner, car le composant dans l'application Calendrier est presque identique à ce que vous avez fait.

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

L'intention de nouvel événement aCalendar est la suivante.

{act = android.intent.action.EDIT typ = vnd.android.cursor.item/événement FLG = 0x20000000 cmp = org.withouthat.acalendar/.edit.EditActivity (a extras)}

Et L'intention du nouvel événement Google Agenda App est la suivante.

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

Ils ont l'intention explicite. Vous ne pouvez pas recevoir cette intention dans votre application. En savoir plus sur cliquez intention here

4

Vous ne pouvez pas y parvenir à l'aide de diffusion récepteur, filtre l'intention de diffusion ne fonctionnera que lorsque certains diffusion de l'application de cette intention particulière, par exemple état de connectivité ont été changés, l'écran se est éteint, la batterie est faible etc sont un bon exemple d'émissions système. Alors que créer un événement de calendrier ne peut pas être une diffusion & c'est pourquoi vous ne pouvez pas le recevoir.

De la documentation au sujet android récepteurs de diffusion:

Un récepteur de radiodiffusion est un composant qui répond à l'ensemble du système annonces de diffusion. De nombreuses émissions proviennent du système, par exemple, une diffusion annonçant que l'écran est éteint, la batterie est faible ou une image a été capturée. Les applications peuvent également lancer des diffusions, par exemple, pour permettre à d'autres applications de savoir que certaines données ont été téléchargées sur le périphérique et qu'elles sont disponibles pour elles. Bien que les récepteurs de diffusion n'affichent pas d'interface utilisateur, ils peuvent créer une notification de barre d'état pour avertir l'utilisateur lorsqu'un événement de diffusion se produit. Plus communément, cependant, un récepteur de diffusion est juste une "passerelle" vers d'autres composants et est destiné à faire un très travail minimal. Par exemple, il peut initier un service à effectuer un travail basé sur l'événement.

Pour obtenir la fonctionnalité souhaitée, vous devez enregistrer le filtre d'intention pour votre activité. Votre manifeste doit également contenir une autorisation de lecture/écriture de calendrier et une modification d'événement/insérer un filtre d'intention, par ex.

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

pour le tester faire ci-dessous onclick de quelque bouton de test: -

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

En cliquant sur mon bouton de test i got menu comme dans l'image ci-dessous, donc code ci-dessus fonctionne bien pour montrer votre application dans la boîte de dialogue du sélecteur d'applications pour ajouter/modifier des événements de calendrier. Maintenant, dans votre activité, vous pouvez gérer cette intention en utilisant getIntent() et effectuer des actions en conséquence. You can have a look here pour les extras pris en charge par l'événement de calendrier. Comme Events.TITLE, Events.EVENT_LOCATION etc.Si vous allez créer votre propre créateur d'événements de calendrier, vous devez gérer tous ces extras avec élégance, pour une expérience utilisateur impressionnante.

+1

bien fait vous avez travaillé dur pour la récompense que vous méritez. – John

+1

En effet; Je met cette réponse en signet –

0

Les vieilles réponses me montrer la direction, mais je devais faire une petite modification pour le faire fonctionner:

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