IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

BroadcastReceiver + ajout de contact


Sujet :

Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut BroadcastReceiver + ajout de contact
    Bonjour,
    Je cherche à faire une appli qui attend un sms particulié de la forme :
    #contact#;nom;prenom;phone;adresse;cp;ville;email
    ce sms est envoyé par un script de mon site et a pour but final de fournir les infos nécessaire à l'ajout d'un contact. (toutes les infos y sont à chaque fois).

    J'ai suivi le super tuto sur les BroadcastReceiver good job !
    mon problème ce situ surtout sur la partie enregistrer le contact ...

    je suis une quiche en java, et j'ai pas l'intention d'être bon dans un avenir proche je veux juste faire cette petite application qui me sera forte utile pour gagner du temps.

    De se que j'ai compris, je n'ai besoin d'écrire que 2 fichiers (le manifeste et la classe SMSReceiver)
    voici mon travail actuel (qui ne fonctionne pas) j'ai trouvé plusieurs méthodes sur le net, et j'ai essayé de coller aux recommandation de la doc officiel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    package sms.add.contact;
     
     
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ContentUris;
    import android.content.ContentValues;
    import android.provider.ContactsContract.RawContacts;
    import android.provider.ContactsContract.Data;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.provider.ContactsContract.CommonDataKinds.StructuredName;
    import android.provider.ContactsContract.CommonDataKinds.Email;
    import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
    import android.os.Bundle;
    import android.net.Uri;
    import android.telephony.SmsMessage;
     
    public class SMSReceiver extends BroadcastReceiver
    {
    	 private final String   ACTION_RECEIVE_SMS  = "android.provider.Telephony.SMS_RECEIVED";
     
    	 @Override
    	 public void onReceive(Context context, Intent intent)
    	 {
    		 if (intent.getAction().equals(ACTION_RECEIVE_SMS))
    		 {
    			 Bundle bundle = intent.getExtras();
    			 if (bundle != null)
    			 {
    				 Object[] pdus = (Object[]) bundle.get("pdus");
     
    				 final SmsMessage[] messages = new SmsMessage[pdus.length];
    				 for (int i = 0; i < pdus.length; i++)  {  messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);  }  if (messages.length > -1)
    				 {
    					 final String messageBody = messages[0].getMessageBody();
    					 if (messageBody.substring(0,8) == "#contact#")
    					 {
    					 	//messageBody structure : "#contact#;nom;prenom;phone;adresse;cp;ville;email"
    						String infoContact[] = messageBody.split(";");
     
    						//création de l'id
    						ContentValues values = new ContentValues();
    					    values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim");
    					    values.put(RawContacts.ACCOUNT_NAME, "SIM");
    					    Uri rawContactUri = context.getContentResolver().insert(RawContacts.CONTENT_URI, values);
    					    long rawContactId = ContentUris.parseId(rawContactUri);
     
    					    // infoContact[1] = "nom";
    						// infoContact[2] = "prenom";
    					    values.clear();
    					    values.put(Data.RAW_CONTACT_ID, rawContactId);
    					    values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    					    values.put(StructuredName.DISPLAY_NAME, infoContact[1]+" "+infoContact[2]);
    					    values.put(StructuredName.GIVEN_NAME, infoContact[2]);
    					    values.put(StructuredName.FAMILY_NAME, infoContact[1]);
    					    context.getContentResolver().insert(Data.CONTENT_URI, values);
     
    					    // infoContact[3] = "phone";
    					    values.clear();
    					    values.put(Data.CONTACT_ID, rawContactId);
    					    values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    					    values.put(Phone.NUMBER, infoContact[3]);
    					    values.put(Phone.TYPE, Phone.TYPE_MOBILE);
    					    context.getContentResolver().insert(Data.CONTENT_URI, values);
     
    					    // infoContact[4] = "adresse";
    					    // infoContact[5] = "cp";
    						// infoContact[6] = "ville";
    					    values.clear();
    					    values.put(Data.CONTACT_ID, rawContactId);
    					    values.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
    					    values.put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME);
    					    values.put(StructuredPostal.STREET, infoContact[4]);
    					    values.put(StructuredPostal.POSTCODE, infoContact[5]);
    					    values.put(StructuredPostal.CITY, infoContact[6]);
    					    context.getContentResolver().insert(Data.CONTENT_URI, values);
     
    					    // infoContact[7] = "email";
    					    values.clear();
    					    values.put(Data.CONTACT_ID, rawContactId);
    					    values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    					    values.put(Email.DATA1, infoContact[7]);
    					    values.put(Email.TYPE, Email.TYPE_HOME);
    					    context.getContentResolver().insert(Data.CONTENT_URI, values); 
    					 }
    				 }
    			 }
    		}
    	}
    }
    Sur la doc officiel le getContentResolver() n'est jamais précédé de context, mais a la compilation : "The method getContentResolver() is undefined for the type SMSReceiver" (en gros il me dit de redefinir la méthode, si c'est ça : comment fait-on ? )
    Même en important : android.content.ContentResolver; (je l'ai retiré parce qu'eclipse me dit que je ne l'utilise pas ...)
    Donc en gros j'ai mis "context." devant pour qu'il puisse trouver la méthode .... logique ? j'en sais rien ... mais ça ne m'enregistre toujours pas le contact.
    Je suis vraiment pas habitué à java, alors si quelqu'un saurais me dire si je suis sur la bonne voie, voir pitetre me donner un indice.

    pour info voici mon manifest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="sms.add.contact"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk android:minSdkVersion="10" />
    	<application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> 
              <receiver class="sms.add.contact.SMSReceiver"
                android:name="sms.add.contact.SMSReceiver">
                <intent-filter android:priority="100">
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>
         </application>
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
    	<uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     
    </manifest>
    Si vous êtes arrivé a cette phrase, merci de m'avoir lu

  2. #2
    Membre actif Avatar de chpil
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 143
    Points : 212
    Points
    212
    Par défaut
    A priori, ton code semble corresponde à ce que tu veux faire. J'y ai néanmoins noté une erreur qui fait que ça ne peut pas marcher pour l'instant
    Le test d'égalité de la valeur de deux chaines se fait via la méthode equals, l'opérateur == testant l'égalité des références.
    Ligne 38, il faut que tu remplaces le code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (messageBody.substring(0,8).equals("#contact#"))
    voire, encore plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (messageBody.startsWith("#contact#"))
    Et ligne 45, il faudrait peut être mieux écrire "android" avec un seul 'd'

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    merci pour cette analyse c'est bien gentil

    J'ai abandonné la solution du ContentValues au profits de l'ArrayList car cette dernière fonctionne ... (je cherche pas a comprendre !)

    Voici le code qui fonctionne nikel !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    package sms.add.contact;
     
    import java.util.ArrayList;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.OperationApplicationException;
    import android.provider.ContactsContract;
    import android.provider.ContactsContract.RawContacts;
    import android.provider.ContactsContract.Data;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.provider.ContactsContract.CommonDataKinds.StructuredName;
    import android.provider.ContactsContract.CommonDataKinds.Email;
    import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
    import android.content.ContentProviderOperation;
    import android.os.Bundle;
    import android.os.RemoteException;
    import android.telephony.SmsMessage;
     
    public class SMSReceiver extends BroadcastReceiver
    {
    	private final String   ACTION_RECEIVE_SMS  = "android.provider.Telephony.SMS_RECEIVED";
    	@Override
    	public void onReceive(Context context, Intent intent)
    	{
    		if (intent.getAction().equals(ACTION_RECEIVE_SMS))
    		{
    			Bundle bundle = intent.getExtras();
    			if (bundle != null)
    			{
    				Object[] pdus = (Object[]) bundle.get("pdus");
    				final SmsMessage[] messages = new SmsMessage[pdus.length];
    				for (int i = 0; i < pdus.length; i++)  {  messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);  }  if (messages.length > -1)
    				{
    					final String messageBody = messages[0].getMessageBody();
    					if (messageBody.startsWith("#contact#"))
    					{
    						String infoContact[] = messageBody.split(";");
    						ArrayList<ContentProviderOperation> op_list = new ArrayList<ContentProviderOperation>();		
    						int backRefIndex = 0;
    						op_list.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
    								.withValue(RawContacts.ACCOUNT_TYPE, null)
    								.withValue(RawContacts.ACCOUNT_NAME, null)
    								.build());
    						op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    								.withValueBackReference(Data.RAW_CONTACT_ID, backRefIndex)
    								.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
    								.withValue(StructuredName.DISPLAY_NAME, infoContact[1]+" "+infoContact[2])
    								.build());
    						op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    								.withValueBackReference(Data.RAW_CONTACT_ID, backRefIndex)
    								.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
    								.withValue(Phone.NUMBER, infoContact[3])
    								.withValue(Phone.TYPE, Phone.TYPE_HOME)
    								.build());
    						op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    								.withValueBackReference(Data.RAW_CONTACT_ID, backRefIndex)
    								.withValue(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE)
    								.withValue(StructuredPostal.STREET, infoContact[4])
    								.withValue(StructuredPostal.POSTCODE, infoContact[5])
    								.withValue(StructuredPostal.CITY, infoContact[6].toUpperCase())
    								.build());
    						op_list.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    								.withValueBackReference(Data.RAW_CONTACT_ID, backRefIndex)
    								.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
    								.withValue(Email.DATA1, infoContact[7])
    								.withValue(Email.TYPE, Email.TYPE_HOME)
    								.build());
    						try {
    							context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, op_list);
    						} catch (RemoteException e) {
    							e.printStackTrace();
    						} catch (OperationApplicationException e) {
    							e.printStackTrace();
    						}
    					}
    				}
    			}
    		}
    	}
    }
    J'ai pas tout compris mais sa marche quand même ^^ je me mettrais pitetre à java quand j'aurai un peu de temps...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme d'ajout de contact sur Windows Live Messenger
    Par maadadi dans le forum Messagerie instantanée
    Réponses: 6
    Dernier message: 20/09/2009, 09h08
  2. Ajout de contact à liste de distribution
    Par sylvain_g dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 05/10/2007, 11h28
  3. VBS Ajouter un "Contact" AD dans un groupe
    Par LordVenom dans le forum VBScript
    Réponses: 1
    Dernier message: 27/03/2007, 09h00
  4. Gestionnaire d'adresse: ajouter un contact à un groupe
    Par Touareg dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/03/2007, 16h01
  5. Ajouter un contact MSN
    Par Are-no dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2006, 02h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo