2016-09-02 9 views
-1

デバイスの再起動後にオーディオ再生を再開する必要があるアプリで作業しています。アプリの再生音の詳細を取得

メディア再生ボタンを送信するだけで、ユーザーが使用していたのと同じアプリが起動しないことがあります。

(再起動の前に)メディアを再生するアプリの詳細を取得する方法はあります(私は楽しんでる実行している、まだ再起動後に再生ボタンを送信すると、Googleの音楽を開きますか)?

私はアプリ名/活動名/パッケージ名.etcのようなものが必要です。 (だから私は再生ボタンを送信する前に同じアプリを起動することができます)

+0

私はオーディオ再生に使用しているアプリの情報をアプリケーションが取得できないようにしたいので、これは不可能だと思っています。 –

+0

ああええ..しかし、私が要求できる許可はありますか? App UsageAccessのようなもの? – Madushan

+0

downvoter - downvotingの理由を入力してください。 – Madushan

答えて

2

完璧ではないが、私は音楽を演奏し、現在のアプリケーションを識別するための方法を見つけました。

私のアプローチは、音楽プレイヤーがシステムによって殺されるのを防ぐために、「進行中の」通知をポストする必要があり、通常はメディアボタンを処理するためにBroadcast Receiverがあるという事実を利用することです。アンドロイドの規則を次のよう

技術的には音楽のアプリは、その活動の少なくとも1つについてCATEGORY_MUSIC_APPためのインテントフィルタ(または非推奨MediaStore.INTENT_ACTION_MUSIC_PLAYER)を持っている必要がありますが、私はiHeartRadio appの現在のバージョンが気にしないことに決めたことに気づきました。

だからここに私のアプローチだ

  • (音楽プレイヤーが時にCPUの下でアンドロイドによって殺されることを防ぐための「継続的な」通知を掲示しなければならないアンドロイドの通知
    • を監視するために登録さAccessibility Serviceを持っていますまたはメモリ圧力)。

アクセスサービスは、少なくとも 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 
    

    仮定/警告は、(アイ・ハート・ラジオは、あなたがそれに彼らのサービスにログインしていない場合は、ログインするように求められますデバイス)

  • 音楽アプリは、最後の再生状態を保存します。これが当てはまらない場合、ユーザーが途切れた場所ではなく、トラック/プレイリストの先頭から再生を開始することがあります。
  • 精度は、ユーザが活動から離れたり、画面が消灯し、再生状態の変化が(私たちは、既存の通知の変更について通知を受けていない同じ通知を更新するとき
    • Spotifyは、通知をポスト異なる場合があります。あなたは」勝ちました
    • Google Musicが起動するとすぐに通知を送信し、音楽を再生していない可能性があります(別のアプリが音楽を再生している可能性があります。誤認を招く可能性があります)。
    • iHeartRadioは、行内に複数の通知の変更を引き起こします。

また、イベント、およびリストactionsからNotificationを得ることができます。 titleActionの場合は、"Play"です。そのアプリは音楽を再生しておらず、上で説明したGoogleミュージックのような通知を送信するだけです。

(「再生」を開始するオプションがあるのは、現在再生されていないことを意味します)また、「再生」という文字列は標準ではなく、アプリや言語によって異なる場合があります。アクセシビリティをサポートするほとんどのアプリで文字列が同じか類似していると仮定します。 actionsがnullであることを確認してください。通知がカスタムレイアウト(Spotifyなど)を使用する場合、これはnullです。 (。また、アクセス可能性サービスは、通知アクションを使用して、それを制御することはできませんので、楽しんでるが、視覚障害者が使用することはできません意味します)


UPDATE: そうしない場合にも、これを処理するためにAutomateのようなアプリを使用することができますあなた自身のアプリにそれを構築したい。

関連する問題