Android audioManager解决MediaPlayer AudioTrack 调节音量问题

合集下载

Android多媒体MediaPlayer使用详解

Android多媒体MediaPlayer使用详解

Android多媒体MediaPlayer使⽤详解现在的⼿机功能越来越丰富了,遥想10年前,MP3,MP4,MP5,还是很流⾏的,博主当时读⾼中时很想拥有⼀台,可以听⾳乐和看电影。

可是条件有限,学校也禁⽌此东西,所以只能偷偷的玩。

⽽现在我们的⼿机也很早以前就⽀持了这些功能,⽽且界⾯和功能也远远超过了MP4。

好吧,说多了,今天本⽂介绍的是Andriod系统⾃带的Mediaplayer,和VideoView实现简单的⾳乐和视频的播放,⾄于想做出如酷狗⾳乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。

Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界⾯上,Music和Video两个应⽤程序都是调⽤MediaPlaer来实现的。

⼀、播放⾳频⽂件⾸先看看MediaPlaer的⽣命周期下⾯是MediaPlayer提供的常⽤⽅法⽅法说明MediaPlayer构造⽅法create创建⼀个要播放的多媒体getCurrentPosition得到当前播放位置getDuration得到⽂件的时间getVideoHeight得到视频的⾼度getVideoWidth得到视频的宽度isLooping是否循环播放isPlaying是否正在播放pause暂停prepare准备(同步)prepareAsync准备(异步)release释放MediaPlayer对象相关的资源reset重置MediaPlayer对象为刚刚创建的状态seekTo指定播放的位置(以毫秒为单位的时间)setAudioStreamType设置流媒体的类型setDataSource设置多媒体数据来源(位置)setDisplay设置⽤SurfaceHolder来显⽰多媒体setLooping设置是否循环播放setOnButteringUpdateListener⽹络流媒体的缓冲监听setOnErrorListener设置错误信息监听setOnVideoSizeChangedListener视频尺⼨监听setScreenOnWhilePlaying设置是否使⽤SurfaceHolder来保持屏幕显⽰setVolume设置⾳量start开始播放stop停⽌播放MediaPlayer的⼯作流程是这样的:1,⾸先创建MediaPlaer对象; *2,然后调⽤setDataSource()⽅法来设置⾳频⽂件的路径;**3,再调⽤prepare()⽅法使MediaPlayer进⼊到准备状态;4,调⽤start⽅法就可以播放⾳频。

Android中打开扬声器关闭麦克风的代码实现

Android中打开扬声器关闭麦克风的代码实现

//获取音频服务AudioManager audioManager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);//设置声音模式audioManager.setMode(AudioManager.STREAM_MUSIC);//关闭麦克风audioManager.setMicrophoneMute(false);// 打开扬声器audioManager.setSpeakerphoneOn(true);//实例化一个SoundPool对象SoundPool soundPool =new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);//加载声音int id = soundPool.load(this,R.raw.beep,5);//播放声音soundPool.play(id, 1, 1, 0, 0, 1);另外必须加上权限:<uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS"/>AudioManager简介:AudioManager类提供了访问音量和振铃器mode控制。

使用Context.getSystemService (Context.AUDIO_SERVICE)来得到这个类的一个实例。

公有方法:void adjustStreamVolume(int streamType,int direction, int flags)调整手机指定类型的声音。

其中第一个参数streamType指定声音类型,该参数可接受如下几个值。

l int STREAM_ALARM:手机闹铃的声音。

l int STREAM_DTMF:DTMF音调的声音。

l int STREAM_MUSIC:手机音乐的声音。

【推荐下载】Android 使用MediaPlayer播放视频切换后台暂停再恢复互前台继续播放的bug修改

【推荐下载】Android 使用MediaPlayer播放视频切换后台暂停再恢复互前台继续播放的bug修改

Android 使用MediaPlayer 播放视频切换后台暂停再恢复互前台继续播放的bug 修改2016/11/04 1747 import android.media.AudioManager;import android.media.MediaPlayer;import android.Uri;import android.os.Bundle;import android.os.Handler;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.ImageView;import android.widget.LinearLayout;import com.yourdream.app.android.R;import com.yourdream.app.android.ui.base.activity.BaseActivity;importcom.yourdream.app.android.ui.page.main.MainActivity;importcom.yourdream.app.android.utils.LogUtils;importcom.yourdream.app.android.utils.PageSwitch;/** * 登录注册页面*/public class GuidVideoActivity extends BaseActivity{ private SurfaceView surfaceView; private MediaPlayer mediaPlayer; private SurfaceHolder surfaceHolder; private boolean isSurfaceCreated =false; //surface 是否已经创建好private Uri mUri; private int curIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_log_reg); initPlayerObj(); InitControl(); } private void initPlayerObj() { mUri = Uri.parse(“android.resource://”+ getPackageName() + “/”+R.raw.guidvideo); surfaceView = (SurfaceView) findViewById(R.id.sv); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置视频流类型CreateSurface(); } private void InitControl() { LinearLayout LoginRegLayout = (LinearLayout)findViewById(R.id.log_reg_btn); LinearLayout LookRoundLayout = (LinearLayout)findViewById(R.id.look_round_btn); ImageView SkipImg = (ImageView)findViewById(R.id.skip_img); //右上角跳过文本ClickEventDelegate。

android audio系统介绍

android audio系统介绍

Android 音频系统整理在framework中c/c++层的音频系统服务主要有三个。

在base/media/mediaserver/Main_mediaserver.cpp的代码中可以找到。

一个是AudioFlinger, MediaPlayerService, 和AudioPolicyService。

AudioFlinger和AudioPolicyService是android audio系统的服务,负责音频方面的数据流传输和控制功能,也负责音频设备的管理。

这个部分作为Android的Audio系统的输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。

Mediaplayerservice 是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的服务。

MediaPlayer在底层是基于OpenCore(PacketVideo)和stagefright的库实现的。

音频服务端和客户端之间的交互包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

代码框架:1:Java部分代码(frameworks/base/media/java/android/media)2:Audio的JNI层JNI的cpp分布在两个部分,base/core/jni中有AudioRecord,AudioSystem,AudioTrack,JetPlayer,ToneGenarator,其他的在base/media/jni中。

3:Audio的c/c++层1)Audio框架见下图:Audio本地框架是media库的一部分,本部分内容被编译成库libmedia.so,主要实现AudioSystem、AudioTrack和AudioRecorder三个类,对上面提供接口,由下层的本地代码去实现。

