완벽하지는 않지만 현재 음악 재생중인 앱을 식별하는 방법을 발견했습니다.
내 접근 방식은 음악 플레이어가 시스템에 의해 사망을 막기 위해 '진행중인'알림을 게시해야한다는 사실을 이용하는 것이며 보통 미디어 버튼을 처리하기 위해 Broadcast Receiver입니다. 안드로이드 규칙을 다음
기술적으로 음악 애플 리케이션의 활동이어야 하나 CATEGORY_MUSIC_APP에 대한 의도 필터 (또는 사용되지 않는 MediaStore.INTENT_ACTION_MUSIC_PLAYER)를 가지고,하지만 난 iHeartRadio app의 현재 버전 귀찮게하지 않기로 결정 것으로 나타났습니다.
그래서 여기
- 가 Accessibility Service이
- (음악 플레이어 때 CPU에서 안드로이드에 의해 살해되는 것을 방지하기 위해 '진행'알림을 게시해야 안드로이드 통지 을 모니터링하는 등록 나의 접근 방식 또는 메모리 압력).
접근성 서비스이어야 android:accessibilityEventTypes="typeNotificationStateChanged"
등록 및 사용자가 명시 적으로 사용하도록 설정해야합니다.
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
if (accessibilityEvent.getEventType() ==
AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
String packageName = accessibilityEvent.getPackageName().toString();
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
boolean musicPlaying = am.isMusicActive();
if (!musicPlaying) {
Log.i("NOTIFICATION", "no one is playing music. (anymore...)");
return; // clear saved package
}
PackageManager pm = getPackageManager();
Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
i.setPackage(packageName);
List<ResolveInfo> a = pm.queryBroadcastReceivers(i, PackageManager.MATCH_ALL);
if (a.size() > 0)
Log.i("NOTIFICATION", "Music is played by: " + packageName);
// save packageName to somewhere
else
Log.i("NOTIFICATION", "irrelevant notification from package: " + packageName);
}
}
후에 장치가 재부팅 될 때 다음과 같이
서비스 알림 이벤트를 처리해야하며, 기본 활동을 시작하고 재생 버튼을 누릅니다.
- 뮤직 앱에서 직접 재생할 준비가 활동에 간다
Intent i = new Intent(Intent.ACTION_VIEW);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setPackage(savedPackage);
startActivity(i);
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY));
am.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY));
// may be fire another intent for home/launcher. so user doesn't have to
가정 /주의 사항은 (아이 하트 라디오는 당신이 그들의 서비스에 로그인하지 않은 경우 로그인 요청 기기)
- 음악 앱이 마지막 재생 상태를 저장합니다. 그렇지 않은 경우 사용자가 중단 한 부분이 아닌 트랙/재생 목록의 시작 부분부터 재생이 시작될 수 있습니다.
- 정확도는 사용자가 활동에서 멀리 이동하거나 화면이 꺼지고 재생 상태 변경 (우리는 기존의 알림 변경에 대한 통지를하지 않을 같은 통지를 업데이트 할 때
- 스포티 파이 알림을 게시 다를 수 있습니다. 당신은 '원
- Google 음악이 출시되면 알림이 게시되고 음악을 재생하지 못할 수 있습니다 (다른 앱이 음악을 재생 중일 수 있습니다. 위양성을 유발할 수 있음)
- iHeartRadio는 여러 알림 변경을 한 행에 발생시킵니다.
또한 이벤트 및 목록 actions
에서 Notification
를 얻을 수 있습니다. 어떤 Action
의 title
이 "Play"
인 경우 해당 앱은 음악을 재생하지 않고 위에서 설명한 Google 뮤직처럼 알림을 게시합니다.
('재생'을 시작하는 옵션이 현재 재생 중이 아님을 의미합니다.) 또한 '재생'문자열은 표준이 아니며 앱 및/또는 언어에 따라 다를 수 있습니다. 접근성을 지원하는 대부분의 앱에서 문자열이 같거나 유사하다고 가정합니다. actions
이 null인지 확인하십시오. 알림이 맞춤 레이아웃을 사용하는 경우 (예 : Spotify) null입니다. (또한 액세스 가능성 서비스 알림 작업을 사용하여 제어 할 수 있기 때문에 스포티 파이는 시각 장애인 사용자가 사용할 수 없습니다 의미 할 수 있습니다.) UPDATE
: 또한 Automate 같은 응용 프로그램을 사용할 수 있습니다 당신이하지 않는이 경우 처리 자신의 앱에 그것을 만들고 싶습니다.
나는 응용 프로그램에서 오디오 재생에 사용하는 응용 프로그램 정보를 얻을 수 없기를 바란다. –
오, 참으로 ..하지만 요청할 수있는 권한이 있습니까? App UsageAccess와 같은 것? – Madushan
downvoter - downvoting 이유를 입력하십시오. – Madushan