Какое разрешение требуется для получения ACTION_HEADSET_PLUG внутри широковещательного приемника

Я использую файл манифеста для создания широковещательного приемника для ACTION_HEADSET_PLUG. Но я не могу получить трансляцию при подключении/отключении гарнитуры. Какой permission следует использовать в файле манифеста, чтобы иметь возможность получать ACTION_HEADSET_PLUG намерение трансляции?


person BonosF    schedule 17.11.2010    source источник


Ответы (2)


С API 8 я вызывал свой широковещательный приемник без создания службы или запроса дополнительных разрешений.

Вы можете определить внутренний класс в своей основной деятельности, подобный тому, который я определил ниже:

public class HeadSetBroadCastReceiver extends BroadcastReceiver
    {

        @Override
        public void onReceive(Context context, Intent intent) {

            // TODO Auto-generated method stub
            String action = intent.getAction();
            Log.i("Broadcast Receiver", action);
            if( (action.compareTo(Intent.ACTION_HEADSET_PLUG))  == 0)   //if the action match a headset one
            {
                int headSetState = intent.getIntExtra("state", 0);      //get the headset state property
                int hasMicrophone = intent.getIntExtra("microphone", 0);//get the headset microphone property
                if( (headSetState == 0) && (hasMicrophone == 0))        //headset was unplugged & has no microphone
                {
                               //do whatever
                }
            }           

        }

    }

Затем зарегистрируйте свой широковещательный приемник динамически или статически. Я зарегистрировал свой динамически в методе onCreate() моей Activity:

this.registerReceiver(headsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));

Убедитесь, что вы отменили регистрацию BroadcastReceiver с помощью контекста unregisterReceiver. В моем случае я сделал это в методе onDestroy(). Это должно сработать.

person WindsurferOak    schedule 18.02.2011

Дело не в разрешении, а в том, как вы зарегистрировали приемник. Трансляция действия подключения гарнитуры может быть получена только активно зарегистрированными приемниками, например:

registerReceiver(receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));

Это означает, что вам нужно поддерживать службу, которая содержит ссылку на получателя, а также отменяет ее регистрацию, когда служба уничтожается. Наконец, служба, которая регистрирует приемник, также должна быть запущена при загрузке; что вы делаете с еще одним получателем, который перехватывает намерение android.intent.action.BOOT_COMPLETED. Для этой части вам нужно будет использовать разрешение android.permission.RECEIVE_BOOT_COMPLETED.

Полный пример службы, которая делает это, вы можете посмотреть на приложение, которое я написал, делает именно это.

person jakebasile    schedule 14.12.2010
comment
Как узнать, какие действия из android.intent.action.* можно использовать без активной службы? Как и в этом случае, если бы я сделал ‹action android:name=android.media.AUDIO_BECOMING_NOISY/›, мне не понадобился бы сервис для обнаружения удаления головного телефона. Я просмотрел документацию по Android и не могу сказать, какие службы могут транслировать, можно просто использовать, зарегистрировавшись в манифесте. - person ControlAltDelete; 04.06.2012