Android 使用Service 及 BroadcastReceiver 监听Volume

本文介绍了如何在Android应用中通过Service和BroadcastReceiver监听音量变化。首先,通过注册BroadcastReceiver并监听"android.media.VOLUME_CHANGED_ACTION"来接收音量改变的广播。其次,在Service中创建ContentObserver,监听系统设置的变化,获取AudioManager的音乐流音量。当音量发生变化时,更新UI展示当前音量。

帮朋友做的在按音量键时,触发.

 

参考:http://developer.android.com/training/managing-audio/volume-playback.html

关于 在activiy中监听的话,很多资料都有了. 直接onKeyDown就行.

 

看效果图:

 

一: 使用广播监听.

    首先设置action, 可以在文件里声明,也可以在代码里声明,这里使用代码声明,如下:

      IntentFilter filter = new IntentFilter("android.media.VOLUME_CHANGED_ACTION");
      this.registerReceiver(mReceiver, filter);

     网上看到很多用这个action的, 

android.intent.action.MEDIA_BUTTON

   等有空了再看看.

   实现mReceiver

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
   
   
    String action = intent.getAction();
   
    if(action.equals("android.media.VOLUME_CHANGED_ACTION")){
     int volume = (Integer)intent.getExtras().get("android.media.EXTRA_VOLUME_STREAM_VALUE");
     tv.setText( "当前音量(volume):   "+volume);
     if(volume>MainActivity.this.volume){
     }else if(volume == MainActivity.this.volume){
     
     }else if(volume < MainActivity.this.volume){
     
     }
     MainActivity.this.volume = volume;
    
    }
  }
  
 };

这个就是广播的实现了,往深入的就自己研究研究吧.

二:  服务的监听.

1 在xml里声明<service android:name="com.example.testvolums.MyService"></service>

2  在activity里启动服务 this.startService(new Intent(this,MyService.class));

3  在Service里的onCreate()中

    MyContentObserver mContentObserver = new MyContentObserver(this,new Handler());
    getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mContentObserver );

4  MyContentObserver.java

   

private class MyContentObserver extends ContentObserver{

  public MyContentObserver(Handler handler) {
   super(handler);
  }
  public MyContentObserver(Context c, Handler handler) {
         super(handler);
         System.out.println("MyContentObserver  MyContentObserver(Context c, Handler handler)");
         context=c;
         AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
         volume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
     }
  
  @Override
     public boolean deliverSelfNotifications() {
    System.out.println("MyContentObserver  deliverSelfNotifications()");
         return super.deliverSelfNotifications();
     }

     @Override
     public void onChange(boolean selfChange) {
         super.onChange(selfChange);
         System.out.println("MyContentObserver  onChange(boolean selfChange): "+selfChange);

         AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
         int curVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
        
         System.out.println("curVolume: "+curVolume);
         System.out.println("volume: "+volume);
     
    }

看效果:

当然黑屏了就监听不到了, 怎么在黑屏的时候处理是唤醒还是怎么的, 不研究了.

 

随便写的,写的不对,多见谅.

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值