android Audio

AudioManager:用来对音量大小,声音模式(静音,震动,震动加声音等模式)的管理, 还有用它来注册“插入耳机”时的广播接收者(Action: android.intent.action.MEDIA_BUTTON)

源码(没有Android源码的可以看下我之前的博文,有提供下载地址哈~)所在位置:
Android-4.0/frameworks/base/media/java/android/media/AudioManager.java


一. 首先在应用层面上分析下怎么使用这个类:


1.获取AudioManager实例对象
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

2.AudioManager能实现的一些基本的功能的函数介绍


adjustStreamVolume(int streamType, int direction, int flags) 
/**
方法分析:(通过该方法可以控制特定的声音的音量)

用"步长"调整手机声音大小的函数(Adjusts the volume of a particular stream by one step in a direction.)
这个函数只能用于应用程序对Audio属性的设置或者通话(telephony)应用程序

streamType(表示要处理的声音是哪种):
    能使用的streamType的值包括:
    STREAM_VOICE_CALL(通话)
    STREAM_SYSTEM(系统声音)
    STREAM_RING(铃声)
    STREAM_MUSIC(音乐)
    STREAM_ALARM(闹铃)
    
direction(“方向”:顾名思义是要往上增加音量,往下减少音量,还是维持不变):
    能使用的值有:
    ADJUST_LOWER(降低)
    ADJUST_RAISE(升高)
    ADJUST_SAME(维持原来的)[呵~~呵]

flags(可选标志位):
    flags One(单个参数) or more flags.(参数1|参数2|参数3..)
    如下flag:
        AudioManager.FLAG_SHOW_UI(显示出音量调节UI)
        AudioManager.FLAG_ALLOW_RINGER_MODES
        AudioManager.FLAG_PLAY_SOUND
        AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE
        AudioManager.FLAG_VIBRATE

对应get方法:
    getStreamVolume(int streamType) 
    最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”
*/


adjustVolume(int direction, int flags) 
/**
方法分析:
系统智能地判断现在是要处理的是哪个类型的声音("通话音","媒体音"等)
如果你在打电话,这个时候这个函数相应处理的就是"通话音",而如果你在听歌,处理的就是“媒体音”~~平时其实用一些软件也是有这种感觉的哈~~

direction(“方向”:顾名思义是要往上增加音量,往下减少音量,还是维持不变):
    能使用的值有:
    ADJUST_LOWER(降低)
    ADJUST_RAISE(升高)
    ADJUST_SAME(维持原来的)[呵~~呵]

flags(可选标志位):
    flags One(单个参数) or more flags.(参数1|参数2|参数3..)
    如下flag:
        AudioManager.FLAG_SHOW_UI(显示出音量调节UI)
        AudioManager.FLAG_ALLOW_RINGER_MODES
        AudioManager.FLAG_PLAY_SOUND
        AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE
        AudioManager.FLAG_VIBRATE

*/

int getMode() 
/**
方法分析:
得到声音的模式

返回值(int)对应的宏:
    MODE_INVALID: 发生异常的时候返回
    MODE_NORMAL: 普通模式
    MODE_RINGTONE:铃声模式
    MODE_IN_CALL: 通话模式
    MODE_IN_COMMUNICATION:通话模式

对应set方法:
    setMode(int mode) 
*/


int getRingerMode() 
/**
方法分析:
得到铃声设置的模式

返回值(int)对应的宏:
    RINGER_MODE_NORMAL(铃声模式)
         RINGER_MODE_SILENT(静音模式)
    RINGER_MODE_VIBRATE(静音但是震动)

对应set方法(改变铃声模式):
    setRingerMode(int ringerMode)
*/

getStreamMaxVolume(int streamType)
/**

方法分析:
    得到手机最大的音量

*/

setStreamMute(int streamType, boolean state) 
/**

方法分析:
    让streamType指定的对应的声音流做处理
    state为true表示让它静音,false表示不让它静音
    如:让音乐静音
    setStreamMute(AudioManager.STREAM_MUSIC , true);
*/


