Autore Topic: android.permission.RECEIVE_BOOT_COMPLETED Non funziona!  (Letto 1484 volte)

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« il: 14 Marzo 2013, 15:50:19 CET »
0
Salve, sto andando al manicomio, ho due app che fanno uso del permission android.permission.RECEIVE_BOOT_COMPLETED
in quanto entrambe implementano una classe BootReceiver che estende BroadcastReceiver che deve essere lanciato all'avvio del cellulare (queste sono identiche si differenziano soltanto per il loro package)

La prima app si comporta bene, mentre la seconda non fa partire la classe BootReceiver.

posto qui di seguito la classe BootReceiver e il manifest:

Codice (Java): [Seleziona]
package it.petitogennaro.lepreapp;

import java.util.Calendar;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
 
public class BootReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
               
                //LEGGE LA ACTION CHE ATTIVA IL BROADCAST RECEIVER
                String action = intent.getAction();
               
                Calendar cal = Calendar.getInstance();
           
            cal.set(Calendar.HOUR_OF_DAY, 15);
            cal.set(Calendar.MINUTE, 41);
            cal.set(Calendar.SECOND, 00);
           
            Intent serviceIntent = new Intent(context, MyService.class);
           
            //PENDING INTENT
            PendingIntent pendingIntent = PendingIntent.getService(context, 0, serviceIntent, 0);
           
            /*
            PER CREARE UN ALARM MANAGER ERO SOLITO FARE COSI:
            AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
            */

            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            //am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
            am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
            //am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() , 5000, pendingIntent);
        }
}

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="it.petitogennaro.lepreapp"
   android:versionCode="1"
   android:versionName="1.0"
   android:installLocation="preferExternal" >

    <uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="17" />
   
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.VIBRATE" />    

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name=".PrimaActivity"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
           android:name=".TestNotifiche"
           android:label="@string/app_name" >
        </activity>
       
        <receiver android:name="it.petitogennaro.lepreapp.BootReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <category android:name="android.intent.category.HOME" />
                </intent-filter>
        </receiver>
       
        <service android:name="it.petitogennaro.lepreapp.MyService" />        
       
    </application>

</manifest>

L'unica differenza fra le due app e che la prima ha come permessi soltanto :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE" /> 

E quindi non si collega ad internet

Mi viene un dubbio, ma si possono leggere le shared preference in un service, senza che l'app sia stata aperta?
« Ultima modifica: 14 Marzo 2013, 15:58:18 CET da GennyAndroid »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #1 il: 14 Marzo 2013, 16:09:01 CET »
0
Ma non ti chiama proprio il Receiver o non ti imposta l'intent con l'AlarmManager?

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #2 il: 14 Marzo 2013, 16:15:52 CET »
0
non mi chiama proprio il receiver!

ho provato a chiamarlo da un'activity e mi funziona.
poi ho provato a cambiare il contenuto del onreceive(), ed ho inserito un semplice toast ed anche in quel caso non mi funziona.

Ripeto la cosa strana è che ho realizzato un'app identica e li funziona tutto a meraviglia

