Android如何判斷手機(jī)是否有錄音權(quán)限的工具類
作用
判斷手機(jī)是否有錄音權(quán)限的工具類,兼容6.0以上以及以下android系統(tǒng)
測試環(huán)境
這篇文章是評論中的網(wǎng)友提出質(zhì)疑后,經(jīng)過重寫修改與重寫測試后編寫的,我的調(diào)試環(huán)境是小米note3,Android7.1的系統(tǒng)。
記得在清單文件中配置對應(yīng)的權(quán)限。
思路
檢測是否有權(quán)限
-->有權(quán)限--執(zhí)行相關(guān)操作
-->無權(quán)限-- 判斷系統(tǒng)版本
--大于等于6.0 --動(dòng)態(tài)申請權(quán)限
-->對申請結(jié)果的回調(diào)處理
--允許
--拒絕
代碼
工具類CheckAudioPermission.java
package com.example.a002034.testaudioperrmission;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
/**
* Function:判斷錄音權(quán)限,兼容android6.0以下以及以上系統(tǒng)
*
* @author xuzhuyun
* @date 2018/5/10
*/
public class CheckAudioPermission {
/**
* 音頻獲取源
*/
public static int audioSource = MediaRecorder.AudioSource.MIC;
/**
* 設(shè)置音頻采樣率,44100是目前的標(biāo)準(zhǔn),但是某些設(shè)備仍然支持22050,16000,11025
*/
public static int sampleRateInHz = 44100;
/**
* 設(shè)置音頻的錄制的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道
*/
public static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
/**
* 音頻數(shù)據(jù)格式:PCM 16位每個(gè)樣本。保證設(shè)備支持。PCM 8位每個(gè)樣本。不一定能得到設(shè)備支持。
*/
public static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
/**
* 緩沖區(qū)字節(jié)大小
*/
public static int bufferSizeInBytes = 0;
public static AudioRecord audioRecord;
/**
* 判斷是是否有錄音權(quán)限.
*/
public static boolean isHasPermission(final Context context) {
bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
if (audioRecord == null) {
audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
}
//開始錄制音頻
try {
// 防止某些手機(jī)崩潰,例如聯(lián)想
audioRecord.startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
/**
* 根據(jù)開始錄音判斷是否有錄音權(quán)限s
*/
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
return false;
}
audioRecord.stop();
//釋放資源
audioRecord.release();
audioRecord = null;
return true;
}
}
測試類MainActivity
package com.example.a002034.testaudioperrmission;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
/**
* desc:測試錄音權(quán)限.
* steps:
* 檢測是否有權(quán)限--有--執(zhí)行相關(guān)操作
* --無權(quán)限--
* <p>
* --判斷系統(tǒng)版本
* --小于6.0 直接獲取
* --大于6.0 動(dòng)態(tài)申請權(quán)限
* --對申請結(jié)果的處理回調(diào)
* <p>
* --允許
* <p>
* --拒絕
* <p>
* test:
* test1 build.gradle minsdk <23 真機(jī)android7.1 清單文件中配置了錄音權(quán)限
* test2 build.gradle minsdk >=23 真機(jī)android7.1 清單文件中配置了錄音權(quán)限
*
* @author xuzhuyun
* @date 2018/5/10
*/
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//檢測是否有錄音權(quán)限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "默認(rèn)無錄音權(quán)限");
if (Build.VERSION.SDK_INT >= 23) {
Log.i(TAG, "系統(tǒng)版本不低于android6.0 ,需要?jiǎng)討B(tài)申請權(quán)限");
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 1001);
}
} else {
Log.i(TAG, "默認(rèn)有錄音權(quán)限");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1001) {
//方式一校驗(yàn)
boolean isHasAudioPermission = CheckAudioPermission.isHasPermission(this);
Log.i(TAG, "申請權(quán)限完畢,當(dāng)前錄音權(quán)限:" + isHasAudioPermission);
//方式二校驗(yàn)
int result = 0;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
result++;
}
}
if (result != permissions.length) {
//沒有權(quán)限
Log.i(TAG, "onRequestPermissionsResult: 申請權(quán)限完畢,當(dāng)前錄音權(quán)限:false");
return;
}
//有權(quán)限
Log.i(TAG, "onRequestPermissionsResult: 申請后,是否有權(quán)限:true");
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Android自定義權(quán)限使用總結(jié)
- Android基于注解的6.0權(quán)限動(dòng)態(tài)請求框架詳解
- Android權(quán)限HaloPermission詳細(xì)使用
- Android 采用AOP方式封裝6.0權(quán)限管理的方法
- 詳解Android運(yùn)行時(shí)權(quán)限及APP適配方法
- 詳解Android 全局彈出對話框SYSTEM_ALERT_WINDOW權(quán)限
- Android MIUI通知類短信權(quán)限的坑
- Android編程實(shí)現(xiàn)應(yīng)用獲取包名、版本號(hào)、權(quán)限等信息的方法
- 安卓Android6.0權(quán)限動(dòng)態(tài)獲取操作示例
- 淺析Android位置權(quán)限以及數(shù)組尋找索引的坑
相關(guān)文章
Android編程之Application設(shè)置全局變量及傳值用法實(shí)例分析
這篇文章主要介紹了Android編程之Application設(shè)置全局變量及傳值用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了全局變量及傳值的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
Android TimeLine 時(shí)間節(jié)點(diǎn)軸的實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android TimeLine 時(shí)間節(jié)點(diǎn)軸的實(shí)現(xiàn)實(shí)例代碼,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-03-03
一個(gè)簡單的toolabar結(jié)合drawlayout使用方法
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡單的toolabar結(jié)合drawlayout的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析
這篇文章主要為大家介紹了ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
淺談Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解
本篇文章小編為大家介紹,Android onTouchEvent 與 onInterceptTouchEvent的區(qū)別詳解。需要的朋友參考下2013-04-04
Android新建水平節(jié)點(diǎn)進(jìn)度條示例
這篇文章主要為大家介紹了Android新建水平節(jié)點(diǎn)進(jìn)度條示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android開發(fā)之Fragment懶加載的幾種方式及性能對比
這篇文章主要介紹了Android開發(fā)之Fragment懶加載的幾種方式及性能對比的相關(guān)資料,具體詳細(xì)介紹需要的小伙伴可以參考下面文章內(nèi)容2022-05-05
Android音頻開發(fā)之音頻采集的實(shí)現(xiàn)示例
本篇文章主要介紹了Android音頻開發(fā)之音頻采集的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04