AudioFlinger内容被编译成库libaudioflinger.so,它是Audio系统的本地服务部分,它是audio系统中真正做事的类,它通过硬件抽象层提供到硬件的接口。

video和audio对象的常用方法()方法来播放媒体文件。

video和audio对象的常用方法()方法来播放媒体文件。

video和audio对象的常用方法()方法来播放媒体文件。

当今互联网上存在着大量的媒体文件,例如视频、音频和图片等,它们在用户的设备上都可以播放。

在Android平台上,video和audio对象是用于播放媒体文件的常见对象。

本文将介绍video和audio对象的常用方法以及如何通过这些方法来播放媒体文件。

## video和audio对象的常用方法### video对象的常用方法1. `start()`: 调用`start()`方法来开始播放媒体文件。

2. `pause()`: 调用`pause()`方法来暂停播放媒体文件。

3. `play()`: 调用`play()`方法来开始播放媒体文件。

4. `pause()`: 调用`pause()`方法来暂停播放媒体文件。

5. `play()`: 调用`play()`方法来开始播放媒体文件。

6. `stop()`: 调用`stop()`方法来停止播放媒体文件。

7. ` seek()`: 调用`seek()`方法来指定媒体文件的播放位置。

8. `getmediaStream()`: 获取媒体文件的流对象。

9. `startmediaStream()`: 启动媒体文件的流对象。

### audio对象的常用方法1. `start()`: 调用`start()`方法来开始播放媒体文件。

2. `pause()`: 调用`pause()`方法来暂停播放媒体文件。

3. `play()`: 调用`play()`方法来开始播放媒体文件。

4. `pause()`: 调用`pause()`方法来暂停播放媒体文件。

5. `play()`: 调用`play()`方法来开始播放媒体文件。

6. `stop()`: 调用`stop()`方法来停止播放媒体文件。

7. ` seek()`: 调用`seek()`方法来指定媒体文件的播放位置。

8. `getmediaStream()`: 获取媒体文件的流对象。

Android 媒体播放---media playback

Android 媒体播放---media playback

Android多媒体框架包括对播放各种大众化的媒体类型的支持,因此能够很容易的把音频、视频、图片集成到应用程序中。

你能够使用MediaPlayer的API,播放来自应用程序资源中存储的媒体文件(raw资源)、或是来自独立文件系统中的媒体文件、或是来自网络连接之上的数据流。

本文向你介绍如何编写跟用户交互的媒体播放应用程序,以及如何让系统获得良好的性能和用户体验。

注意:只能把音频数据播放到标准输出设备。

当前,主要是移动设备的麦克风或蓝牙耳机。

不能在音频会话期间播放声音文件。

基础下面的类在Android框架中被用于播放声音和视频:MediaPlayer:这个类是播放声音和视频的主要API。

AudioManager:这个类管理设备上的音频资源和音频输出。

清单声明开始在应用程序上使用MediaPlayer进行开发之前,必须确保应用程序清单中有允许使用相关功能所对应声明。

1.Internet Permission:如果要使用MediaPlayer来播放基于互联网内容的流,那么应用程序就必须申请互联网访问的权限。

<uses-permission android:name="android.permission.INTERNET" />2.Wake Lock Permission:如果播放器应用程序需要保持屏幕的调光状态、或者要保持处理器的休眠状态、或者要使用MediaPlayer.setScreenOnWhilePlaying()或MediaPlayer.setWakeMode()方法,就必须申请这个权限。

<uses-permission android:name="android.permission.WAKE_LOCK" />使用MediaPlayer媒体框架的最中重要的组件之一是MediaPlayer类。

这个类的对象能够用最小的步骤来获取、解码和播放音视频。

Android音频系统AudioTrack使用方法详解

Android音频系统AudioTrack使用方法详解

Android⾳频系统AudioTrack使⽤⽅法详解今天,简单讲讲AudioTrack的使⽤⽅法。

1、Android AudioTrack简介在android中播放声⾳可以⽤MediaPlayer和AudioTrack两种⽅案的,但是两种⽅案是有很⼤区别的,MediaPlayer可以播放多种格式的声⾳⽂件,例如MP3,AAC,WAV,OGG,MIDI等。

⽽AudioTrack只能播放PCM数据流。

事实上,两种本质上是没啥区别的,MediaPlayer在播放⾳频时,在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,最后由AudioFlinger进⾏混⾳,传递⾳频给硬件播放出来。

利⽤AudioTrack播放只是跳过Mediaplayer 的解码部分⽽已。

Mediaplayer的解码核⼼部分是基于OpenCORE 来实现的,⽀持通⽤的⾳视频和图像格式,codec使⽤的是OpenMAX接⼝来进⾏扩展。

因此使⽤audiotrack播放mp3⽂件的话,要⾃⼰加⼊⼀个⾳频解码器,如libmad。

否则只能播放PCM数据,如⼤多数WAV格式的⾳频⽂件。

如果是实时的⾳频数据,那么只能⽤AudioTrack进⾏播放。

2、如何使⽤AudioTrack进⾏⾳频播放//根据采样率,采样精度,单双声道来得到frame的⼤⼩。

int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K个点 AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道AudioFormat.ENCODING_PCM_16BIT);//⼀个采样点16⽐特-2个字节//注意,按照数字⾳频的知识,这个算出来的是⼀秒钟buffer的⼤⼩。

//创建AudioTrackAudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_ STEREO, AudioFormat.ENCODING_PCM_16BIT, bufsize,AudioTrack.MODE_STREAM);//trackplayer.play() ;//开始trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中写数据….trackplayer.stop();//停⽌播放trackplayer.release();//释放底层资源。

Android使用AudioManager修改系统音量的方法

