2017-04-03 8 views
0

안드로이드 4에서 모두 잘 작동합니다. Android 6에서는 onReceive()의 동적 등록 BroadcastReceiver이 호출되지 않습니다. 나는이 코드로 수신기를 등록한다 :안드로이드 6 음악 이벤트에 대한 BroadcastReceiver 등록하지 않습니다

IntentFilter filter = new IntentFilter(); 
filter.addAction("com.android.music.metachanged"); 
filter.addAction("com.android.music.playstatechanged"); 
filter.addAction("com.android.music.playbackstatechanged"); 
filter.addAction("com.android.music.playbackcomplete"); 
filter.addAction("com.android.music.queuechanged"); 
filter.addAction("com.android.music.musicservicecommand"); 
a.registerReceiver(receiver = new AudioBroadcastReceiver(), filter); //a is Activity 

이 코드는 확실히 작동한다. 그리고 수신기는 다음과 같습니다

class AudioBroadcastReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     ... 
    } 
} 

그들은 동적으로 BroadcastReceiver를 등록하기 전에 응용 프로그램에 특별한 권한을 부여 할 필요가 말한다. 하지만 어떻게 찾을 수 없습니까? Manifest.permission.으로 무엇을 요청해야합니까? 이 경우. 플레이어가 음악 트랙을 바꿀 때 신호를 받기만하면됩니다. 은 (는) 위험한입니다.

+0

문서화되지 않은 지원되지 않는 브로드 캐스트입니다. Android 버전에 상관없이 모든 기기에 앱을 전송할 필요는 없습니다. – CommonsWare

+0

그러나 응용 프로그램은 확실히 이러한 브로드 캐스트를 보냅니다. 마시맬로는 그들을 배달하지 않습니다. 또는 필터를 등록하지 않습니다. 나는 이것이 벌레라고 생각한다. OS는 모든 애플리케이션에서 전송되는 각 신호를 전달해야하며 다른 애플리케이션 부품의 "내부"신호가 될 수 있습니다. – Gourmand

+0

"하지만 그 응용 프로그램은 분명히 그 방송을 보냅니다"- 그리고 이것에 대한 당신의 증거는 무엇입니까? 'adb ​​shell am '을 통해 직접 보내려고 했습니까? – CommonsWare

답변

0

문서화되지 않은 지원되지 않는 브로드 캐스트가 필요합니다. 일부 플레이어 앱이이를 사용할 수 있습니다. 다른 사람들은 그렇지 않을 수도 있습니다. 동일한 플레이어의 서로 다른 버전이이를 사용하거나 사용하지 않을 수 있습니다.

주어진 장치에 이러한 브로드 캐스트를 지원하는 플레이어가 있거나 사용자가 선택한 플레이어가 이러한 브로드 캐스트를 지원한다고 가정하지 마십시오.