3.实例Demo代码

[java]  view plain copy print ?
  1. //获取实例  
  2. AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
  3.   
  4. //获取/设置系统音量  
  5. audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);  
  6. audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM,  
  7.             AudioManager.ADJUST_RAISE  
  8.             , AudioManager.FLAG_SHOW_UI);  
  9. //获取/设置音乐音量  
  10. audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);  
  11. audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,  
  12.             AudioManager.ADJUST_RAISE  
  13.             , AudioManager.FLAG_SHOW_UI);  
  14. //其他的类似  
  15.   
  16.   
  17.   
  18. //获取/设置铃声的模式  
  19. int ringMode = audioManager.getRingerMode();  
  20. //普通模式  
  21. audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);  
  22. //静音模式  
  23. audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);  
  24. //其他的类似  
  25.   
  26. //设置声音流静音/不静音  
  27. //音乐静音  
  28. audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);  
  29. //铃声不静音  
  30. audioManager.setStreamMute(AudioManager.STREAM_RING, false);  
  31. //其他的类似  





二. 分析下这个类里面的部分源代码


由于知识水平有限,我觉得下面的代码自己分析不好,建议看这篇博文:http://blog.csdn.net/qinjuning/article/details/6938436



[java]  view plain copy print ?
  1.  /* 
  2.     为Action == “MEDIA_BUTTON”注册广播接收者 
  3.  
  4.     用来广播“耳机插入”的事件 
  5.  
  6.     eventReceiver一般接受的参数为这样一个ComponentName对象 
  7.  
  8.     如: 
  9.     AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
  10.     ComponentName component = new ComponentName(context.getApplicationContext(),MediaControlReceiver.class); 
  11.     audioManager.registerMediaButtonEventReceiver(component);     
  12.      
  13. */  
  14.  public void registerMediaButtonEventReceiver(ComponentName eventReceiver) {  
  15.         if (eventReceiver == null) {  
  16.             return;  
  17.         }  
  18.         if (!eventReceiver.getPackageName().equals(mContext.getPackageName())) {  
  19.             Log.e(TAG, "registerMediaButtonEventReceiver() error: " +  
  20.                     "receiver and context package names don't match");  
  21.             return;  
  22.         }  
  23.         // construct a PendingIntent for the media button and register it  
  24.         Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);  
  25.         //     the associated intent will be handled by the component being registered  
  26.         mediaButtonIntent.setComponent(eventReceiver);  
  27.         PendingIntent pi = PendingIntent.getBroadcast(mContext,  
  28.                 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);  
  29.         registerMediaButtonIntent(pi, eventReceiver);  
  30.     }  
  31.   
  32. /** 
  33. 为MediaButton注册一个Intent 
  34. 可以发现,这边也是通过aidl的方式进行的调用 
  35. IAudioService的aidl:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/IAudioService.aidl   
  36. */  
  37.     public void registerMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {  
  38.         if ((pi == null) || (eventReceiver == null)) {  
  39.             Log.e(TAG, "Cannot call registerMediaButtonIntent() with a null parameter");  
  40.             return;  
  41.         }  
  42.         IAudioService service = getService();  
  43.         try {  
  44.             // pi != null  
  45.             service.registerMediaButtonIntent(pi, eventReceiver);  
  46.         } catch (RemoteException e) {  
  47.             Log.e(TAG, "Dead object in registerMediaButtonIntent"+e);  
  48.         }  
  49.     }  
  50.   
  51.     /** 
  52.      * Unregister the receiver of MEDIA_BUTTON intents. 
  53.      * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} 
  54.      *      that was registered with {@link #registerMediaButtonEventReceiver(ComponentName)}. 
  55.      */  
  56.     public void unregisterMediaButtonEventReceiver(ComponentName eventReceiver) {  
  57.         if (eventReceiver == null) {  
  58.             return;  
  59.         }  
  60.         // construct a PendingIntent for the media button and unregister it  
  61.         Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);  
  62.         //     the associated intent will be handled by the component being registered  
  63.         mediaButtonIntent.setComponent(eventReceiver);  
  64.         PendingIntent pi = PendingIntent.getBroadcast(mContext,  
  65.                 0/*requestCode, ignored*/, mediaButtonIntent, 0/*flags*/);  
  66.         unregisterMediaButtonIntent(pi, eventReceiver);  
  67.     }  
  68.   
  69.     /** 
  70.      * @hide 
  71.      */  
  72.     public void unregisterMediaButtonIntent(PendingIntent pi, ComponentName eventReceiver) {  
  73.         IAudioService service = getService();  
  74.         try {  
  75.             service.unregisterMediaButtonIntent(pi, eventReceiver);  
  76.         } catch (RemoteException e) {  
  77.             Log.e(TAG, "Dead object in unregisterMediaButtonIntent"+e);  
  78.         }  
  79.     }  
  80.   
  81.     /** 
  82.      * Registers the remote control client for providing information to display on the remote 
  83.      * controls. 
  84.      * @param rcClient The remote control client from which remote controls will receive 
  85.      *      information to display. 
  86.      * @see RemoteControlClient 
  87.      */  
  88.     public void registerRemoteControlClient(RemoteControlClient rcClient) {  
  89.         if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {  
  90.             return;  
  91.         }  
  92.         IAudioService service = getService();  
  93.         try {  
  94.             service.registerRemoteControlClient(rcClient.getRcMediaIntent(),   /* mediaIntent   */  
  95.                     rcClient.getIRemoteControlClient(),                        /* rcClient      */  
  96.                     // used to match media button event receiver and audio focus  
  97.                     mContext.getPackageName());                                /* packageName   */  
  98.         } catch (RemoteException e) {  
  99.             Log.e(TAG, "Dead object in registerRemoteControlClient"+e);  
  100.         }  
  101.     }  
  102.   
  103.     /** 
  104.      * Unregisters the remote control client that was providing information to display on the 
  105.      * remote controls. 
  106.      * @param rcClient The remote control client to unregister. 
  107.      * @see #registerRemoteControlClient(RemoteControlClient) 
  108.      */  
  109.     public void unregisterRemoteControlClient(RemoteControlClient rcClient) {  
  110.         if ((rcClient == null) || (rcClient.getRcMediaIntent() == null)) {  
  111.             return;  
  112.         }  
  113.         IAudioService service = getService();  
  114.         try {  
  115.             service.unregisterRemoteControlClient(rcClient.getRcMediaIntent(), /* mediaIntent   */  
  116.                     rcClient.getIRemoteControlClient());                       /* rcClient      */  
  117.         } catch (RemoteException e) {  
  118.             Log.e(TAG, "Dead object in unregisterRemoteControlClient"+e);  
  119.         }  
  120.     }  
  121.   
  122.     /** 
  123.      * @hide 
  124.      * Registers a remote control display that will be sent information by remote control clients. 
  125.      * @param rcd 
  126.      */  
  127.     public void registerRemoteControlDisplay(IRemoteControlDisplay rcd) {  
  128.         if (rcd == null) {  
  129.             return;  
  130.         }  
  131.         IAudioService service = getService();  
  132.         try {  
  133.             service.registerRemoteControlDisplay(rcd);  
  134.         } catch (RemoteException e) {  
  135.             Log.e(TAG, "Dead object in registerRemoteControlDisplay " + e);  
  136.         }  
  137.     }  
  138.   
  139.     /** 
  140.      * @hide 
  141.      * Unregisters a remote control display that was sent information by remote control clients. 
  142.      * @param rcd 
  143.      */  
  144.     public void unregisterRemoteControlDisplay(IRemoteControlDisplay rcd) {  
  145.         if (rcd == null) {  
  146.             return;  
  147.         }  
  148.         IAudioService service = getService();  
  149.         try {  
  150.             service.unregisterRemoteControlDisplay(rcd);  
  151.         } catch (RemoteException e) {  
  152.             Log.e(TAG, "Dead object in unregisterRemoteControlDisplay " + e);  
  153.         }  
  154.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值