Android使用AudioManager修改系统音量的方法
2、直接设置音量值的方法:
public void setStreamVolume (int streamType, int index, int flags) am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), AudioManager.FLAG_PLAY_SOUND); am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的最大值 am.getStreamVolume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的当前值
1、渐进式
public void adjustStreamVolume (int streamType, int direction, int flags) am.adjustStreamVolume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
第一个和第三个参数与上面的相同
第二个参数是一个音量的int值,getStreamMaxVolume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.
最后我的代码:
package com.lp; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import Android.app.Activity; import Android.content.Context; import Android.media.AudioFormat; import Android.media.AudioManager; import Android.media.AudioTrack; import Android.os.Bundle; import Android.view.View; import Android.view.View.OnClickListener; import Android.widget.Button; import Android.widget.SeekBar; /** * AudioTrack 播放音频 如wav格式 * 并允许调节音量 * @author Administrator * */ public class MainActivity5 extends Activity {

androidMediaplayer各种属性和方法简单介绍

androidMediaplayer各种属性和方法简单介绍

主要涉及类:MediaPlayer(1)当一个MediaPlayer对象被创建或者调用reset()方法之后,它处于空闲状态,调用release()方法后处于结束状态1,一个MediaPlayer对象调用了reset()方法后,再调用其它方法可能会触发OnErrorListener.onError()事件,未调用reset()方法则不会触发2,当Mediaplayer对象不再被使用时,最好调用release()方法对其进行释放,使其处于结束状态,此时它不能被使用3,Mediaplayer对象被创建时(调用构造方法)处于空闲状态,若使用create()方法创建后则处于准备状态。

(2)一般情况下,一些常用的播放控制操作可能因为音频、视频的格式不被支持或者质量较差以及流超时,也有可能由于开发者的疏忽使得Mediaplayer对象处于无效状态等而导致错误。

此时可通过注册setOnErrorListener方法实现监控。

如果发生了错误,Mediaplayer对象将处于多雾状态,可以使用reset()方法来回复错误。

(3)任何Mediaplayer对象都必须先处于准备状态,然后才开始播放(4)要开始播放Mediaplayer对象都必须成功调用start()方法,可通过isPlaying()方法来检测是否正在播放(5)当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause()方法暂停播放,stop()方法停止播放。

处于暂停暂停时可通过start()方法恢复播放,但是处于停止状态时则必须先调用prepare()方法使其处于准备状态,再调用start()方法。

主要方法:Mediaplayer:构造方法create:创建一个要播放的多媒体getCurrentPosition:得到当前播放位置getDuration:得到文件的时间prepare:准备(同步)prepareAsync:准备(异步)seekTo:指定播放的位置(以毫秒为单位)setAudioStreamType:设置流媒体的类型setDataSource:设置数据来源setDisplay:设置用SurfaceHolder来显示多媒体setOnBufferingUpdateListener:网络流媒体的缓冲监听setOnErrorListener:设置错误信息监听setOnVideoSizeChangedListener:视频尺寸监听setScreenOnWhilePlaying:设置是否使用SurfaceHolder来显示setVolume:设置音量//获取sd卡上的音频文件setDataSource(“/sdcard/test.mp3”);//装载资源中的音乐MediaPlayer.create(Activity01.this,R.raw.test);//目前存在问题,不能循环解析出音频文件原因:.android_secure文件夹受保护,无法获取里面的文件信息播放视频相关类:VideoView方法说明:getBufferPercentage:得到缓冲的百分比getCurrentPosition:得到当前播放位置getDuration:得到视频文件的时间resolveAdjustedSize:调整视频显示大小setMediaController:设置播放控制器模式(播放进度条)setOnCompletionListener:当视频文件播放完时触发事件setVideoPath:设置视频源路径setVideoURI:设置视频源地址录音相关类:MediaRecorder方法说明:MediaRecorder:构造方法getMaxAmplitude:得到最大幅度setAudioEncoder:设置音频编码setAudioSource:设置音频源setCamera:设置摄像机setMaxDuration:设置最长录音时间setMaxFileSize:设置文件的最大尺寸setOutputFile:设置输出文件setOutputFormat:设置输出文件格式setPreviewDisplay:设置预览setVideoEncoder:设置视频编码setVideoFrameRate:设置视频帧的频率setVideoSize:设置视频的宽度和高度(分辨率)setVideoSource:设置视频源File类下的方法:public static File createTempFile(String prefix, String suffix, File directory) Creates an empty temporary file in the given directory using the given prefix and suffix as part of the file name.系统会自动在prefix和suffix之间加上一些数字来构建完整的文件名实现录音的一般步骤:1,实例化MediaRecorder mr,调用构造方法2,初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)3,配置DataSource:设置输出文件格式/路径,编码器等4,准备录制:mr.prepare()5,开始录制:mr.start()6,停止录制:mr.stop()7,释放资源:mr.release()注:2,3不可调换顺序添加许可:<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO"> 相机设置相关类:Camera,它是专门用来连接和断开相机服务的类Camera的几个事件:Camera.AutoFocusCallback:自动调焦功能Camera.ErrorCallback:错误信息捕捉Camera.Parameters:相机的属性参数Camera.PictureCallback:拍照、产生图片时触发Camera.PreviewCallback:相机预览设置Camera.ShutterCallback:快门设置Camera.Size:图片的尺寸Camera类没有构造方法,可通过open()方法来打开相机设备Camera类的方法介绍:autoFocus:设置自动对焦getParameters:得到相机参数open:启动相机服务release:释放相机服务setParameters:设置参数setPreviewDisplay:设置预览startPreview:开始预览stopPreview:停止预览takePicture:拍照注:takePicture方法要实现3个回调函数作为它的三个参数:Camera.ShutterCallback (快门),和两个Camera.Picture.Callback(图像数据)。

QtforAndroid开发实例教程

QtforAndroid开发实例教程

QtforAndroid开发实例教程本⽂讲述了使⽤Qt5.3.0开发Android应⽤的⽅法,由于官⽅资料较少,此处记录开发过程遇到的问题及解决⽅法。

具体步骤如下:1.Android平台的视频播放,只能使⽤qml的MediaPlayer2.qml中控件的路径必须加file:// 例如:Image{source: "file:///mnt/usbhost1/Config/logo.png"}3.C++与qml中js的⽅法互调QQuickView view;view.setSource(QUrl(QStringLiteral("qrc:///qml/MainView.qml")));QObject *qmlObj =(QObject*) view.rootObject();MainWnd *w=new MainWnd(object);//暴露C++类给qml供其调⽤,别名mainWndClassview.engine ()->rootContext ()->setContextProperty (QLatin1String("mainWndClass"),w);//c++调⽤qml中的js⽅法//参数必须转换为QVariantQMetaObject::invokeMethod (qmlObj,"showRight",Q_ARG(QVariant,1));//调⽤⼦项的js⽅法qmlPlayer = qmlObj->findChild<QObject*>("playerArea");QMetaObject::invokeMethod (qmlPlayer,"setVideoFile",Q_ARG(QVariant,currentVideoFile));//MainView.qmlRectangle {anchors.fill: parentproperty int leftAreaWidth: this.width/5*4property int rightAreaWidth: this.width/5property int queueFontSizefunction showRight(isShow){....}Player{id:playerArea//设置objectName,在c++中才能找到它objectName: "playerArea"width: parent.widthheight: parent.height}}4.c++调⽤java Android api在项⽬⽬录下建⽴⽬录\android\src\org\rophie\ProjectName\JavaClass.javaorg\rophie\ProjectName即为java类的包名package org.rophie.ProjectName;如我调⽤Android API调节系统⾳量package org.rophie.ProjectName;import org.qtproject.qt5.android.bindings.QtActivity;import android.widget.Toast;import android.media.AudioManager;import android.content.Context;public class JavaClass extends QtActivity{private static JavaClass m_instance;private static AudioManager mAudioManager;public JavaClass(){//构造函数必须m_instance = this;}public static void setVolume(int vol){if(mAudioManager==null){mAudioManager = (AudioManager)m_instance.getSystemService(Context.AUDIO_SERVICE);}mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0);}}C++调⽤:QAndroidJniObject::callStaticMethod<void>("org/rophie/ProjectName/JavaClass","setVolume","(I)V",3); //具体参照QAndroidJniObject类5.BroadcastReceiver实现开机⾃启,和Android⼀模⼀样public void onReceive(Context context, Intent intent) {......//JavaClass为继承QtActivity的java主类Intent intent2 = new Intent(context, JavaClass.class);......}6.调⽤第三⽅jar包,在src同级⽬录下新建⽬录libs,将.jar拷⼊即可使⽤希望本⽂所述⽅法对⼤家的Android开发有所帮助。

android获取情景模式和铃声实现震动、铃声提醒

android获取情景模式和铃声实现震动、铃声提醒

android获取情景模式和铃声实现震动、铃声提醒当我们想通过铃声或者震动提醒⽤户的时候(类似于⼿机来电提醒界⾯),我们需要考虑到⼿机本⾝的情景模式。

(⽬前有个OPPO的测试⼿机就发现,即使调为了静⾳模式,我依旧可以将铃声播放出来),为了防⽌“灵异”事件的发⽣,所以在提⽰前将情景模式判断以便还是有必要的,特地将代码纪录。

1、获取⼿机情景模式:AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int ringerMode = audioManager.getRingerMode();其中 ringerMode有三种情况,分别是:AudioManager.RINGER_MODE_NORMAL(铃⾳模式)、AudioManager.RINGER_MODE_SILENT(静⾳模式)、AudioManager.RINGER_MODE_VIBRATE(震动模式)2、获取系统铃声uri:// 获取系统默认铃声的Uriprivate Uri getSystemDefultRingtoneUri() {return RingtoneManager.getActualDefaultRingtoneUri(this,RingtoneManager.TYPE_RINGTONE);}3、播放/停⽌播放系统铃声/*** 播放系统声⾳* */private void startAlarm() {//有的⼿机会创建失败,从⽽导致mMediaPlayer为空。

mMediaPlayer = MediaPlayer.create(this, getSystemDefultRingtoneUri());if (mMediaPlayer == null) {//有的⼿机铃声会创建失败,如果创建失败,播放我们⾃⼰的铃声SoundPoolUtils.playCallWaitingAudio();//⾃⼰定义的铃⾳播放⼯具类。

android使用SoundPool播放音效的方法

android使用SoundPool播放音效的方法

android使⽤SoundPool播放⾳效的⽅法在Android开发中我们经常使⽤MediaPlayer来播放⾳频⽂件,但是MediaPlayer存在⼀些不⾜,例如:资源占⽤量较⾼、延迟时间较长、不⽀持多个⾳频同时播放等。

这些缺点决定了MediaPlayer在某些场合的使⽤情况不会很理想,例如在对时间精准度要求相对较⾼的游戏开发中。

在游戏开发中我们经常需要播放⼀些游戏⾳效(⽐如:⼦弹爆炸,物体撞击等),这些⾳效的共同特点是短促、密集、延迟程度⼩。

在这样的场景下,我们可以使⽤SoundPool代替MediaPlayer来播放这些⾳效。

SoundPool(android.media.SoundPool),顾名思义是声⾳池的意思,主要⽤于播放⼀些较短的声⾳⽚段,⽀持从程序的资源或⽂件系统加载。

与MediaPlayer相⽐,SoundPool的优势在于CPU资源占⽤量低和反应延迟⼩。

另外,SoundPool还⽀持⾃⾏设置声⾳的品质、⾳量、播放⽐率等参数,⽀持通过ID对多个⾳频流进⾏管理。

就现在已知的资料来说,SoundPool有⼀些设计上的BUG,从固件版本1.0开始有些还没有修复,我们在使⽤中应该⼩⼼再⼩⼼。

相信将来Google会修复这些问题,但我们最好还是列出来: 1. SoundPool最⼤只能申请1M的内存空间,这就意味着我们只能⽤⼀些很短的声⾳⽚段,⽽不是⽤它来播放歌曲或者做游戏背景⾳乐。

2. SoundPool提供了pause和stop⽅法,但这些⽅法建议最好不要轻易使⽤,因为有些时候它们可能会使你的程序莫名其妙的终⽌。

建议使⽤这两个⽅法的时候尽可能多做测试⼯作,还有些朋友反映它们不会⽴即中⽌播放声⾳,⽽是把缓冲区⾥的数据播放完才会停下来,也许会多播放⼀秒钟。

3. SoundPool的效率问题。

其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响⽤户体验。

麦子学院Android开发MediaButtonReceiver广播监听器分析

麦子学院Android开发MediaButtonReceiver广播监听器分析

在Android中并没有定义MediaButtonReceive这个广播类,MediaButtonReceive 只是作为一种通俗的命名方式来响应。

插入耳机后,点击耳机上的按钮(名称:MEDIA_BUTTON)接受该广播事件的类。

所有该MEDIA_BUTTON的按下我们就简称为MEDIA_BUTTON广播吧。

顾名思义:它显然是一个广播接收器类(BroadbcastReceiver),那么它就具备了BroadbcastReceiver类的使用方式,但是,因为它需要通过AudioManager对象注册,所以它有着自己的独特之处(否则我也不会单独拿出来分析,- -),后面我们会慢慢的讲解。

点击MEDIA_BUTTON发送的Intent Action 为:ACTION_MEDIA_BUTTON ="android.intent.action.MEDIA_BUTTON "Intent 附加值为(Extra)点击MEDIA_BUTTON的按键码://获得KeyEvent对象KeyEvent keyEvent =(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);//获得ActionString intentAction = intent.getAction() ;AudioManager对象注册MEDIA_BUTTON广播的方法原型为:public voidregisterMediaButtonEventReceiver(ComponentNameeventReceiver) Register a component to be the sole receiverof MEDIA_BUTTON intentsParameters:eventReceiver : identifier of a BroadcastReceiver that will receive the media button intent. This broadcast receivermust be declared in the application manifest.从注释可知以下两点:1、在AudioManager对象注册一个MediaoButtonRecevie,使它成为MEDIA_BUTTON的唯一接收器(这很重要,我们会放在后面讲解) 也就是说只有我能收到,其他的都收不到这个广播了,否则的话大家都收到会照成一定的混乱;2、该广播必须在AndroidManifest.xml文件中进行声明,否则就监听不到该MEDIA_BUTTON广播了。

mediaplayer使用方法

mediaplayer使用方法

mediaplayer使用方法MediaPlayer是一款由Android提供的多媒体播放器,它可以用于播放各种类型的音频和视频文件,包括本地文件和网络文件。

它使用简单,操作方便,并具有多种自定义功能,可以满足不同用户的需求。

本文将介绍如何使用MediaPlayer进行音频和视频播放以及如何使用其它功能。

一、音频播放1.1 播放本地音频文件MediaPlayer可以很容易地播放本地音频文件,只需指定音频文件的路径即可。

以下是最简单的示例代码:```javaMediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);mediaPlayer.start();```其中,this代表当前的活动,R.raw.music是音频文件的资源ID。

MediaPlayer支持多种音频文件格式,如mp3、wav等格式。

需要注意的是,播放网络音频文件需要设置音频流类型,上述代码设置为STREAM_MUSIC,表示使用音乐流类型。

如果需要播放其它类型的音频流,可以根据需要修改。

```javaMediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.video);mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});```其中,this代表当前的活动,R.raw.video是视频文件的资源ID。

当MediaPlayer准备好视频后,执行设置的回调函数onPrepared,此时开始播放视频。

需要注意的是,视频播放需要在SurfaceView或TextureView中展示,不能直接在界面上展示。

android实现音乐播放器进度条效果

android实现音乐播放器进度条效果

android实现⾳乐播放器进度条效果本⽂实例为⼤家分享了android实现⾳乐播放器进度条效果的具体代码,供⼤家参考,具体内容如下效果图依赖3个对象MediaPlayer:实现⾳乐播放,暂停,缓冲。

SeekBar:滑动的进度条。

java.util.Timer:定时器,时时更新进度条。

main.xml样式⽂件<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" /><EditTextandroid:id="@+id/mediaFileName"android:layout_width="match_parent"android:text="gangstabop.mp3"android:layout_height="wrap_content" ><requestFocus /></EditText><LinearLayoutandroid:id="@+id/linearButton"android:layout_width="match_parent"android:layout_height="wrap_content" ><Buttonandroid:id="@+id/playButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/stop" /><SeekBarandroid:id="@+id/playSeekBar"android:layout_width="140px"android:layout_height="wrap_content"android:layout_marginLeft="3px"android:layout_marginTop="5px" />android:id="@+id/replayButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="3px"android:text="@string/replay" /></LinearLayout>Activity实现代码/*** @CreateDate 2015-2-3* @Author hubiao* @Title ⾳乐播放器*/public class MediaActivity extends Activity {private MediaPlayer mediaPlayer;//媒体播放器private Button playButton;private Button replayButton ;private boolean isCellPlay;/*在挂断电话的时候,⽤于判断是否为是来电时中断*/private boolean isSeekBarChanging;//互斥变量,防⽌进度条与定时器冲突。

Android媒体播放---Media playback(四)

Android媒体播放---Media playback(四)

Android媒体播放---Media playback(四)作为前台服务来运行服务经常被用来执行后台服务,如获取Mail,同步数据,下载内容等。

在这些场景中,用户是不关心服务的执行,甚至是这些服务被中断然后在重新开始也不太关注。

但是在播放音乐的服务的场景中。

用户能够清晰的感觉到这个一个服务,并且任何中断都会严重影响用户的体验。

另外,该服务在执行期间,用户也希望与它进行交互。

在这种情况下,服务应该作为前台服务(foreground service)来运行。

前台服务在系统中会持有很高的重要性级别---系统几乎不会杀死这样的服务,因为对用户来说,它是非常重要的。

当服务在前台运行时,该服务也必须提供状态栏通知,以确保用户能够感知到服务正在运行,并且允许用户能够打开与服务进行交互的Activity。

为了把服务转换成前台服务,必须给状态栏创建一个Notification,并且从Service中调用startForeground()方法,例如:String songName;// assign the song name to songNamePendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,new Intent(getApplicationContext(), MainActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);Notification notification = new Notification();notification.tickerText = text;notification.icon = R.drawable.play0;notification.flags |= Notification.FLAG_ONGOING_EVENT;notification.setLatestEventInfo(getApplicationContext(), "MusicPlayerSample", "Playing: " + songName, pi);startForeground(NOTIFICATION_ID, notification);当服务在前台运行时,配置的通知会显示在设备的通知区域。

android播放音乐-进度条

android播放音乐-进度条

android播放⾳乐-进度条今天学渣研究了⼀下使⽤MediaPlayer播放⾳乐时加⼊进度条,进度条如今⽤的是android⾃带的seekbar,后期会跟换UI的,在之前可以播放⾳乐的基础上,如今加⼊的主要功能有两个:1实时显⽰播放进度2⼿动调节播放进度如今学渣新建了⼀个项⽬来进⾏測试,后期会和之前博客介绍的滑动页⾯进⾏整合,预计会在service建好后整合,敬请期待。

好了先上效果图:关于使⽤进度条的基本原理⾮常easy,⽤到了⼏个參数:1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),只是要注意getDuration()的使⽤状态,在这篇中介绍了MediaPlayer的各个状态,⼤家能够去看看。

2 进度条的长度:android⾥进度条的长度默认应该是100,单位不详,没影响3 当前进度:对于歌曲⽽⾔,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条⽽⾔,是在进度条中所占的⽐例。

主要是对这两个进⾏转化。

两个功能:1因为进度须要实时更新,因此在系统中⽤⼀个线程对UI线程发消息(每隔100毫秒),在UI线程中⽤Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进⽽计算seekbar相应的位置,对seekbar及时进⾏更新。

2对于⼿动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()监听滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,⽤MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。

详细代码例如以下:public class MainActivity extends Activity {MediaPlayer mediaPlayer;SeekBar seekBar;//本地歌曲的路径String path = "/storage/sdcard1/Music/浪漫满屋.mp3";//处理进度条更新Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){switch (msg.what){case 0://更新进度int position = mediaPlayer.getCurrentPosition();int time = mediaPlayer.getDuration();int max = seekBar.getMax();seekBar.setProgress(position*max/time);break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//初始化播放buttonButton playButton = (Button)findViewById(R.id.playButton);playButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show(); play();}});//初始化暂停buttonButton pauseButton = (Button)findViewById(R.id.pauseButton);pauseButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubpause();}});seekBar = (SeekBar)findViewById(R.id.seekbar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//⼿动调节进度// TODO Auto-generated method stubint dest = seekBar.getProgress();int time = mediaPlayer.getDuration();int max = seekBar.getMax();mediaPlayer.seekTo(time*dest/max);}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {// TODO Auto-generated method stub}});}//初始化⾳乐播放void init(){//进⼊IdlemediaPlayer = new MediaPlayer();try {//初始化mediaPlayer.setDataSource(path);mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// prepare 通过异步的⽅式装载媒体资源mediaPlayer.prepareAsync();//后台线程发送消息进⾏更新进度条final int milliseconds = 100;new Thread(){@Overridepublic void run(){while(true){try {sleep(milliseconds);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}mHandler.sendEmptyMessage(0);}}}.start();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//測试播放⾳乐void play(){mediaPlayer.start();}//暂停⾳乐private void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();}}//activity 退出时,停⽌播放⾳乐,释放资源@Overrideprotected void onDestroy() {// 在activity结束的时候回收资源if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}super.onDestroy();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);return true;}}。

黑马程序员安卓教程:音乐播放器

黑马程序员安卓教程:音乐播放器

音乐播放器1.5.1 准备工作Android 官方提供了MediaPlayer 核心类,用于播放音乐,其状态流程如图1-12 所示。

MediaPlayer 必须严格按照状态图操作,否则就会出现错误,这些错误都是底层抛出,严格按照状态图操作的话一般就不会出问题。

使用MediaPlayer播放音乐的核心方法如下所示:1. M ediaPlayer player = new MediaPlayer(); 创建对象2. p layer.reset(); 重置为初始状态3.player.setAudioStreamType(AudioManager.STREAM_MUSIC);声音流类型4.player.setDataSource(“/mnt/sdcard/test.mp3”); 设置音频源5. player.prepare(); 准备6. player.start(); 开始或恢复播放7. player.pause(); 暂停播放8. player.start(); 恢复播放9. player.stop(); 停止播放10. player.release(); 释放资源为了演示MediaPlayer的使用,我们需要提前准备一个mp3文件放到sdcard中。

需求:制作一个播放器,能够播放/暂停/停止音乐文件,并且添加一个SeekBar(可以拖拽的ProgressBar),当音乐播放时SeekBar 也会不断的跟新当前的进度,当用户拖动SeekBar 时可以更改播放的进度。

23图 1-12 MediaPlayer 状态流程图1.5.2 编写布局【文件 1-7】 activity_main.xml1.<LinearLayout xmlns:android="/apk/res/android"2. android:layout_width="match_parent"3. android:layout_height="match_parent"4. android:orientation="vertical">5.6. <LinearLayout7.android:layout_width="match_parent"248.android:layout_height="wrap_content"9.android:orientation="horizontal"10.>11.<Button12. android:onClick="play"13. android:layout_width="0dp"14. android:layout_weight="1"15. android:layout_height="wrap_content"16. android:text="播放"17. />18.<Button19. android:onClick="pause"20. android:layout_width="0dp"21. android:layout_weight="1"22. android:layout_height="wrap_content"23. android:text="暂停"24. />25.<Button26. android:onClick="stop"27. android:layout_width="0dp"28. android:layout_weight="1"29. android:layout_height="wrap_content"30. android:text="停止"31. />32.33.</LinearLayout>34.35.<SeekBar36.android:layout_width="match_parent"37.android:layout_height="wrap_content"38.android:id="@+id/sb"39./>40.</LinearLayout>1.5.3代码实现【文件1-8】MainActivity.java1. package com.example.musicplayer;2.3.import java.util.Timer;4.import java.util.TimerTask;5.import android.media.AudioManager;6.import android.media.MediaPlayer;257.import android.os.Bundle;8.import android.view.View;9.import android.widget.SeekBar;10.import android.widget.SeekBar.OnSeekBarChangeListener;11.import android.widget.Toast;12.import android.app.Activity;13./**14.* 实现音乐播放器15.*16.* @author wzy2016-1-2817.*18.*/19.public class MainActivity extends Activity implements OnSeekBarChangeListener {20.21.private SeekBar sb;22.private MediaPlayer player;23.private int duration;24.// 播放器的几个状态25.private static final int PLAYING =1;// 播放状态26.private static final int PAUSING =2;// 暂停状态27.private static final int STOPPING =3;// 停止状态28.private volatile int CURRENT =0;// 当前状态29.private Timer timer;30.31.@Override32.protected void onCreate(Bundle savedInstanceState){33.super.onCreate(savedInstanceState);34.setContentView(yout.activity_main);35.sb = (SeekBar) findViewById(R.id.sb);36.//设置拖动监听37.sb.setOnSeekBarChangeListener(this);38.}39./**40.* 播放41.*/42.public void play(View view){43.if (player!=null) {44.if (CURRENT==PLAYING){45.Toast.makeText(this,"音乐已经在播放了",Toast.LENGTH_SHORT).show();46.return;47.}else if(CURRENT==PAUSING) {48.player.start();49.CURRENT = PLAYING;50.return;2651.}52.}53.try{54.//创建一个播放器对象55.player=new MediaPlayer();56.//给播放器设置音乐路径57.player.setDataSource("/mnt/sdcard/test.mp3");58.//设置音乐格式59.player.setAudioStreamType(AudioManager.STREAM_MUSIC);60.//准备61.player.prepare();62.//获取音乐最大长度(毫秒单位)63.duration= player.getDuration();64.//给SeekBar设置最大值65.sb.setMax(duration);66.//音乐开始播放67.player.start();68.//设置当前的状态为播放69.CURRENT = PLAYING;70.if (timer==null){71.//创建定时器72.timer = new Timer();73.}74./**75.* 参数1:匿名内部类,相当于Runnable类76.* 参数2:第一次延时多长时间(毫秒)后执行,0则代表立即执行77.* 参数3:每隔多长时间(毫秒)执行一次78.*/79.timer.schedule(new TimerTask(){80.81.@Override82.public void run() {//该方法每 1 秒被调用一次83. if (CURRENT==PLAYING) {84. runOnUiThread(new Runnable() {85.86. @Override87. public void run() {88. // 双重判断,尽可能避免线程问题,因为该段代码时在主线程中的,89. // 第一次判断是在子线程中进行的90. if (player!=null&&CURRENT==PLAYING) {91. // 获取当前的播放进度92. int currentPosition = player.getCurrentPosition();93. // 设置给SeekBar94. sb.setProgress(currentPosition);95. }2796. }97.});98.}99.100.}101. }, 0, 1000);102.103.}catch (Exception e){104. e.printStackTrace();105.Toast.makeText(this,"音乐播放失败"+e, 0).show(); 106.}107.}108./**109.* 暂停110.*/111.public void pause(View view){112.if (player !=null &&CURRENT==PLAYING){113.player.pause();114.CURRENT = PAUSING;115.}116.}117./**118.* 停止119.*/120.public void stop(View view){121.if (player !=null) {122.if (CURRENT== PLAYING ||CURRENT == PAUSING){ 123. CURRENT = STOPPING;124. // 取消定时器125. timer.cancel();126. timer = null;127. player.stop();128. player.reset();129. player.release();130. player = n ull;131. sb.setProgress(0);132.}133.}134.}135./*136.* 拖动过程中回调多次137.*/138.@Override139.public void onProgressChanged(SeekBar seekBar, int progress,28140.boolean fromUser){141.if (player ==null) {142.sb.setProgress(0);143.}else{144.player.seekTo(progress);145.}146.}147./*148.* 开始拖动前回调一次149.*/150.@Override151.public void onStartTrackingTouch(SeekBar seekBar){152.if (player==null) {153.Toast.makeText(this,"音乐播放器还未开始",Toast.LENGTH_SHORT).show(); 154.}155.}156./*157.* 结束拖动后回调一次158.*/159.@Override160.public void onStopTrackingTouch(SeekBar seekBar) {161.}162.163.@Override164.protected void onDestroy() {165.super.onDestroy();166.stop(null);167.}168.169. }170.运行上面的代码效果如图1-13所示。

Android媒体播放---Media playback(三)

Android媒体播放---Media playback(三)

Android媒体播放---Media playback(三)使用服务的MediaPlayer如果想要的媒体在后台播放,即使应用程序不在屏幕上,也就是说在用户跟其他应用程序交互时,媒体文件也能继续播放,那么就必须启动一个服务(Service),并且在服务中控制MediaPlayer实例。

你应该关注这种情况,因为用户和系统都希望运行后台服务的应用程序应该跟系统的空闲时间交互。

如果应用程序不能满足这种期望,那么用户可能会有很坏的体验。

本节会向你介绍这些主要的问题,并提供解决它们的方法。

异步运行首先,实际上默认情况下,Activity以及在Service中的所有工作都是在一个单一线程中执行的,如果在同一个应用程序中运行一个Activity和Service,那么默认情况下,它们都会使用同一个线程(main线程)。

因此,服务需要快速的处理输入的请求,并且在响应请求时,不要处理长时的计算处理。

如果有繁重的工作或阻塞调用,就必须采用异步的方式:既可以采用另一个线程来执行你的处理,也可以使用很多由框架提供的便利的异步处理。

例如,在main线程中使用MediaPlayer时,应该调用prepareAsync()方法,而不是prepare(),并且为了在准备完成时便于通知你启动播放处理,你要实现MediaPlayer.OnPrepare监听器,例如:public class MyService extends Service implementsMediaPlayer.OnPreparedListener {private static final ACTION_PLAY = "com.example.action.PLAY"; MediaPlayer mMediaPlayer = null;public int onStartCommand(Intent intent, int flags, int startId) {...if (intent.getAction().equals(ACTION_PLAY)) {mMediaPlayer = ... // initialize it heremMediaPlayer.setOnPreparedListener(this);mMediaPlayer.prepareAsync(); // prepare async to not block main thread }}/** Called when MediaPlayer is ready */public void onPrepared(MediaPlayer player) {player.start();}}处理异步错误在同步操作上,通常错误会发出一个异常信号或错误代码,但是在使用异步资源时,应该确保应用程序获取正确的错误通知。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在听筒模式下am.setSpeakerphoneOn(false);setV olumeControlStream(AudioManager.STREAM_VOICE_CALL);am.setMode(AudioManager.MODE_IN_CALL);我用Mediaplayer AudioTrack调节音量总是失败at.setStereoV olume(vol, vol);player.setV olume(vol,vol);后来决定用AudioManager来调节音量AudioManager可以修改系统Android系统的音量下面介绍几个AudioManager的几个音量调整方面的方法.首先是得到AudioManager实例:AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);调整音量方法有两种,一种是渐进式,即像手动按音量键一样,一步一步增加或减少,另一种是直接设置音量值.1、渐进式public void adjustStreamV olume (int streamType, int direction, int flags)am.adjustStreamV olume (AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);解释一下三个参数第一个streamType是需要调整音量的类型,这里设的是媒体音量,可以是:STREAM_ALARM 警报STREAM_MUSIC 音乐回放即媒体音量STREAM_NOTIFICA TION 窗口顶部状态栏Notification,STREAM_RING 铃声STREAM_SYSTEM 系统STREAM_VOICE_CALL 通话STREAM_DTMF 双音多频,不是很明白什么东西第二个direction,是调整的方向,增加或减少,可以是:ADJUST_LOWER 降低音量ADJUST_RAISE 升高音量ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量第三个flags是一些附加参数,只介绍两个常用的FLAG_PLAY_SOUND 调整音量时播放声音FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个2、直接设置音量值的方法:public void setStreamV olume (int streamType, int index, int flags)am.setStreamV olume(AudioManager.STREAM_MUSIC,am.getStreamMaxV olume(AudioManager.STREAM_MUSIC),AudioManager.FLAG_PLAY_SOUND);am.getStreamMaxV olume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的最大值am.getStreamV olume(AudioManager.STREAM_VOICE_CALL);//得到听筒模式的当前值第一个和第三个参数与上面的相同第二个参数是一个音量的int值,getStreamMaxV olume(int streamType)得到的是该类型音量的最大值,可以根据这个值计算你需要的音量,我这里直接调到最大.最后我的代码:package com.lp;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import Android.app.Activity;import Android.content.Context;import Android.media.AudioFormat;import Android.media.AudioManager;import Android.media.AudioTrack;import Android.os.Bundle;import Android.view.View;import Android.view.View.OnClickListener;import Android.widget.Button;import Android.widget.SeekBar;public class MainActivity5 extends Activity {private Button play;private Button stop;private SeekBar soundV alue;private AudioTrack at;private AudioManager am;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main_sk);am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);play = (Button)findView ById(R.id.main_sk_play);stop = (Button)findV iewById(R.id.main_sk_stop);soundV alue = (SeekBar)findViewById(R.id.skbV olume);setV olumeControlStream(AudioManager.STREAM_VOICE_CALL);play.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(am.isSpeakerphoneOn()){am.setSpeakerphoneOn(false);}//setV olumeControlStream(AudioManager.STREAM_VOICE_CALL);am.setMode(AudioManager.MODE_IN_CALL);System.out.println(am.getStreamMaxV olume(AudioManager.STREAM_VOICE_CALL));System.out.println("&&&&&&&&&&&&&");System.out.println(am.getStreamV olume(AudioManager.STREAM_VOICE_CALL));//am.setStreamV olume(streamType, index, flags)int bufferSizeInBytes = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);if(at==null){at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);System.out.println("22222");//at.setStereoV olume(100f, 100f);at.setStereoV olume(0.7f, 0.7f);//设置当前音量大小new AudioTrackThread().start();}else{if(at.getPlayState()==AudioTrack.PLAYSTA TE_PLAYING){System.out.println("111111111");}else{System.out.println("33333");at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes, AudioTrack.MODE_STREAM);new AudioTrackThread().start();}}}});stop.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(at.getPlayState()==AudioTrack.PLAYSTA TE_PLAYING){try{at.stop();}catch (IllegalStateException e){e.printStackTrace();}at.release();am.setMode(AudioManager.MODE_NORMAL);}}});// soundV alue.setMax(100);//音量调节的极限// soundV alue.setProgress(70);//设置seekbar的位置值soundV alue.setMax(am.getStreamMaxV olume(AudioManager.STREAM_VOICE_CALL)); soundV alue.setProgress(am.getStreamV olume(AudioManager.STREAM_VOICE_CALL));soundV alue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// float vol=(float)(seekBar.getProgress())/(float)(seekBar.getMax());// System.out.println(vol);// at.setStereoV olume(vol, vol);//设置音量am.setStreamV olume(AudioManager.STREAM_VOICE_CALL, seekBar.getProgress(), AudioManager.FLAG_PLAY_SOUND);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub}});}class AudioTrackThread extends Thread{@Overridepublic void run() {byte[] out_bytes = new byte[44100];InputStream is = getResources().openRawResource(R.raw.start);int length ;try{at.play();}catch (IllegalStateException e){e.printStackTrace();}try {while((length = is.read(out_bytes))!=-1){//System.out.println(length);at.write(out_bytes, 0, length);}} catch (IOException e) {e.printStackTrace();}if(at.getPlayState()==AudioTrack.PLAYSTA TE_PLAYING){try{at.stop();}catch (IllegalStateException e){e.printStackTrace();}at.release();am.setMode(AudioManager.MODE_NORMAL);}}}}当然权限<uses-permission Android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission Android:name="android.permission.RECORD_AUDIO" />。

相关文档
最新文档