Google Playミュージックアプリの上にあり、ブロードキャストを介して通信するサービスとレシーバーを介して、有線マイクのリモートボタンの機能を拡張しようとしています。私はGoogleNexusSを使用してICSを使用しています。
私が抱えている問題は、MusicPlaybackServiceが実行されるとコードがうまく機能することですが、常にそうであるとは限りません。UIを表示せずに(ユーザーが知らないうちに)このサービスを開始するにはどうすればよいですか。私のコードには次の定義があります。
public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String TOGGLEPAUSE_ACTION = "com.android.music.musicservicecommand.togglepause";
私は次のオプションを試しました:
1)このSOの質問に基づいています。質問には「com.android.music.musicservicecommand」を使用する必要があると記載されているため、SERVICECMDについてはわかりませんが、ICSの場合はパッケージ名が変更されていると思います。
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME, CMDTOGGLEPAUSE);
sendBroadcast(i);
また、SERVICECMDをTOGGLEPAUSE_ACTIONに置き換えてみました。
2)このAndroidプロジェクトの問題から。
Intent musicIntent = new Intent();
musicIntent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
musicIntent.setAction(TOGGLEPAUSE_ACTION);
musicIntent.putExtra(CMDNAME, CMDTOGGLEPAUSE); // or "next" or "previous"
sendBroadcast(musicIntent);
3)このコードは以下のエラーでクラッシュします。このオプションをさらに進める方法がわかりません。
原因:android.content.ActivityNotFoundException:明示的なアクティビティクラスが見つかりません{com.google.android.music/com.google.android.music.MusicPlaybackService}; AndroidManifest.xmlでこのアクティビティを宣言しましたか?
Intent intent = new Intent();
intent.putExtra(CMDNAME, CMDTOGGLEPAUSE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.google.android.music", "com.google.android.music.MusicPlaybackService");
startActivity(intent);
4)ヘッドセットを電話から取り外すと、WiredAccessoryObserverによって取得されたIntent.ACTION_HEADSET_PLUGブロードキャストに応答しているため、MusicPlaybackServiceが開始されることに気付きました。LogCatに表示されている値を使用して、そのブロードキャストをコードに複製してみました。
Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
intent.putExtra("state", 0);
intent.putExtra("name", "h2w");
intent.putExtra("microphone", 1);
sendBroadcast(intent);
私は本当にサービスを開始するだけで常に機能する方法を探しています。私は何でも開いています。ランダムに中断するはずのIMediaPlaybackService.aidlを使用するサービスにバインドする必要がありますが、これは理想的ではありません。助けてくれてありがとう。
編集
以下のコードを使用してサービスにバインドしようとしましたが、エラーが発生しました。
原因:java.lang.SecurityException:サービスインテントへのバインドは許可されていません{cmp = com.google.android.music /.MusicPlaybackService}
私のOnCreate関数で
if (mPlaybackService == null) {
Intent i = new Intent();
i.setClassName("com.google.android.music","com.google.android.music.MusicPlaybackService" );
bindService(i, connection, Context.BIND_AUTO_CREATE);
}
私のクラスで
IMediaPlaybackService mPlaybackService = null;
ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mPlaybackService = IMediaPlaybackService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName name) {
mPlaybackService = null;
}
};