2

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; 
    } 
};
4

1 に答える 1

2

これは不可能だと思います。私の回避策は、ボタンが押されたときにアプリ自身のbroadcastreceiverがサービスをウェイクアップできるようにすることです。アプリのaudiofocusをリクエストし、失われるまで待ちます。

于 2012-04-23T17:37:25.783 に答える