Sto uscendo matto, in pratica sono arrivato alla fine della realizzazione della mia app, questo passaggio doveva essere l'ultimo e credevo di implementarlo in 5 minuti dato che mi ero preparato gia tutto in un'app che doveva fare soltanto quello ( sarebbe l'app che funziona bene )

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #3 il: 14 Marzo 2013, 17:26:42 CET »
0
Hai provato a togliere category dall'intent filter?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #4 il: 14 Marzo 2013, 18:42:28 CET »
0
Si ho provato a togliere anche il category, ma non ho risolto ancora niente

Post unito: 14 Marzo 2013, 19:09:12 CET
Ragazzi ho trovato l'inghippo:

Utilizzavo  per installare l'app sulla scheda sd, rimuovendo questa specifica, il receiver viene finalmente chiamato all'accensione del telefono.

Ora la mia domanda è:

Come possono coesistere  ?
Codice (XML): [Seleziona]
android:installLocation="preferExternal" e
Codice (XML): [Seleziona]
RECEIVE_BOOT_COMPLETED
« Ultima modifica: 14 Marzo 2013, 19:09:12 CET da GennyAndroid, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #5 il: 14 Marzo 2013, 19:14:01 CET »
0
Ah ecco, ho inserito il problema dell'sdcard su google e mi ha risposto:  ;-)

App Install Location | Android Developers
Citazione
The system delivers the ACTION_BOOT_COMPLETED broadcast before the external storage is mounted to the device. If your application is installed on the external storage, it can never receive this broadcast.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #6 il: 14 Marzo 2013, 19:21:58 CET »
0
Quindi a quanto pare non c'è niente da fare, l'unica soluzione che esiste a questo punto ( molto scomoda e orribile anche a sentire )

Creare un'app "leggerissima" con l'unico scopo di attivare il broadcast receiver ad ogni accensione.

Vabbè metto risolto, grazie a tutti coloro che mi hanno aiutato

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #7 il: 14 Marzo 2013, 19:43:08 CET »
0
Domanda che però a questo punto mi sorge spontanea: ma esiste un intent che viene lanciato al termine del mount dell'sd card? Perché se esiste è un buon candidato per il lancio di servizio che normalmente si piazzano al boot.

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #8 il: 14 Marzo 2013, 19:45:13 CET »
0
Domanda che però a questo punto mi sorge spontanea: ma esiste un intent che viene lanciato al termine del mount dell'sd card? Perché se esiste è un buon candidato per il lancio di servizio che normalmente si piazzano al boot.
Me lo sono chiesto anche io ma credo che non esista purtroppo!

Dato che ci sono volevo chiedervi un parere:

Il mio obbiettivo è che l'app sin dalla sua installazione (ovviamente deve essere stata aperta almeno una volta) ad un certo orario deve far partire un service.

Quello che ho fatto quindi è stato di creare un broadcast receiver che si avvia all'accensione, però resterebbe in piedi il problema che appena  l'app viene installata e fino a quando l'utente non chiude il cellulare per poi riaccenderlo, il service non viene mai avviato.

Allora ho pensato che al primo avvio effettivo dell'app richiamo lo stesso broadcast receiver di prima (stavolta manualmente dal codice)
Il problema dovrebbe essere risolto così, ma leggendo un po in giro ho letto che quando un BroadCast viene chiamato da codice questo ha un ciclo di vita legato al componente che lo richiama.

E quindi la mia domanda è:
Se richiamo il broadcast receiver da codice questo muore se poi chiudo l'app? Se così fosse come posso avviare a questo problema?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #9 il: 14 Marzo 2013, 20:49:38 CET »
0
Domanda che però a questo punto mi sorge spontanea: ma esiste un intent che viene lanciato al termine del mount dell'sd card? Perché se esiste è un buon candidato per il lancio di servizio che normalmente si piazzano al boot.

Probabilmente non basta, perchè il fatto che sia montata non garantisce che ci sia l'app contenente il receiver stesso.

E' comunque molto insolito avere un'app così grande da dover essere spostata in SDCARD (penso ai giochi con centinaia di MB di assets) e che deve anche ricevere il BOOT_COMPLETED. Se è possibile fare a meno dello spostamento su SDCARD, direi che è di gran lunga preferibile, rispetto a perdere la funzionalità del BOOT_COMPLETED.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #10 il: 15 Marzo 2013, 01:08:47 CET »
+3
Domanda che però a questo punto mi sorge spontanea: ma esiste un intent che viene lanciato al termine del mount dell'sd card? Perché se esiste è un buon candidato per il lancio di servizio che normalmente si piazzano al boot.

Puoi provare a registrare il receiver con  android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #11 il: 15 Marzo 2013, 02:29:26 CET »
0
Puoi provare a registrare il receiver con  android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.

Grande, domani lo provo subito.

Un'altra cosa, purtroppo quando in gestione attività -> gestione RAM schiaccio su "Canc. memoria" l'allarme precedentemente creato non funge più, esiste un modo per renderlo incancellabile? oppure devo intercettare questo evento con un BroadcastReceiver e ricreare un nuovo allarme? In tal caso quale sarebbe l'ACTION?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #12 il: 15 Marzo 2013, 07:46:41 CET »
0
Grande, domani lo provo subito.

Un'altra cosa, purtroppo quando in gestione attività -> gestione RAM schiaccio su "Canc. memoria" l'allarme precedentemente creato non funge più, esiste un modo per renderlo incancellabile? oppure devo intercettare questo evento con un BroadcastReceiver e ricreare un nuovo allarme? In tal caso quale sarebbe l'ACTION?

In questo caso l'Alarm viene cancellato.
Non credo che esista un modo per intercettare questo evento, o per lo meno non lo conosco. Puoi chiaramente fare qualcosa quando l'utente riapre l'app.

C'è una considerazione.
E' stato l'utente che ha cancellato l'alarm attraverso un task manager o un task killer, non è stato Android a farlo (e questo è proprio uno dei motivi per cui si legge che i task killer non servono e non vanno usati).
Partendo da questo presupposto, un utente non può lamentarsi se prima abbatte un servizio e poi quello stesso servizio non funziona come dovrebbe.


Non c'entra nulla con la domanda, ma valuta l'opportunità di usare
Codice (Java): [Seleziona]
am.setInexactRepeating

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #13 il: 15 Marzo 2013, 08:07:40 CET »
0
Puoi provare a registrare il receiver con  android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.

Interessante! Non conoscevo questo intent.

Unica cosa che chiederei a chi lo prova è di dirci se le applicazioni installate sulla SD ricevono questo stesso intent, perchè la documentazione ufficiale dice di no:

ACTION_EXTERNAL_APPLICATIONS_AVAILABLE | Android Developers

Citazione
Note that the packages in this list do not receive this broadcast.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline GennyAndroid

  • Utente junior
  • **
  • Post: 116
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Play Store ID:
    Gennaro Petito
  • Sistema operativo:
    Windows 7
Re:android.permission.RECEIVE_BOOT_COMPLETED Non funziona!
« Risposta #14 il: 15 Marzo 2013, 11:57:49 CET »
0
Non c'entra nulla con la domanda, ma valuta l'opportunità di usare
Codice (Java): [Seleziona]
am.setInexactRepeating

Non ho ancora capito che differenza c'è fra "setInexactRepeating" e il semplice "setRepeating"