完璧ではないが、私は音楽を演奏し、現在のアプリケーションを識別するための方法を見つけました。
私のアプローチは、音楽プレイヤーがシステムによって殺されるのを防ぐために、「進行中の」通知をポストする必要があり、通常はメディアボタンを処理するためにBroadcast Receiverがあるという事実を利用することです。アンドロイドの規則を次のよう
技術的には音楽のアプリは、その活動の少なくとも1つについてCATEGORY_MUSIC_APPためのインテントフィルタ(または非推奨MediaStore.INTENT_ACTION_MUSIC_PLAYER)を持っている必要がありますが、私はiHeartRadio appの現在のバージョンが気にしないことに決めたことに気づきました。
だからここに私のアプローチだ
- (音楽プレイヤーが時に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
仮定/警告は、(アイ・ハート・ラジオは、あなたがそれに彼らのサービスにログインしていない場合は、ログインするように求められますデバイス)
- 音楽アプリは、最後の再生状態を保存します。これが当てはまらない場合、ユーザーが途切れた場所ではなく、トラック/プレイリストの先頭から再生を開始することがあります。
- 精度は、ユーザが活動から離れたり、画面が消灯し、再生状態の変化が(私たちは、既存の通知の変更について通知を受けていない同じ通知を更新するとき
- Spotifyは、通知をポスト異なる場合があります。あなたは」勝ちました
- Google Musicが起動するとすぐに通知を送信し、音楽を再生していない可能性があります(別のアプリが音楽を再生している可能性があります。誤認を招く可能性があります)。
- iHeartRadioは、行内に複数の通知の変更を引き起こします。
また、イベント、およびリストactions
からNotification
を得ることができます。 title
がAction
の場合は、"Play"
です。そのアプリは音楽を再生しておらず、上で説明したGoogleミュージックのような通知を送信するだけです。
(「再生」を開始するオプションがあるのは、現在再生されていないことを意味します)また、「再生」という文字列は標準ではなく、アプリや言語によって異なる場合があります。アクセシビリティをサポートするほとんどのアプリで文字列が同じか類似していると仮定します。 actions
がnullであることを確認してください。通知がカスタムレイアウト(Spotifyなど)を使用する場合、これはnullです。 (。また、アクセス可能性サービスは、通知アクションを使用して、それを制御することはできませんので、楽しんでるが、視覚障害者が使用することはできません意味します)
UPDATE: そうしない場合にも、これを処理するためにAutomateのようなアプリを使用することができますあなた自身のアプリにそれを構築したい。
私はオーディオ再生に使用しているアプリの情報をアプリケーションが取得できないようにしたいので、これは不可能だと思っています。 –
ああええ..しかし、私が要求できる許可はありますか? App UsageAccessのようなもの? – Madushan
downvoter - downvotingの理由を入力してください。 – Madushan