Зарегистрированный прослушиватель ACTION_HEADSET_PLUG срабатывает только несколько раз

1

Я хочу показать уведомление после того, как гарнитура была подключена и спрятала его после того, как она была отключена. Поэтому я регистрирую ACTION_HEADSET_PLUG Intent Listener в BroadCastReceiver, который запускается на BOOT_COMPLETED. В моем случае я использую HTC Sense (HTC One S), и уведомление отображается только тогда, когда я подключаю гарнитуру, когда Sense загружается (WaitDialog), после чего он больше не будет отображаться.

Если я запускаю OnBootListener в приложении во время выполнения через 'new OnBootreceiver(), onReceive (this, null)' работает отлично.

Manifest:

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        ...
    </activity>

    <receiver android:name=".OnBootReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
 ...

OnBootReceiver:

public void onReceive(Context context, Intent intent) {
    IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    HeadsetStateReceiver receiver = new HeadsetStateReceiver();
    context.registerReceiver( receiver, receiverFilter );
}

HeadsetStateReceiver:

public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,
            "" + (Integer) (intent.getExtras().get("state")),
            Toast.LENGTH_SHORT).show();
    mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);

    Log.e(this.getClass().toString(), "Intent Headset_plug received "
            + intent);
    if ((Integer) (intent.getExtras().get("state")) != 0) {
        notification.flags = Notification.FLAG_ONGOING_EVENT;
        notification.contentIntent = PendingIntent.getActivity(
                context.getApplicationContext(), 0, new Intent(), 0);
        notification.setLatestEventInfo(context, title, message,
                notification.contentIntent);
        mNotificationManager.notify(0xBEA15, notification);
    } else {
        mNotificationManager.cancelAll();
    }

}
Теги:
audio
sense

2 ответа

1
Лучший ответ

Зачем вам нужен BOOT_COMPLETED приемник? Вы пытались получить ACTION_HEADSET_PLUG с использованием файла манифеста?

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
        ... 
    </activity> 

    <receiver android:name=".HeadsetStateReceiver" > 
        <intent-filter> 
            <action android:name="android.intent.ACTION_HEADSET_PLUG" /> 
        </intent-filter> 
    </receiver> 

Код yor тоже немного meessy:

public void onReceive(Context context, Intent intent) {
    boolean isConnected = intent.getIntExtra("state",0)==1; // Can also be 2 if headset is attached w/o mic.

    Toast.makeText(context, 
            isConnected?"connected":"disconnected"), 
            Toast.LENGTH_SHORT).show(); 
    mNotificationManager = (NotificationManager) context 
        .getSystemService(Context.NOTIFICATION_SERVICE); 

    if (isConnected) {
        Log.e(this.getClass().toString(), "Intent Headset_plug connected");
        notification.flags = Notification.FLAG_ONGOING_EVENT; 
        notification.contentIntent = PendingIntent.getActivity( 
                context.getApplicationContext(), 0, new Intent(), 0); 
        notification.setLatestEventInfo(context, title, message, 
                notification.contentIntent); 
        mNotificationManager.notify(0xBEA15, notification); 
    } else {
        Log.e(this.getClass().toString(), "Intent Headset_plug disconnected");
        mNotificationManager.cancelAll(); 
    } 
} 


Ok прямой приемник не будет работать (вот хорошее объяснение).

Я знаю, почему ваш приемник перестает работать через некоторое время. Ваша программа должна быть очищена системой. Чтобы заставить его работать, вам нужно что-то сделать, чтобы ваше приложение не очищалось. Поэтому вам нужно создать сервис. В BOOT_COMPLETED запустите службу и в этом сервисном регистре передайте приемник для ACTION_HEADSET_PLUG. Это должно предотвратить очистку приложения.

  • 0
    XML-материал не работает, так как намерение транслируется «только для зарегистрированных». BootCompletedListener используется, так как я хочу запустить само уведомление независимо от самого приложения.
  • 1
    проверьте это: commonsware.com/blog/2011/07/13/… возможно, это проблема. В общем, нет никакой разницы между манифестом и ручной регистрацией приемника вещания
Показать ещё 2 комментария
1

Ваш код верен, но, насколько я знаю, вы не можете поместить фильтр HEADSET_PLUG в манифест. Вместо этого удалите получателя из манифеста и сделайте это программно, из какой-то части вашего приложения. Метод onCreate() вашего основного действия должен быть точным, например:

ReceiveBroadcast receiver=new ReceiveBroadcast();       
registerReceiver(receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); 
  • 0
    а также отменить регистрацию на Дестрой?
  • 0
    или внутри onStop (), в зависимости от ваших потребностей. @unknown

Ещё вопросы

Сообщество Overcoder
Наверх
Меню