首页 > 其他分享 >android监听耳机按键

android监听耳机按键

时间:2023-04-12 10:26:38浏览次数:31  
标签:耳机 PlaybackStateCompat void public ACTION Override android super 监听

app 在前台的监听方式:

@Override
boolean onKeyDown(int keyCode, KeyEvent event) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            return super.onKeyDown(keyCode, event);
        }
        switch (keyCode) {
            case KeyEvent.KEYCODE_MEDIA_PLAY:
                    //这个地方写处理事件
                    return true;
        }
        return super.onKeyDown(keyCode, event);
}

app 后台+前台 同时监听:

AndroidManifest.xml 文件:

1、添加 receiver
2、添加 service

<application>
    <receiver
        android:name=".MediaButtonReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
    <service
        android:name=".BackgroundMusicService"
        android:exported="true"
        android:enabled="true"
    >
        <intent-filter >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </service>
</application>

MediaButtonReceiver.java 文件:

public class MediaButtonReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "receiver", Toast.LENGTH_SHORT).show();//应用在后台会触发这里的事件
        System.out.println("receive");
    }

}

BackgroundMusicService.java 文件:


注意:必须创建通知,否则应用会在五秒后报错闪退


public class BackgroundMusicService extends Service {
    // MediaPlayer player;
    Notification customNotification;

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

    @Override
    public void onCreate() {
        super.onCreate();
        // player = MediaPlayer.create(this, R.raw.numb);
        // player.setLooping(false);
        // player.setVolume(100, 100);

        setNotification();
        startForeground(200, customNotification);
    }

    private static final String CHANNEL_ID = "channelID";
    private void setNotification() {
        RemoteViews rv = new RemoteViews(getPackageName(), R.layout.custom_notification);//通知布局样式
        customNotification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.more)
                .setCustomContentView(rv)
                .build();
    }

    public void stop(){
        // player.pause();
    }

    public void play(){
        // player.start();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();
        return Service.START_STICKY;
    }


    @Override
    public void onDestroy() {
        // player.stop();
        // player.release();
    }
}

MainActivity.java 文件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    setSupportActionBar(binding.toolbar);
    media();
}

private void media(){
    Intent svc = new Intent(this, BackgroundMusicService.class);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startService(svc);
    }
    MediaSessionCompat ms = new MediaSessionCompat(this, "My__MediaSessionTag");
    ms.setActive(true);
    ms.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    mediaButtonIntent.setClass(this, MediaButtonReceiver.class);
    ms.setMediaButtonReceiver(PendingIntent.getBroadcast(this, 100, mediaButtonIntent, 0));
    PlaybackStateCompat ps = new PlaybackStateCompat.Builder().setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE
                    | PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE |
                    PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS |
                    PlaybackStateCompat.ACTION_FAST_FORWARD | PlaybackStateCompat.ACTION_REWIND)
            .setState(PlaybackStateCompat.STATE_PAUSED, 0 /*PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN*/, 1f)
            .build();
    ms.setPlaybackState(ps);
    ms.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);

    //应用在前台会触发这里的事件
    ms.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public void onCommand(@NonNull String command, @Nullable Bundle args, @Nullable ResultReceiver cb) {
            super.onCommand(command, args, cb);
            System.out.println("onCommand");
        }

        @Override
        public void onPlay() {
            super.onPlay();
            System.out.println("onPlay");
        }

        @Override
        public void onPause() {
            super.onPause();
            System.out.println("onPause");
        }

        @Override
        public void onStop() {
            super.onStop();
            System.out.println("onStop");
        }
    });
}

最后附图 耳机键按下后的流程图:

标签:耳机,PlaybackStateCompat,void,public,ACTION,Override,android,super,监听
From: https://www.cnblogs.com/laremehpe/p/17308869.html

相关文章

  • Chrome模拟手机浏览器(iOS/Android)的方法
    1、在chrome的开发者工具模式下,点击左上角的手机图标切换成手机模式(或者F12然后Ctrl+Shift+M),一般这个方法访问绝大多数设限的网站。2、第一种方法不行,则安装Google插件User-AgentSwitcherforGoogleChrome3、https://blog.csdn.net/gb4215287/article/details/64438603......
  • Android脱壳基础知识
    JVM的类加载器:BootstrapClassLoader引导类加载器:C/C++代码实现的加载器,用于加载制定的JDK核心库,比如java.lang.*、java.util.*等这些系统类。Java虚拟机的启动就是通过Bootstrap,该ClassLoader在java里无法获取,负责加载/lib下的类ExtensionsClassLoader拓展类加载器:Java中的......
  • Android-APK反编译
    1.原理学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的。Apk技术也有非常多的技术可以学习,主要都是围绕着如何减小体积,如何提高打包速度展开,这里先不多说了。下面是一张基本的Apk文件结构图。Apk文件本质上其实是一个zip......
  • Android - AXMLPrinter2.jar的使用方法
    我们需要查看打出的apk包中AndroidManifest.xml文件,但是打开之后发现是一大堆的乱码这是就需要反编译工具,AXMLPrinter2.jarAXMLPrinter2.jar官方介绍:AXMLPrinter2.jarapk分析APK文件,取得APK文件中的包名、版本号及图标,很强大的工具,再一次感受到了批处理的牛逼。可以将android......
  • oracle启动监听后提示no services的解决办法
    0x00问题经常安装完后,dbca建库,netca增加监听后,命令行提示:Thelistenersupportsnoservices0x01解决方法altersystemsetlocal_listener="(address=(PROTOCOL=TCP)(HOST=你的IP地址)(PORT=1521))";altersystemregister;0x02查看监听lsnrctlstatus0x0......
  • 成品直播源码,Android实现监听Settings值变化的功能
    成品直播源码,Android实现监听Settings值变化的功能先创建一个内部类继承自ContentObserver   classSettingsContentObserverextendsContentObserver{    publicSettingsContentObserver(){      super(newHandler());    }    ......
  • Android Kotlin mapTo
     在Kotlin中,mapTo是一种用于将集合中的元素转换成另一个集合的函数。它可以将一个集合的元素映射到另一个集合,并将结果添加到目标集合中。mapTo的语法如下:fun<T,R,C:MutableCollection<inR>>Iterable<T>.mapTo(destination:C,transform:(T)->R):C其中:T是源集......
  • Android Debug (调试)注解处理器
     1.addremotedebugconfiguration2.copyjvmoptions:(-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005),andpasteittogradle.propertiesfile.  3.thenclickdebugbuttontoattachlocalhost:5005,expandthegradletasklist......
  • Android布局
    接下来,将文本转换为十进制数字。对 stringInTextField 调用 toDouble(),并将其存储在一个名为 cost 的变量中。valcost=stringInTextField.toDouble()不过,这样行不通-需要对 String 调用 toDouble()。原来 EditText 的 text 属性是 Editable,因为它表示可以......
  • Android MVVM之SavedStateHandle数据保存之详解与使用。
    一、介绍        SavedStateHandle从名字可以看出,是保存状态的。这个类常和MVVM中的ViewModel搭配使用,对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点,保存的数据类型也比较丰富,数据量也相对较大二、分析     ......