Autore Topic: Service chiamate.  (Letto 654 volte)

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Service chiamate.
« il: 21 Giugno 2014, 18:32:26 CEST »
0
Ho creato un service che sia in grado di intercettare le chiamate. L'applicazione funziona, l'unico problema è che quando dico al servizio di fermarsi ( ovvero non intercettare il numero ) lui lo fa comunque.
Ecco il codice:

MainActivity:

Codice (Java): [Seleziona]
public class ServiceDemo01Activity extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Button bottoneAvvia = new Button(this);
                bottoneAvvia.setText("Avvia il servizio");
                bottoneAvvia.setOnClickListener(new View.OnClickListener() {
   
                        @Override
                        public void onClick(View v) {
                                avviaServizio();
                        }
                });
 
                Button bottoneArresta = new Button(this);
                bottoneArresta.setText("Arresta il servizio");
                bottoneArresta.setOnClickListener(new View.OnClickListener() {
   
                        @Override
                        public void onClick(View v) {
                                arrestaServizio();
                        }
                });
 
                LinearLayout layout = new LinearLayout(this);
                layout.setOrientation(LinearLayout.VERTICAL);
                layout.addView(bottoneAvvia);
                layout.addView(bottoneArresta);
                setContentView(layout);
                Log.i("ServiceDemo01", "Attivita creata");
        }
 

        @Override
        protected void onDestroy() {
                super.onDestroy();
                Log.i("ServiceDemo01", "Attivita distrutta");
        }

        private void avviaServizio() {
                startService(new Intent(this, MioServizio.class));
        }

        private void arrestaServizio() {
                stopService(new Intent(this, MioServizio.class));
        }
}

Activity del servizio:

Codice (Java): [Seleziona]
public class MioServizio extends Service {
 

       
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
 
        @Override
        public void onCreate() {
                super.onCreate();
                Log.i("ServiceDemo01", "Servizio avviato");
                TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                tmanager.listen(new CallListener(), CallListener.LISTEN_CALL_STATE);
               
        }
               
        class CallListener extends PhoneStateListener
        {
                @Override
                public void onCallStateChanged(int state, String number){
                        super.onCallStateChanged(state, number);
                        switch(state) {
                                case TelephonyManager.CALL_STATE_RINGING:
                                        Log.i("ServiceDemo01", number);
                        }
                }
        }
               
 

        @Override
        public void onDestroy() {
                super.onDestroy();
                Log.i("ServiceDemo01", "Servizio arrestato");
        }
}

Vi ringrazio dell'attenzione :)

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #1 il: 24 Giugno 2014, 16:37:17 CEST »
0
Nessuno sa rispondere ?

iClaude

  • Visitatore
Re:Service chiamate.
« Risposta #2 il: 24 Giugno 2014, 22:40:45 CEST »
+1
Nessuno sa rispondere ?

Ma è necessario utilizzare un Service in questo caso?
Cmq prova a deregistrare il listener nel metodo onDestroy, come spiegato qua (metodo listen):
TelephonyManager | Android Developers, int)

Però devi modificare leggermente il codice perchè per deregistrare il listener devi passare lo stesso oggetto listener creato in precedenza.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #3 il: 25 Giugno 2014, 00:56:41 CEST »
0
Cosa si potrebbe utilizzare invece dei service?

iClaude

  • Visitatore
Re:Service chiamate.
« Risposta #4 il: 25 Giugno 2014, 08:34:53 CEST »
0
Cosa si potrebbe utilizzare invece dei service?

Forse ho capito perché vuoi utilizzare un Service.
Ma deregistrando il listener ora funziona?

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #5 il: 25 Giugno 2014, 11:03:03 CEST »
0
Grazie, mi sono fatto un idea. L'ultimo dubbio è: come faccio a passare al metodo onDestroy il listener che ho usato in precedenza?
Comunque ho capito quale metodo mi hai suggerito: credo che sia proprio quello giusto

Codice (Java): [Seleziona]
public void listen (PhoneStateListener listener, int events)

iClaude

  • Visitatore
Re:Service chiamate.
« Risposta #6 il: 25 Giugno 2014, 11:22:12 CEST »
0
Grazie, mi sono fatto un idea. L'ultimo dubbio è: come faccio a passare al metodo onDestroy il listener che ho usato in precedenza?
Comunque ho capito quale metodo mi hai suggerito: credo che sia proprio quello giusto

Codice (Java): [Seleziona]
public void listen (PhoneStateListener listener, int events)

Puoi usare una variabile a livello di Service, tipo:
CallListener mioCallListener = new CallListener ();

e poi usare mioCallListener sia per registrare che per deregistrare l'ascoltatore.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #7 il: 25 Giugno 2014, 11:41:58 CEST »
0
Ho provato a fare una cosa del genere:

Codice (Java): [Seleziona]
public class MioServizio extends Service {
        TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

       
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
 
        @Override
        public void onCreate() {
                super.onCreate();
                Log.i("ServiceDemo01", "Servizio avviato");
                //TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                tmanager.listen(new CallListener(), CallListener.LISTEN_CALL_STATE);
        }
               
        class CallListener extends PhoneStateListener
        {
                @Override
                public void onCallStateChanged(int state, String number){
                        super.onCallStateChanged(state, number);
                        switch(state) {
                                case TelephonyManager.CALL_STATE_RINGING:
                                        Log.i("ServiceDemo01", number);
                        }
                }
        }
               
 

