joe*_*ich 7 android android-intent
当发送带有ACTION_MEDIA_BUTTON意图的sendOrderedBroadcast时(我模仿用户点击蓝牙耳机上的播放按钮),Google Play音乐会打开并播放最后播放的专辑而不是前景音乐播放应用.
如果我将其更改为sendBroadcast,Google Play音乐和当前的音乐播放应用(在我的情况下为Pandora)都会制作播放按钮.
这仅发生在Android 4.0及更高版本中.Play Music是否会占用这个意图(一个错误)?您是否怀疑Pandora没有按照以下建议将自己注册为当前的媒体按钮处理程序:http: //android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html
有没有办法可以将此意图指向当前的音乐播放应用程序?
这是我的代码:
public void broadcastMediaIntent(MediaIntent intentType){
long eventtime = SystemClock.uptimeMillis();
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = null;
KeyEvent upEvent = null;
switch(intentType){
case NEXT:
downEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
upEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
break;
case PLAY_PAUSE:
downEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
upEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
break;
case PREVIOUS:
downEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
upEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
break;
case FAST_FORWARD:
downEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, 0);
upEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, 0);
break;
case REWIND:
downEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_REWIND, 0);
upEvent = new KeyEvent(eventtime, eventtime,
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_REWIND, 0);
break;
default:
break;
}
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);
upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
sendOrderedBroadcast(upIntent, null);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
以下应该做的伎俩.顺便说一下,你在哪里找到了锁屏的源代码?
public void handleMediaKeyEvent(KeyEvent keyEvent) {
/*
* Attempt to execute the following with reflection.
*
* [Code]
* IAudioService audioService = IAudioService.Stub.asInterface(b);
* audioService.dispatchMediaKeyEvent(keyEvent);
*/
try {
// Get binder from ServiceManager.checkService(String)
IBinder iBinder = (IBinder) Class.forName("android.os.ServiceManager")
.getDeclaredMethod("checkService",String.class)
.invoke(null, Context.AUDIO_SERVICE);
// get audioService from IAudioService.Stub.asInterface(IBinder)
Object audioService = Class.forName("android.media.IAudioService$Stub")
.getDeclaredMethod("asInterface",IBinder.class)
.invoke(null,iBinder);
// Dispatch keyEvent using IAudioService.dispatchMediaKeyEvent(KeyEvent)
Class.forName("android.media.IAudioService")
.getDeclaredMethod("dispatchMediaKeyEvent",KeyEvent.class)
.invoke(audioService, keyEvent);
} catch (Exception e1) {
e1.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
您必须使用一个 API 来成为这些意图的首选接收者,但这当然可以由系统密钥的发送者处理。看看这篇文章和文档。但在这种情况下,这取决于潘多拉和谷歌音乐,所以这可能不取决于你。当然,您也可以将广播发送到特定的包(通过在意图中指定组件名称),但随后您决定哪个应用程序获取它。我在 AudioManager 中快速搜索了一个隐藏的 API,但这看起来并不乐观。
您尝试过使用配件吗?如果这有效,那么我会研究如何发送该意图。如果没有,我会查看安装了哪些应用程序,然后进行“智能”猜测或询问用户将意图发送到哪个应用程序。也许最后一种方法是任何一种情况下的最佳方法,因为它使用公共 API,并且不会因猜测错误而惹恼用户:)
编辑: 这可以工作,但它也可能受到权限和证书的保护。在锁屏界面中,媒体键的处理方式如下:
void handleMediaKeyEvent(KeyEvent keyEvent) {
IAudioService audioService = IAudioService.Stub.asInterface(
ServiceManager.checkService(Context.AUDIO_SERVICE));
if (audioService != null) {
try {
audioService.dispatchMediaKeyEvent(keyEvent);
} catch (RemoteException e) {
Log.e("KeyguardViewBase", "dispatchMediaKeyEvent threw exception " + e);
}
} else {
Slog.w("KeyguardViewBase", "Unable to find IAudioService for media key event");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,API 是隐藏的,因此您必须解决这个问题。这可能是我能为你提供的最好帮助了。另一种方法是注入事件。实现这一目标的一种方法是成为一种输入法,但这不太可能是一种前进的方式。有多种方法可以将事件注入到您自己的活动中,但我不知道有哪些方法可以注入到系统中。也许您可以看看仪器测试是如何进行的。
| 归档时间: |
|
| 查看次数: |
2879 次 |
| 最近记录: |