Android編程檢測手機錄音權限是否打開的方法
本文實例講述了Android編程檢測手機錄音權限是否打開的方法。分享給大家供大家參考,具體如下:
6.0之前的權限檢測只是檢測到是否在清單文件中注冊
Boolean flag = (PackageManager.PERMISSION_GRANTED ==
pm.checkPermission("android.permission.RECORD_AUDIO", "包名"));
Boolean flag = PermissionChecker.checkSelfPermission(this, Manifest.permission.)== PermissionChecker.PERMISSION_GRANTED;
if (flag){
ToastUtil.showMessage("有權限");
} else {
ToastUtil.showMessage("無權限");
return;
}
在6.0系統(tǒng)一下 無論是關閉或者打開app的錄音權限都能獲取到權限,6.0以上則正常,后來發(fā)現(xiàn)是6.0以后google加強了權限管理
public class CheckPermissionUtils {
/**
*獲取app的錄音權限是否打開
*android 6.0version以上 傳統(tǒng)方法不適合 以此兼容
* @param context
*/
public static Boolean isHasAudioRecordPermission(Context context) {
// 音頻獲取源
int audioSource = MediaRecorder.AudioSource.MIC;
// 設置音頻采樣率,44100是目前的標準,但是某些設備仍然支持22050,16000,11025
int sampleRateInHz = 44100;
// 設置音頻的錄制的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
// 音頻數(shù)據(jù)格式:PCM 16位每個樣本。保證設備支持。PCM 8位每個樣本。不一定能得到設備支持。
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 緩沖區(qū)字節(jié)大小
int bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
//開始錄制音頻
try{
// 防止某些手機崩潰,例如聯(lián)想
audioRecord.startRecording();
}
catch (IllegalStateException e){
e.printStackTrace();
}
/**
* 根據(jù)開始錄音判斷是否有錄音權限
*/
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
return false;
}
audioRecord.stop();
audioRecord.release();
audioRecord = null;
return true;
}
}
最后一種,測試沒問題。
public class CheckPermissionUtils {
private static final String TAG = "CheckPermissionUtils";
private static CheckPermissionUtils checkPermissionUtils = new CheckPermissionUtils();
static final int SAMPLE_RATE_IN_HZ = 44100;
static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT);
private AudioRecord mAudioRecord;
Boolean isGetVoiceRun;
private Object mLock;
private int count=0;
private Boolean isHasPermission;
private CheckPermissionUtils() {
mLock = new Object();
}
public static CheckPermissionUtils getinstance() {
if (checkPermissionUtils == null) {
checkPermissionUtils = new CheckPermissionUtils();
}
return checkPermissionUtils;
}
public Boolean isHasAudioRecordingPermission(Context context) {
isHasPermission=false;
count=0;
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;
try {
// new Thread(new Runnable() {
// @Override
// public void run() {
mAudioRecord.startRecording();
short[] buffer = new short[BUFFER_SIZE];
while (isGetVoiceRun) {
count++;
if (count++>10) {
isGetVoiceRun=false;
}
//r是實際讀取的數(shù)據(jù)長度,一般而言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];
}
// 平方和除以數(shù)據(jù)總長度,得到音量大小。
double mean = v / (double) r;
double volume = 10 * Math.log10(mean);
Log.d(TAG, "-------分貝值:" +volume+"----v"+v+"------r"+r );
if (v>0&&r>0) {
//有錄音
isHasPermission=true;
return isHasPermission;
}
// 大概一秒十次
synchronized (mLock) {
try {
mLock.wait(5);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
// }
//}).start();
}
catch (Exception e) {
}
return isHasPermission;
}
}
另,可點擊此處查看Android權限操作說明
更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android視圖View技巧總結》、《Android編程之activity操作技巧總結》、《Android操作json格式數(shù)據(jù)技巧總結》、《Android資源操作技巧匯總》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
相關文章
android4.0混淆XmlPullParser報錯原因分析解決
今天,用android4.0在proguard-project.txt中加入 -libraryjars libs/ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar這句話后,混淆時報上面的錯誤,下面與大家分享下具體的解決方法2013-06-06
android自定義控件ImageView實現(xiàn)圓形圖片
這篇文章主要為大家詳細介紹了android自定義控件ImageView實現(xiàn)圓形圖片,適用于用戶頭像,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android通過反射實現(xiàn)強制停止應用程序的方法
這篇文章主要介紹了Android通過反射實現(xiàn)強制停止應用程序的方法,涉及Android的反射機制與進程操作的相關技巧,需要的朋友可以參考下2016-02-02
Android 中CheckBox的isChecked的使用實例詳解
這篇文章主要介紹了Android 中CheckBox的isChecked的使用實例詳解的相關資料,需要的朋友可以參考下2017-04-04

