6

La funzione "onReceive" viene chiamata quando BroadcastReceiver è registrato nel manifesto ma NOT chiamato se registrato dinamicamente.BroadcastReceiver onReceive() non chiamato quando registrato dinamicamente

Il codice che funziona è qui sotto:

public class EyeGesture extends BroadcastReceiver { 
    //Eye Gesture 
    private static IntentFilter eyeGestureIntent; 
    private static Context eyeGestureContext; 
    private static StringBuilder gestureInfo = null; 
    private static BroadcastReceiver broadcastReceiver; 

    // public void startEyeListening() { 
     //Eye Gesture 

    //} 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // this = context; 
     if (intent.getStringExtra("gesture").equals("WINK")) { 
      Log.e("WINKED ",""); 
     }else { 
      Log.e("SOMETHING", "is detected " + intent.getStringExtra("gesture")); 
     } 
     //Disable Camera Snapshot 
     // abortBroadcast(); 

    } 

    public void stopEyeListening() { 
     eyeGestureContext.unregisterReceiver(broadcastReceiver); 
     eyeGestureIntent = null; 
     eyeGestureContext = null; 
     gestureInfo = null; 
    } 

} 

Di seguito si riporta il file manifesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.inno.inno.glassplugin" > 

    <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainFunct" 
      android:icon="@drawable/ic_glass_logo" 
      android:label="@string/title_activity_main_funct" > 
      <intent-filter> 
       <action android:name="com.google.android.glass.action.VOICE_TRIGGER" /> 
      </intent-filter> 
      <meta-data 
       android:name="com.google.android.glass.VoiceTrigger" 
       android:resource="@xml/voice_trigger" /> 
     </activity> 

     <receiver android:name="com.inno.inno.glassplugin.EyeGesture"> 
      <intent-filter> 
       <action android:name="com.google.android.glass.action.EYE_GESTURE" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

Il problema è che "OnReceive" è NON chiamato quando registrati in modo dinamico. Devo farlo in modo dinamico. Di seguito è riportato il codice che è il codice di lavoro NON.

Inoltre, non desidero estendere BroadcastReceiver da questa classe. Perché non ricevo nulla se registrato dinamicamente. Ho rimosso anche la seguente riga dal manifest:

<receiver android:name="com.inno.inno.glassplugin.EyeGesture"> 
       <intent-filter> 
        <action android:name="com.google.android.glass.action.EYE_GESTURE" /> 
       </intent-filter> 
</receiver> 

ma ancora, non funziona. Non c'è nessun errore o eccezione lanciata. Cosa sto sbagliando?

+0

Quale output si ottiene nel LogCat quando registrato dinamicamente? –

risposta

0

Guardando adb logcat in XE21.3, sembra che l'intento com.google.android.glass.action.EYE_GESTURE non raggiunga mai il bus degli eventi; invece, salta direttamente a com.google.glass.action.TAKE_PICTURE, che è la stessa intenzione del pulsante della fotocamera. Quindi sembra che l'API occhio-gesto sia stata rimossa senza annuncio.

+0

Funziona se registrato tramite Manifest ma non quando registrato in modo dinamico con Context.registerReceiver (nuovo BroadcastReceiver(); Questo non è il problema. Grazie per l'aiuto – Programmer

1

Stai usando un intento esplicito? Sembra che i ricevitori di trasmissione registrati dinamicamente non possano ricevere intenti espliciti. Gli intenti impliciti funzionano. Per riferimento: http://streamingcon.blogspot.com/2014/04/dynamic-broadcastreceiver-registration.html

Se il problema non è intenti espliciti, ma se si utilizza LocalBroadcastManager per sendBroadcast quindi assicurarsi che il registerReceiver è anche chiamato di LocalBroadcastManager e non di Context

0
  • Il ricevitore dovrebbe estendere la Classe broadcastReceiver.
  • Definire il ricevitore nel manifesto
  • Nel codice (forse onCreate), registrare il ricevitore
    • Creare un oggetto ricevitore
    • Definire i filtri intento
    • chiamata RegisterReceiver() che passa nel ricevitore ei filtri intento
1

Cercare di utilizzare ApplicationContext invece di attività.

Modyifing linea:

eyeGestureContext = MainFunct.getCurrentContext(); 

vorrei provare le cose in questo ordine:

  1. eyeGestureContext = getApplicationContext();
  2. eyeGestureContext = getApplication();

Se sopra non funziona vorrei estendere l'applicazione e do:

public class MyExtendedApplication extends Application { 

    private static MyExtendedApplication instance; 

    public static MyExtendedApplication getInstance() { 
     return instance; 
    } 
} 

Questo funziona per me con globale "android.net.conn.CONNECTIVITY_CHANGE" in onda

Context c = MyExtendedApplication.getInstance(); 
c.registerReceiver(
     connectivtyChangedReceiver, 
     connectivityFilter); 

in modo opportuno anche per voi con "com.google.android.glass.action.EYE_GESTURE"

Problemi correlati