Aller au contenu

Créer un service


grofs

Recommended Posts

Bonjour je développe actuellement une appli pour la réception des sms,

Le truc c'est que j'arrive pas à faire marcher mon service au démarrage de mon appli

Voici le code du service :

package com.grofs.sms;

import com.grofs.sms.Main.Receiver;
import com.grofs.sms.R.string;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.IBinder;
import android.os.Vibrator;
import android.telephony.SmsManager;
import android.widget.Toast;

public class reveive_texto extends Service {

   public static final String EVENT_ACTION = "Texto";

   Vibrator vibrator;

   public class MyBinder extends Binder{
       reveive_texto getService(){
           return reveive_texto.this;
       }
   }

   @Override
   public IBinder onBind(Intent arg0) {

       return new MyBinder();
   }

   @Override
   public void onCreate() {

       //SMS
       vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
       SmsManager smsManager = SmsManager.getDefault();
       Receiver receiver = new Receiver();

       registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

       //Avertissement pour prévenir que le service est bien lancé

       Toast.makeText(this, "Texto marche maintenant en tâche de fond", 3000).show();




       Intent intent = new Intent (EVENT_ACTION);
       super.onCreate();

   }



   @Override
   public void onDestroy() {
       // TODO Auto-generated method stub
       super.onDestroy();
   }

   @Override
   public void onStart(Intent intent, int startId) {
       Toast.makeText(this, "Texto marche maintenant en tâche de fond", 3000).show();
       super.onStart(intent, startId);
   }

   public class Receiver extends BroadcastReceiver{

       @Override
       public void onReceive(Context context, Intent intent) {
           // TODO Auto-generated method stub

           Intent intent1 = new Intent (context, TextoReceive.class);
           startActivity(intent1);
           Toast.makeText(context, R.string.texto , Toast.LENGTH_SHORT).show();
           vibrator.vibrate(500);




               }

           }



}

Si vous savez comment faire merci d'avance ;)

Lien vers le commentaire
Partager sur d’autres sites

Il faut recevoir l'évènement "Boot", et démarrer ton service lors de la réception de cet évènement :

À ajouter dans ton AndroidManifest.xml

<?xml version="1.0" encoding="UTF-8"?>
   package="com.naholyr.wakeuplight" xmlns:android="http://schemas.android.com/apk/res/android">

...





...

...

...

Et le code de ton BootReceiver.java

public class BootReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(final Context context, final Intent bootintent) {
       // Start battery monitoring service
       context.startService(new Intent("mon.package.MonService));
   }

}

A priori je verrais deux raisons qui pourraient faire que ça ne marche pas chez toi :

  1. Tu fais un startActivity au lieu d'un startService. Même pas sûr que ce soit totalement impossible de faire un startActivity au boot, ce n'est de toute façon pas ce que tu souhaites faire.
  2. Tu n'as peut-être pas ajouté la permission nécessaire dans ton manifest, ou mal déclaré ton receiver dans le manifest.

Modifié par naholyr
Lien vers le commentaire
Partager sur d’autres sites

J'ai essayé mais ça ne marche toujours pas

Voici mon manifest:

<?xml version="1.0" encoding="utf-8"?>
     package="com.grofs.sms"
     android:versionCode="6"
     android:versionName="0.4.1 BETA">



       android:theme="@android:style/Theme.NoTitleBar"
                 android:label="@string/app_name">






          android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                 android:label="@string/app_name">












                 android:theme="@android:style/Theme.NoTitleBar"
                 android:label="@string/app_name">
















Lien vers le commentaire
Partager sur d’autres sites

Non je comfirme je vois aucune erreur dans le logcat peut être parce que j'ai mal lancé le service :s

Voici le code main:

package com.grofs.sms;








import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent.OnFinished;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Vibrator;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class Main extends Activity implements OnClickListener {

   Vibrator vibrator;



   /** Called when the activity is first created. */



       @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);




       Intent bindIntent = new Intent(Main.this, reveive_texto.class);
       vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
       SmsManager smsManager = SmsManager.getDefault();






   }





       [..........................]

}        







Lien vers le commentaire
Partager sur d’autres sites

Humm possible, j'ai regardé des exemples de service mais mon MyBinder et correct en principe. Mais je pense que c'est un probleme lors du lancement du service. Parce que le log n'affiche pas le service

Lien vers le commentaire
Partager sur d’autres sites

Tu retournes un MyBinder lorsqu'une Activity fait un bindservice.

Si le code te parrait 100% bon alors ça doit venir de la config, peut être des permissions ?

Déjà dans ton receiver, tu devrais vérifier que le l'intent que tu recois correspond à android.intent.action.BOOT_COMPLETED.

Ensuite je te conseille de récupérer la valeur de context.startservice dans un ComponentName ou autre chose et de loguer une erreur si il est null.