        @Override
        public void onDestroy() {
                super.onDestroy();
                tmanager.listen(new CallListener(),CallListener.LISTEN_NONE);
                Log.i("ServiceDemo01", "Servizio arrestato");
        }
}

Ma l'applicazione cresha:

06-25 11:37:46.020: E/AndroidRuntime(4574): FATAL EXCEPTION: main
06-25 11:37:46.020: E/AndroidRuntime(4574): java.lang.RuntimeException: Unable to instantiate service com.example.serviceproject.MioServizio: java.lang.NullPointerException
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2671)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.app.ActivityThread.access$1700(ActivityThread.java:159)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1404)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.os.Looper.loop(Looper.java:176)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.app.ActivityThread.main(ActivityThread.java:5419)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at java.lang.reflect.Method.invokeNative(Native Method)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at java.lang.reflect.Method.invoke(Method.java:525)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at dalvik.system.NativeStart.main(Native Method)
06-25 11:37:46.020: E/AndroidRuntime(4574): Caused by: java.lang.NullPointerException
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.content.ContextWrapper.getSystemService(ContextWrapper.java:526)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at com.example.serviceproject.MioServizio.<init>(MioServizio.java:13)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at java.lang.Class.newInstanceImpl(Native Method)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at java.lang.Class.newInstance(Class.java:1130)
06-25 11:37:46.020: E/AndroidRuntime(4574):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2668)
06-25 11:37:46.020: E/AndroidRuntime(4574):    ... 10 more

iClaude

  • Visitatore
Re:Service chiamate.
« Risposta #8 il: 25 Giugno 2014, 12:46:01 CEST »
0
Non è la soluzione che ti avevo suggerito: è CallListener la variabile che devi rendere globale e non tmanager. Quel codice non potrà mai funzionare.
Se poi hai una NullPointerException crea la variabile in onCreate, ma sempre dichiarandola d'istanza.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #9 il: 25 Giugno 2014, 12:55:18 CEST »
0
Praticamente il codice è tutto da cambiare. Qua non ho direttamente una variabile che è associata al liste ed visto che faccio listener ( new listener ) come faccio a prenderla ? Scusa il disturbo ma non riesco a capire

iClaude

  • Visitatore
Re:Service chiamate.
« Risposta #10 il: 25 Giugno 2014, 13:15:03 CEST »
0
Basta dichiarare la variabile all'inizio:
CallListener mioCallListener;

La crei in onCreate:
mioCallListener = new CallListener ();

Quindi usi mioCallListener x registrare e deregistrare il listener...

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Service chiamate.
« Risposta #11 il: 25 Giugno 2014, 13:25:54 CEST »
0
Una cosa del genere? Da lo stesso errore di prima. Sicuramente sbaglio qualcosa io. Scusa per il disturbo e grazie per la pazienza
Codice (Java): [Seleziona]
public class MioServizio extends Service {
        TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        CallListener Listen = new CallListener();
       
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
 
        @Override
        public void onCreate() {
                super.onCreate();
                Log.i("ServiceDemo01", "Servizio avviato");
                //TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                tmanager.listen(Listen, CallListener.LISTEN_CALL_STATE);       
                //tmanager.listen(new CallListener(), CallListener.LISTEN_CALL_STATE);
        }
               
        class CallListener extends PhoneStateListener
        {
                @Override
                public void onCallStateChanged(int state, String number){
                        super.onCallStateChanged(state, number);
                        switch(state) {
                                case TelephonyManager.CALL_STATE_RINGING:
                                        Log.i("ServiceDemo01", number);
                        }
                }
        }
               
 

        @Override
        public void onDestroy() {
                super.onDestroy();
                tmanager.listen(Listen,CallListener.LISTEN_NONE);
                //tmanager.listen(new CallListener(),CallListener.LISTEN_NONE);
                Log.i("ServiceDemo01", "Servizio arrestato");
        }
}

Post unito: 25 Giugno 2014, 13:37:19 CEST
Stupidità mia, adesso funziona.
Ti ringrazio per la pazienza e il tempo che mi hai dedicato.
Il codice è il seguente:

Codice (Java): [Seleziona]
public class MioServizio extends Service {
        CallListener Listen = new CallListener();
       
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
 
        @Override
        public void onCreate() {
                super.onCreate();
                Log.i("ServiceDemo01", "Servizio avviato");
                TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                tmanager.listen(Listen, CallListener.LISTEN_CALL_STATE);       
        }
               
        class CallListener extends PhoneStateListener
        {
                @Override
                public void onCallStateChanged(int state, String number){
                        super.onCallStateChanged(state, number);
                        switch(state) {
                                case TelephonyManager.CALL_STATE_RINGING:
                                        Log.i("ServiceDemo01", number);
                        }
                }
        }
               
 

        @Override
        public void onDestroy() {
                super.onDestroy();
                TelephonyManager tmanager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                tmanager.listen(Listen,CallListener.LISTEN_NONE);
                Log.i("ServiceDemo01", "Servizio arrestato");
        }
}


« Ultima modifica: 25 Giugno 2014, 13:37:19 CEST da Trotto23, Reason: Merged DoublePost »