zoukankan      html  css  js  c++  java
  • Android音量调节两种方式

    Android音量调节的实现,分两种情况说明,一种是在settings的音量设置界面,按下侧键进行调节;另一种是在非settings界面,按下侧键进行音量调节。这两种调节方式的实现不一样,分别操作的是两个不同的音量SeekBar。下面,分别进行分析:


    一. 在settings的音量设置界面,按下侧键进行调节:

    在settings的音量设置界面,按下侧键回有音量的调节,同时,会播放音乐(这个音乐是在铃声设置中设置的),整个过程的实现的相关代码如下:
    1. settings的音量设置界面:
    文件: packages/apps/Settings/src/com/android/settings/RingerVolumePreference.java
    说明: 在这个RingerVolumePreference,会调用 audioManager.setStreamVolume进行音量大小的调节,但是,播放声音却不在这个文件中。
    2. 播放音乐:
    文件: frameworks/base/core/java/android/preference/VolumePreference.java
    说明:RingerVolumePreference继承自VolumePreference,当点击侧键时,VolumePreference的 onKey函数会收到键值,并通过mSeekBarVolumizer.changeVolumeBy, sample, mRingtone.play 最终播放出音乐。

    值得注意的是:mRingtone.play用的是 new MediaPlayer 的方式,通过创建MediaPlayer来实现音乐的播放。

    二. 在非settings界面按侧键进行音量的调节:

    实现: 通过RingtoneManager会调用到AudioManager的adjustStreamVolume,进而调用AudioServicer的adjustStreamVolume,最主要的就是这个函数了。
    在这个函数中:

    1. checkForRingerModeChange(oldIndex, direction); oldIndex指的是知之前的音量,direction表明是增加还是降低音量。见名知意,这个函数用于检测改变铃声模式,如振动,静音等,是通过调用 setRingerMode函数来实现的。而setRingerMode通过发送广播(调用broadcastRingerMode函数)来通知模式的改 变。

    2. sendMsg: 发送消息,处理这个消息的是handleMessage函数,调用setStreamVolumeIndex来调节音量,其实,最终是通过AudioPolicyService的对应函数实现的。

    3. mVolumePanel.postVolumeChanged(streamType, flags); // 用于更新UI.

    4. sendVolumeUpdate: 会发送AudioManager.VOLUME_CHANGED_ACTION,处理这个intent的是最终的目的是用于播放那个短促的蜂鸣声(见ToneGenerator.java的startTone)。

    5. ToneGenerator.java的startTone的分析: 通过jni调用到ToneGenerator.cpp的startTone函数。


    值的注意的是,最终是通过AudioTrack来实现这个声音的处理的,而不是创建MediaPlay, 这与settings中的处理方式是不同的。


    题外话: 来电的声音播放方式也是通过Ringtone,创建MediaPlay来实现的
  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/chengliu/p/4130594.html
Copyright © 2011-2022 走看看