Cela te permettra de vérifier déjà que lors que ton instance de BootReceiver reçoit un broadcast, eh bien le service est déjà actif.

Pour la log utilise Log.e (méthode statique des logs android).

Si ça ne log rien, alors essaie de rajouter android:enabled="true" en attribut de ton receiver dans le manifest

Lien vers le commentaire
Partager sur d’autres sites

Bon je suis débutant sur Android, donc j'ai à peu près compris ce que tu as dit sauf

:

Ensuite je te conseille de récupérer la valeur de context.startservice dans un ComponentName ou autre chose et de loguer une erreur si il est null.

Je comprend pas trop comment faire :s

Lien vers le commentaire
Partager sur d’autres sites

Et bien à un moment tu dois démarrer ton service avec

context.startService(...)

il faut que tu récupères le résultat pour le traiter

var = context.startService(...)
if (var == null) {
 erreur()
}

au fil des messages j'ai un peu peur que tu ne comprennes pas vraiment ce que tu es en train de faire ;)

Si tu pouvais nous donner le code complet (le vrai, pas celui que tu nous as donné au début où tu fais un startActivity au lieu d'un startService par exemple) je pense qu'on trouverait rapidement les anomalies.

Lien vers le commentaire
Partager sur d’autres sites

^^ c'est pour ça que je demande parce que je comprend pas trop mais je comprend bien quand tu expliques

Voici le code de BootReceive :

package com.grofs.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class BootReceiver extends BroadcastReceiver {

   public void onReceive(final Context context, final Intent bootintent) {
       // Start battery monitoring service
       context.startService(new Intent(context, reveive_texto.class));
       Toast.makeText(context, "Test de démarage ;)", 3000).show();

   }

}

La le code du service lui même :

package com.grofs.sms;


import com.grofs.sms.R.string;
import com.grofs.sms.R.xml;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Vibrator;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class reveive_texto extends Service implements ServiceConnection {

   TextView text;

   public static final String EVENT_ACTION = "Texto";
   private final IBinder binder = new MyBinder();
   private reveive_texto serviceBinder;


   Vibrator vibrator;

   public class MyBinder extends Binder{
       reveive_texto getService(){
           return reveive_texto.this;
       }
   }



   @Override
   public IBinder onBind(Intent intent) {
        return binder;
   }

   @Override
   public void onCreate() {

       //SMS
       vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
       SmsManager smsManager = SmsManager.getDefault();
       Receiver receiver = new Receiver();

       Log.i("Salut", "[color=red][b]sa[/b][/color] va ?");

       text.findViewById(R.id.TextView01);

       registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

       //Avertissement pour prévenir que le service est bien lancé

       Toast.makeText(this, "Texto marche maintenant en tâche de fond", 3000).show();




       Intent intent = new Intent (EVENT_ACTION);
       super.onCreate();

   }



   @Override
   public void onDestroy() {
       // TODO Auto-generated method stub
       super.onDestroy();
   }

   @Override
   public void onStart(Intent intent, int startId) {
       Toast.makeText(this, "Texto marche maintenant en tâche de fond", 3000).show();
       super.onStart(intent, startId);
   }

   public class Receiver extends BroadcastReceiver{

       @Override
       public void onReceive(Context context, Intent intent) {
           // TODO Auto-generated method stub

           Intent intent1 = new Intent (context, TextoReceive.class);
           startActivity(intent1);
           Toast.makeText(context, R.string.texto , Toast.LENGTH_SHORT).show();
           vibrator.vibrate(500);
           text.setText("Message");
           if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
           Bundle bundle = intent.getExtras();
           if(bundle != null){
               Object[] pdus = (Object[]) bundle.get("pdus");
               SmsMessage[] messages = new SmsMessage[pdus.length];
               for(int i = 0; i                    messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
               for(SmsMessage message : messages){
                   Log.i("",message.getOriginatingAddress()+"::"+message.getMessageBody());






               }
           }
           }

           }



   public void onServiceConnected(ComponentName arg0, IBinder arg1) {
       Log.i("Receive_texto", "Service lancé");

   }

   public void onServiceDisconnected(ComponentName name) {
               Log.i("ServiceCall", "Service terminé");

   }



}



   public void onServiceConnected(ComponentName name, IBinder service) {
       // TODO Auto-generated method stub

   }

   public void onServiceDisconnected(ComponentName name) {
       // TODO Auto-generated method stub

   }
}


Lien vers le commentaire
Partager sur d’autres sites

Bon mon logcat à arrêter de me causer des problèmes, j'ai enfin trouvé une erreur voila la capture d'écran que j'ai prise :

capturexv.png

Si ça peux vous aider un petit peux ;) et vous inquietez pas pour le " android:exported="true"" je l'ai enlevé après :)

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...