欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android App中使用AudioManager类来编写音频播放器

程序员文章站 2024-02-29 17:13:58
手机都有声音模式,声音、静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能。在android手机中,我们同样可以通过android的sdk提供的声音管理接口来管理手机...

手机都有声音模式,声音、静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能。在android手机中,我们同样可以通过android的sdk提供的声音管理接口来管理手机声音模式以及调整声音大小,这就是android中audiomanager的使用。
audiomanager 类位于 android.media 包中,该类提供访问控制音量和钤声模式的操作
 
以下分别是audiomanager设置声音模式和调整声音大小的方法。
 
 
如何获取声音管理器:

audiomanager audiomanager = (audiomanager) getsystemservice(audio_service);

 
里面主要的方法:
a、设置声音模式

//声音模式 
audiomanager.setringermode(audiomanager.ringer_mode_normal);
//静音模式 
audiomanager.setringermode(audiomanager.ringer_mode_silent);
//震动模式 
audiomanager.setringermode(audiomanager.ringer_mode_vibrate);

 
b、调整声音大小

//减少声音音量 
audiomanager.adjustvolume(audiomanager.adjust_lower, 0);
//调大声音音量 
audiomanager.adjustvolume(audiomanager.adjust_raise, 0);
(当传入的第一个参数为 audiomanager.adjust_lower 时,可将音量调小一个单位,传入 audiomanager.adjust_raise 时,则可以将音量调大一个单位。)

c、getmode()获取音频模式
d、getringermode()获取铃声震动模式
 

public void setstreammute (int streamtype, boolean state)

 
静音或不静音音频流:
静音命令被保护以免客户端进程死亡:若具有流上的活动静音请求的进程死亡,这个流会自动取消静音。
对于给定的流,静音请求是累计的:audiomanager会从一个或多个客户端接收数个静音请求,只有当接收到相同数目的取消静音请求时流才会取消静音。
为了更好的用户体验,应该程序必须在onpause()中取消已静音流,若合适在onresume()中再次静音
 
这个方法只能用于代替音频设置的平台范围管理应用程序或主要电话应用程序。

调用示例:

import android.app.activity; 
import android.app.service; 
import android.media.audiomanager; 
import android.media.mediaplayer; 
import android.os.bundle; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.button; 
import android.widget.compoundbutton; 
import android.widget.compoundbutton.oncheckedchangelistener; 
import android.widget.togglebutton; 
 
public class autoactivity extends activity { 
  button play, up, down,stop; 
  togglebutton mute; 
  audiomanager amanager; 
  mediaplayer mplayer; 
  boolean flag = true; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_auto); 
 
    amanager = (audiomanager) getsystemservice(service.audio_service); 
    play = (button) findviewbyid(r.id.playbtn); 
    up = (button) findviewbyid(r.id.upbtn); 
    down = (button) findviewbyid(r.id.downbtn); 
    stop = (button) findviewbyid(r.id.stopbtn); 
    mute = (togglebutton) findviewbyid(r.id.silencebtn); 
    // 初始化mediaplayer对象,准备播放音乐 
    mplayer = mediaplayer.create(autoactivity.this, 
        r.raw.love); 
 
    play.setonclicklistener(new onclicklistener() { 
      //音乐播放和暂停 
      @override 
      public void onclick(view v) { 
         
        // 设置循环播放 
        if(flag) { 
          play.settext("暂停"); 
          mplayer.setlooping(true);//音乐的循环播放 
          mplayer.start(); 
          flag = false; 
        }else { 
          play.settext("播放"); 
          mplayer.pause(); 
          flag = true; 
        } 
      } 
    }); 
    up.setonclicklistener(new onclicklistener() { 
      //提高音量 
      @override 
      public void onclick(view v) { 
        // 指定调节音乐的音频,增大音量,而现实音量图形示意 
        amanager.adjuststreamvolume(audiomanager.stream_music, 
            audiomanager.adjust_raise, audiomanager.flag_show_ui); 
      } 
    }); 
    down.setonclicklistener(new onclicklistener() { 
      //降低音量 
      @override 
      public void onclick(view v) { 
        // 指定调节音乐的音频,降低音量,而现实音量图形示意 
        amanager.adjuststreamvolume(audiomanager.stream_music, 
            audiomanager.adjust_lower, audiomanager.flag_show_ui); 
      } 
    }); 
    stop.setonclicklistener(new onclicklistener() { 
      //停止音乐 
      @override 
      public void onclick(view v) { 
        mplayer.stop(); 
        play.settext("播放"); 
        flag = true; 
        mplayer = mediaplayer.create(autoactivity.this, 
            r.raw.love); 
      } 
    }); 
    mute.setoncheckedchangelistener(new oncheckedchangelistener() { 
      //静音功能 
      @override 
      public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) { 
        amanager.setstreammute(audiomanager.stream_music, ischecked); 
      } 
    }); 
  } 
 
} 

界面布局文件,activity_auto.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" > 
 
  <tablelayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margintop="360dp" > 
 
    <tablerow> 
 
      <button 
        android:id="@+id/playbtn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="播放" /> 
 
      <button 
        android:id="@+id/stopbtn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="停止" /> 
    </tablerow> 
 
    <tablerow> 
 
      <button 
        android:id="@+id/upbtn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="vol+" /> 
 
      <button 
        android:id="@+id/downbtn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="vol-" /> 
 
      <togglebutton 
        android:id="@+id/silencebtn" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="静音" 
        android:textcolor="#ff0000" /> 
    </tablerow> 
  </tablelayout> 
 
</linearlayout> 

程序比较简单,只有几个简单的功能按钮,但是理解用法用该够了~

mediaplayer的使用方式和方法,具体来看:
1)如何获得mediaplayer实例:
   可以使用直接new的方式:

  mediaplayer mp = new mediaplayer();

   也可以使用create的方式,如:

mediaplayer mp = mediaplayer.create(this, r.raw.test);//这时就不用调用setdatasource了

 
2) 如何设置要播放的文件:
   mediaplayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
   例如:

mediaplayer.create(this, r.raw.test);

b. 存储在sd卡或其他文件路径下的媒体文件
例如:

mp.setdatasource("/sdcard/test.mp3");

c. 网络上的媒体文件
   例如:

mp.setdatasource("http://www.citynorth.cn/music/confucius.mp3");

 
mediaplayer的setdatasource一共四个方法:

  •    setdatasource (string path)
  •    setdatasource (filedescriptor fd)
  •    setdatasource (context context, uri uri)
  •    setdatasource (filedescriptor fd, long offset, long length)

3)对播放器的主要控制方法:
android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()和prepareasync()  提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果mediaplayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()和stop()比较简单,起到暂停和停止播放的作用,
seekto()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发onseekcomplete.onseekcomplete(),如果需要是可以调用setonseekcompletelistener(onseekcompletelistener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从error状态中恢复过来,重新会到idle状态。
 
 
4)设置播放器的监听器:
   mediaplayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setoncompletionlistener(mediaplayer.oncompletionlistener listener)、
setonerrorlistener(mediaplayer.onerrorlistener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。