6

Функция «onReceive» вызывается, когда BroadcastReceiver зарегистрирован в манифесте, но НЕ вызван, если зарегистрирован динамически.BroadcastReceiver onReceive() не вызывается при динамическом учете

Код, который работает ниже:

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; 
    } 

} 

Ниже файл манифеста

<?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> 

Проблема заключается в том, что «OnReceive» является НЕ вызывается при учете динамически. Я должен сделать это динамически. Ниже приведен код NOT рабочий код.

public class EyeGesture extends Activity { 
    //Eye Gesture 
    IntentFilter eyeGestureIntentFilter; 
    Context eyeGestureContext; 
    BroadcastReceiver broadcastReceiver; 


    public EyeGesture(){ 
     Log.e("CONSTRUCTOR ", ""); 
     eyeGestureContext = MainFunct.getCurrentContext(); 
     eyeGestureIntentFilter = new IntentFilter("com.google.glass.action.EYE_GESTURE"); 
     eyeGestureIntentFilter.setPriority(1000); 
     startRunning(); 
    } 

    void startRunning(){ 
     eyeGestureContext.registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.e("Received ", " Something"); 
      } 
     },eyeGestureIntentFilter); 
    } 


    @Override 
    public void onResume(){ 
     super.onResume(); 
    } 

    @Override 
    public void onPause(){ 
     super.onPause(); 
     unregisterReceiver(broadcastReceiver); 
    } 
    public void stopEyeListening() { 
     eyeGestureContext.unregisterReceiver(broadcastReceiver); 
     eyeGestureIntentFilter = null; 
     eyeGestureContext = null; 
    } 

} 

Кроме того, я не хочу распространять BroadcastReceiver из этого класса. Почему я не получаю ничего, если зарегистрирован динамически. Я также удалил из манифеста следующую строку:

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

но все же, он не работает. Исправлена ​​ошибка или исключение. Что я делаю неправильно?

+0

Какой результат вы получаете в LogCat при регистрации динамически? –

ответ

0

Просмотр adb logcat в XE21.3, похоже, что com.google.android.glass.action.EYE_GESTURE намерение никогда не попадает в шину событий; вместо этого он переходит прямо к com.google.glass.action.TAKE_PICTURE, что является тем же намерением, что и кнопка камеры. Таким образом, похоже, что API-интерфейс eye-gesture был удален без объявления.

+0

Он работает, если зарегистрирован через манифест, но не при динамическом учете с помощью Context.registerReceiver (новый BroadcastReceiver(); Это не проблема. Спасибо за помощь – Programmer

1

Вы используете явное намерение? Похоже, что динамически зарегистрированные широковещательные приемники не могут получать явные намерения. Неявные намерения работают. Для справки: http://streamingcon.blogspot.com/2014/04/dynamic-broadcastreceiver-registration.html

Если проблема не явные намерения, но если вы используете LocalBroadcastManager для sendBroadcast, то убедитесь, что registerReceiver также призвана LocalBroadcastManager и не контекстного

0
  • Приемник должен продлить Класс BroadcastReceiver.
  • Определить приемник в явном
  • в коде (возможно OnCreate), зарегистрировать приемник
    • Создание объекта приемника
    • Определить намерения фильтры
    • вызова RegisterReceiver(), проходящей в приемнике и умысел фильтры
1

Попробуйте использовать ApplicationContext вместо деятельности.

Modyifing линия:

eyeGestureContext = MainFunct.getCurrentContext(); 

Я хотел бы попробовать вещи в таком порядке:

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

Если выше не работает, я бы расширить применение и do:

public class MyExtendedApplication extends Application { 

    private static MyExtendedApplication instance; 

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

Это работает для меня с глобальным "android.net.conn.CONNECTIVITY_CHANGE" вещать

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

так должен также для вас с "com.google.android.glass.action.EYE_GESTURE"

Смежные вопросы