您的位置:首页 > 移动开发

Android底层开发之APP音量单独控制

2015-09-09 08:40 513 查看
原文地十:http://blog.csdn.net/kangear/article/details/44105143

Android底层开发之APP音量单独控制

目前Android的音乐播放软件都的音量控制都是随着系统的总Master音量变化的。想要实现和windows中一样,每个APP的媒体音量可以单独控制。


控制本APP音量

其实在MediaPlayer中就有一个API是设备当前音频流的音量的,叫setVolume()。通过编程测试,这个是独立于Master音量的。

这个问题搞定后,如果想要控制其它APP的音量,那么只要能拿到其MediaPlayer对象就好了。


控制其它APP音量

构思的是在MediaPlayer的构造函数中,将所有MediaPlayer对象保存到一个List中。
<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> List<MediaPlayer> list = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ArrayList<MediaPlayer>();
...
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-title" style="box-sizing: border-box;">MediaPlayer</span>() {
...
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Native setup requires a weak reference to our object.
* It's easier to create it here than in C++.
*/</span>
native_setup(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> WeakReference<MediaPlayer>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>));
list.add(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);
Log.i(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DEBUG_MEDIAPLAYER"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"MediaPlayer() list.size="</span> + list.size() + list);
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> List<MediaPlayer> <span class="hljs-title" style="box-sizing: border-box;">getList</span>() {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> list;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>


发现在同一个应用中,如果new MediaPlayer还能够进行记录,但是在其它APP中new MediaPlayer会list会是一个新的对象,想要获取也是获取不到的。
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">03</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">06</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">04</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">54</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23.945</span>: I/DEBUG_MEDIAPLAYER(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1016</span>): MediaPlayer() list<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.size</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">com</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.android</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.music</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MediaPlaybackService</span>$CompatMediaPlayer<span class="hljs-localvars" style="box-sizing: border-box;">@4163</span>f850]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">03</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">06</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">04</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">56</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26.535</span>: I/DEBUG_MEDIAPLAYER(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2013</span>): MediaPlayer() list<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.size</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>[android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.media</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MediaPlayer</span><span class="hljs-localvars" style="box-sizing: border-box;">@41644388</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">03</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">06</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">04</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">56</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26.595</span>: I/DEBUG_MEDIAPLAYER(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2013</span>): MediaPlayer() list<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.size</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>[android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.media</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MediaPlayer</span><span class="hljs-localvars" style="box-sizing: border-box;">@41644388</span>, android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.media</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MediaPlayer</span><span class="hljs-localvars" style="box-sizing: border-box;">@41645128</span>]
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">03</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">06</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">04</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">56</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">33.155</span>: I/DEBUG_MEDIAPLAYER(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2050</span>): MediaPlayer() list<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.size</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>[android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.media</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MediaPlayer</span><span class="hljs-localvars" style="box-sizing: border-box;">@4163</span>d098]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>


那么就失败了,了解到原因是每个应用对于一个Dalvik Virtual Machine实例。就好比在Ubuntu打开了两个Eclipse,他们也是独立的。

(尽管是失败了,也把这个分析的过程分析记录一下)


其它:

百度音乐甚至都没有使用MediaPlayer,因为我在其构造器添加打印Log,使用百度音乐进行音乐播放时并没有看到有log打印。这一点十分奇怪。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: