Я использую файл манифеста для создания широковещательного приемника для ACTION_HEADSET_PLUG
. Но я не могу получить трансляцию при подключении/отключении гарнитуры. Какой permission
следует использовать в файле манифеста, чтобы иметь возможность получать ACTION_HEADSET_PLUG
намерение трансляции?
Какое разрешение требуется для получения ACTION_HEADSET_PLUG внутри широковещательного приемника
Ответы (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(). Это должно сработать.
Дело не в разрешении, а в том, как вы зарегистрировали приемник. Трансляция действия подключения гарнитуры может быть получена только активно зарегистрированными приемниками, например:
registerReceiver(receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
Это означает, что вам нужно поддерживать службу, которая содержит ссылку на получателя, а также отменяет ее регистрацию, когда служба уничтожается. Наконец, служба, которая регистрирует приемник, также должна быть запущена при загрузке; что вы делаете с еще одним получателем, который перехватывает намерение android.intent.action.BOOT_COMPLETED
. Для этой части вам нужно будет использовать разрешение android.permission.RECEIVE_BOOT_COMPLETED
.
Полный пример службы, которая делает это, вы можете посмотреть на приложение, которое я написал, делает именно это.