android 音量总结

来源:互联网 发布:ktv计费软件 编辑:程序博客网 时间:2024/06/05 10:56

获取系统音量

通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!

设置音量的方法也很简单,AudioManager提供了方法:
publicvoidsetStreamVolume(intstreamType,intindex,intflags)其中streamType有内置的常量,去文档里面就可以看到。

JAVA代码:
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

//通话音量

int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(“VIOCE_CALL”, “max : ” + max + ” current : ” + current);

//系统音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(“SYSTEM”, “max : ” + max + ” current : ” + current);

//铃声音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(“RING”, “max : ” + max + ” current : ” + current);

//音乐音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(“MUSIC”, “max : ” + max + ” current : ” + current);

//提示声音音量

max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(“ALARM”, “max : ” + max + ” current : ” + current);
ps:
  游戏过程中只允许调整多媒体音量,而不允许调整通话音量。
  setVolumeControlStream(AudioManager.STREAM_MUSIC);
  长时间不动,不允许黑屏,View.setKeepScreenOn(true);
  估计manifest文件中需要注册权限吧

 

调节媒体音量

AudioManager audio = (AudioManager) getSystemService(Service.AUDIO_SERVICE);

重写 Activity 的 onKeyDown 方法

?
@Override
publicboolean onKeyDown(intkeyCode, KeyEvent event) {
    switch(keyCode) {
    caseKeyEvent.KEYCODE_VOLUME_UP:
        audio.adjustStreamVolume(
            AudioManager.STREAM_MUSIC,
            AudioManager.ADJUST_RAISE,
            AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
        returntrue;
    caseKeyEvent.KEYCODE_VOLUME_DOWN:
        audio.adjustStreamVolume(
            AudioManager.STREAM_MUSIC,
            AudioManager.ADJUST_LOWER,
            AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
        returntrue;
    default:
        break;
    }
    returnsuper.onKeyDown(keyCode, event);
}

获取麦周围环境声音分贝:
1:MainActivity.java
package com.example.recording;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.view.Menu;  
  
public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        new AudioRecordDemo().getNoiseLevel();  
          
    }  
  
}  

2:AudioRecordDemo.java
package com.example.recording;  
  
import android.media.AudioFormat;  
import android.media.AudioRecord;  
import android.media.MediaRecorder;  
import android.util.Log;  
  
public class AudioRecordDemo {  
    private static final String TAG = "AudioRecord";    
    static final int SAMPLE_RATE_IN_HZ = 8000;    
    static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,    
            AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);    
    AudioRecord mAudioRecord;    
    boolean isGetVoiceRun;    
    Object mLock;    
  
    public AudioRecordDemo() {    
        mLock = new Object();    
    }    
  
    public void getNoiseLevel() {    
        if (isGetVoiceRun) {    
            Log.e(TAG, "还在录着呢");    
            return;    
        }    
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,    
                SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,    
                AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);    
        if (mAudioRecord == null) {    
            Log.e("sound", "mAudioRecord初始化失败");    
        }    
        isGetVoiceRun = true;    
  
        new Thread(new Runnable() {    
            @Override    
            public void run() {    
                mAudioRecord.startRecording();    
                short[] buffer = new short[BUFFER_SIZE];    
                while (isGetVoiceRun) {    
                    //r是实际读取的数据长度,一般而言r会小于buffersize    
                    int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);    
                    long v = 0;    
                    // 将 buffer 内容取出,进行平方和运算    
                    for (int i = 0; i < buffer.length; i++) {    
                        v += buffer[i] * buffer[i];    
                    }    
                    // 平方和除以数据总长度,得到音量大小。    
                    double mean = v / (double) r;    
                    double volume = 10 * Math.log10(mean);    
                    Log.d(TAG, "分贝值:" + volume);   
                    if(volume>80){  
                        Log.d(TAG, "恭喜您获得一元优惠券");     
                    }  
                   
                    // 大概一秒十次    
                    synchronized (mLock) {    
                        try {    
                            mLock.wait(100);    
                          
                        } catch (InterruptedException e) {    
                            e.printStackTrace();    
                        }    
                    }    
                }    
                mAudioRecord.stop();    
                mAudioRecord.release();    
                mAudioRecord = null;    
            }    
        }).start();    
    }    
}  

3:下面这个demo不好:MediaRecorderDemo.java
package com.example.recording;  
  
import java.io.File;  
import java.io.IOException;  
  
import android.media.MediaRecorder;  
import android.os.Handler;  
import android.util.Log;  
  
public class MediaRecorderDemo {  
    private final String TAG = "MediaRecord";    
    private MediaRecorder mMediaRecorder;    
    public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;    
    private String filePath;    
  
    public MediaRecorderDemo(){    
        this.filePath = "/dev/null";    
    }    
  
    public MediaRecorderDemo(File file) {    
        this.filePath = file.getAbsolutePath();    
    }    
  
    private long startTime;    
    private long endTime;    
  
    /**  
     * 开始录音 使用amr格式  
     *  
     *            录音文件  
     * @return  
     */    
    public void startRecord() {    
        // 开始录音    
        /* ①Initial:实例化MediaRecorder对象 */    
        if (mMediaRecorder == null)    
            mMediaRecorder = new MediaRecorder();    
        try {    
            /* ②setAudioSource/setVedioSource */    
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风    
            /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */    
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);    
            /*  
             * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式  
             * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)  
             */    
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);    
  
            /* ③准备 */    
            mMediaRecorder.setOutputFile(filePath);    
            mMediaRecorder.setMaxDuration(MAX_LENGTH);    
            mMediaRecorder.prepare();    
            /* ④开始 */    
            mMediaRecorder.start();    
            // AudioRecord audioRecord.    
            /* 获取开始时间* */    
            startTime = System.currentTimeMillis();    
            updateMicStatus();    
            Log.i("ACTION_START", "startTime" + startTime);    
        } catch (IllegalStateException e) {    
            Log.i(TAG,    
                    "call startAmr(File mRecAudioFile) failed!"    
                            + e.getMessage());    
        } catch (IOException e) {    
            Log.i(TAG,    
                    "call startAmr(File mRecAudioFile) failed!"    
                            + e.getMessage());    
        }    
    }    
  
    /**  
     * 停止录音  
     *  
     */    
    public long stopRecord() {    
        if (mMediaRecorder == null)    
            return 0L;    
        endTime = System.currentTimeMillis();    
        Log.i("ACTION_END", "endTime" + endTime);    
        mMediaRecorder.stop();    
        mMediaRecorder.reset();    
        mMediaRecorder.release();    
        mMediaRecorder = null;    
        Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));    
        return endTime - startTime;    
    }    
  
    private final Handler mHandler = new Handler();    
    private Runnable mUpdateMicStatusTimer = new Runnable() {    
        public void run() {    
            updateMicStatus();    
        }    
    };    
  
    /**  
     * 更新话筒状态  
     *  
     */    
    private int BASE = 1;    
    private int SPACE = 100;// 间隔取样时间    
  
    private void updateMicStatus() {    
        if (mMediaRecorder != null) {    
            double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;    
            double db = 0;// 分贝    
            if (ratio > 1)    
                db = 20 * Math.log10(ratio);    
            Log.d(TAG,"分贝值:"+db);    
            mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);    
        }    
    }    
}  
4:XML:activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    tools:context=".MainActivity" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="@string/hello_world" />  
  
</RelativeLayout>  
0 0
原创粉丝点击