2016-09-02 3 views
-1

기기가 재부팅 된 후 오디오 재생을 다시 시작해야하는 앱에서 작업하고 있습니다.앱 재생 오디오에 대한 세부 정보보기

미디어 재생 버튼을 보내는 것만으로 사용자가 사용했던 것과 동일한 앱을 시작할 수 없다는 것을 발견했습니다. (실행 중이며 재부팅 후 재생 버튼을 보내면 Google 뮤직이 열립니다.)

재부팅하기 전에 앱 재생 미디어에 대한 자세한 정보를 얻을 수있는 방법이 있습니까?

앱 이름/활동 이름/패키지 이름 .etc와 같은 것이 필요합니다. (재생 버튼을 보내기 전에 동일한 앱을 실행할 수 있습니다)

+0

나는 응용 프로그램에서 오디오 재생에 사용하는 응용 프로그램 정보를 얻을 수 없기를 바란다. –

+0

오, 참으로 ..하지만 요청할 수있는 권한이 있습니까? App UsageAccess와 같은 것? – Madushan

+0

downvoter - downvoting 이유를 입력하십시오. – Madushan

답변

2

완벽하지는 않지만 현재 음악 재생중인 앱을 식별하는 방법을 발견했습니다.

내 접근 방식은 음악 플레이어가 시스템에 의해 사망을 막기 위해 '진행중인'알림을 게시해야한다는 사실을 이용하는 것이며 보통 미디어 버튼을 처리하기 위해 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를 얻을 수 있습니다. 어떤 Actiontitle"Play" 인 경우 해당 앱은 음악을 재생하지 않고 위에서 설명한 Google 뮤직처럼 알림을 게시합니다.

('재생'을 시작하는 옵션이 현재 재생 중이 아님을 의미합니다.) 또한 '재생'문자열은 표준이 아니며 앱 및/또는 언어에 따라 다를 수 있습니다. 접근성을 지원하는 대부분의 앱에서 문자열이 같거나 유사하다고 가정합니다. actions이 null인지 확인하십시오. 알림이 맞춤 레이아웃을 사용하는 경우 (예 : Spotify) null입니다. (또한 액세스 가능성 서비스 알림 작업을 사용하여 제어 할 수 있기 때문에 스포티 파이는 시각 장애인 사용자가 사용할 수 없습니다 의미 할 수 있습니다.) UPDATE


: 또한 Automate 같은 응용 프로그램을 사용할 수 있습니다 당신이하지 않는이 경우 처리 자신의 앱에 그것을 만들고 싶습니다.

관련 문제