2

我正在尝试使用 MediaSession for Android 5.0+ 在我的服务中获取 HARDWARE_HOOK 按钮和音量更改按钮。当屏幕关闭/锁定时,这必须特别工作。问题是虽然我能够接收 HARDWARE_HOOK 按钮事件,但未检测到音量变化。onAdjustVolume 方法永远不会被调用。

import android.app.Service;
import android.content.Intent;
import android.media.MediaRouter;
import android.media.session.MediaSession;
import android.os.Binder;
import android.os.IBinder;
import android.support.v4.media.VolumeProviderCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;

public class HookButtonService extends Service{

    public static final String SESSION_TAG = "SampleApp";

    private MediaSessionCompat mMediaSession;

    private VolumeProviderCompat myVolumeProvider;

    public class ServiceBinder extends Binder {

        public HookButtonService getService() {
            return HookButtonService.this;
        }
    }

    private Binder mBinder = new ServiceBinder();

    private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {

        @Override
        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
            Log.d("SampleApp","Media button received");
            if(!MyApplication.isActivityVisible()) {
                Intent dialogIntent = new Intent(getApplicationContext(), MainActivity.class);
                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(dialogIntent);
            }
            return true;
        }
    };



    public HookButtonService() {
    }

    public MediaSessionCompat.Token getMediaSessionToken() {
        return mMediaSession.getSessionToken();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mMediaSession = new MediaSessionCompat(this, SESSION_TAG);
        mMediaSession.setCallback(mMediaSessionCallback);

        myVolumeProvider = new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, 100, 50) {
            @Override
            public void onAdjustVolume(int direction) {
                Log.d("SampleApp","Volume change received: "+direction);

            }
        };

        mMediaSession.setActive(true);
        mMediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
                MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
        mMediaSession.setPlaybackToRemote(myVolumeProvider);

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mMediaSession.release();
    }


}
4

1 回答 1

0

onAdjustVolume当您使用投射播放一些音乐/视频时,VolumeProviderCompat希望与远程显示器一起使用。当您在静音和屏幕关闭期间使用设备上的按钮时,该方法不会触发。令人困惑的类名,它不像听起来那么普遍......

afaik 在 2021 年初没有可靠的方法来拦截屏幕关闭时按下的音量按钮,甚至可能检测到......(@op,如果你找到解决方案,请发布)

原因可能是这是 Android 在屏幕关闭期间减少电池消耗的预期“功能”之一 - 将按钮直接分配到较低的音频管理层省略框架/应用程序,不允许执行一些额外的代码(我们想要做)

于 2021-03-10T11:19:59.353 回答