我知道它已被解释了一百次,而且我已经看过它们但仍然无法弄明白。我有使用BlackBerry 10 QT / C ++的经验,但我正试图将黑莓列车带入Android,这意味着要学习Java和Android的做事方式。
我正在关注(以及其他指南)this one
AndroidManifest.xml中的
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".myService" >
</service>
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
</application>
我认为我有需要的东西?否?
在myService.java
中public class myService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private MediaSessionCompat.Callback mediaSessionCompatCallBack = new MediaSessionCompat.Callback()
{
@Override
public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
Log.d("MEDIAKEY", "Key Event");
return super.onMediaButtonEvent(mediaButtonEvent);
}
};
private MediaSessionCompat mediaSessionCompat;
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d("SERVICE", "onCreate");
mediaSessionCompat = new MediaSessionCompat(this, "MEDIA");
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d("SERVICE", "onDestroy");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d("SERVICE_STARTUP", "onStart");
mediaSessionCompat.setCallback(mediaSessionCompatCallBack);
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);
MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);
mediaSessionCompat.setActive(true);
return START_STICKY;
}
任何帮助都会很棒,
由于
编辑: 好的,我已将onCreate()更改为:
context = getApplicationContext();
mediaSessionCompat = new MediaSessionCompat(context, "MEDIA");
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
Log.d("MEDIA", "event");
return super.onMediaButtonEvent(mediaButtonEvent);
}
});
和onStartCommand(): MediaButtonReceiver.handleIntent(mediaSessionCompat,intent);
mediaSessionCompat.setActive(true);
return super.onStartCommand(intent, flags, startId);
但是在按任何媒体键时仍然没有Log.d(),我观看视频并且它帮助我理解它但没有解决问题,我在API 22(5.1.1)上方式。
答案 0 :(得分:2)
首先缺少MediaButtonReceiver documentation中的一些内容:
<intent-filter>
android.intent.action.MEDIA_BUTTON
添加到.myService
- 如果没有这个,MediaButtonReceiver
将无法知道将媒体按钮转发到哪个服务之后,您的服务将正确设置,但您仍然无法接收媒体按钮。正如Media Playback the Right Way talk中所述,您需要通过调用mediaSessionCompat.setActive(true)成为首选的媒体按钮接收器。
您还需要确保拨打电话
mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSessionCompat.setCallback(mediaSessionCompatCallBack);
这可确保您说您可以处理媒体按钮并使用MediaSessionCompat注册您的Callback实例。
请注意,MediaSessionCompat
会自动将媒体按钮转换为相应的回调方法(即,播放将转换为被调用的onPlay()
等),因此在许多情况下,您无需直接覆盖{ {1}}。