基本上只在Android6.0版本去处理相关的权限。但是,以此,如果6.0以下,5.0或4.0呢,本来只需要在manifest中授权即可的,但是需求是有的手机非要把权限禁止了,然后还让你提示未授权,可以因为6.0以下机型的不同,判断获取的接口不一定好使怎么办。在这儿我只有语音的处理方法。
顺便拿出6.0系统处理权限代码:直接就可以使用。
1,首先在BaseActivity中添加如下代码;
/**
* 授权运行
* @param permissions 需要权限
* @param listener 权限监听
*/
public void requestRunPermission(String[] permissions, PermissionListener listener){
mListener = listener;
List permissionLists = new ArrayList<>();
for(String permission : permissions){
if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
permissionLists.add(permission);
}
}
if(!permissionLists.isEmpty()){
ActivityCompat.requestPermissions(this, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUESTCODE);
}else{
//表示全都授权了
mListener.onGranted();
}
}
/**
* 申请授权处理结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUESTCODE:
try {
if(grantResults.length > 0){
//存放没授权的权限
List deniedPermissions = new ArrayList<>();
for(int i = 0; i < grantResults.length; i++){
int grantResult = grantResults[i];
String permission = permissions[i];
if(grantResult != PackageManager.PERMISSION_GRANTED){
deniedPermissions.add(permission);
}
}
if(deniedPermissions.isEmpty()){
//说明都授权了
mListener.onGranted();
}else{
mListener.onDenied(deniedPermissions);
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
}
2,然后在继承BaseActivity的XXActivity中使用如下方法:(这儿只添加了麦克风权限,可以添加多个权限)
requestRunPermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() {
@Override
public void onGranted() {
//表示所有权限都授权了,这块添加已经获取权限后要执行的方法
}
@Override
public void onDenied(List deniedPermission) {
for (String permission : deniedPermission) {
if (permission.equals("android.permission.RECORD_AUDIO")) {
Toast.makeText(ChatActivity.this, "被拒绝的权限:麦克风权限,如果拒绝将无法正常使用聊天功能", Toast.LENGTH_SHORT).show();
}
}
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
userRefusePermissionsDialog();
}
});
/**
* 用户拒绝了权限申请提醒
*/
private void userRefusePermissionsDialog() {
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
new AlertDialog.Builder(ChatActivity.this)
.setMessage("需要开启权限才能使用此功能,否则无法正常使用")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户到设置中去进行设置
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);
}
})
.setNegativeButton("取消", null)
.create()
.show();
}
通过这两步基本就已经完成了6.0权限的管理和处理,很简单吧。
下面说一下6.0以下语音权限处理方法:个人想法,但是试验是成功的
这个方法就是再语音录好之后,路径是有的,但是文件是空的,只要判断文件大小就知道录音是否成功,
private RecorderUtil recorder = new RecorderUtil();
//特殊处理,如果api小于23,低于安卓6.0即判断是否第一次点击,解决预录bug
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
String path = recorder.getFilePath();//recoder是录音工具实例
File file = new File(path);
try {
FileInputStream inputStream = new FileInputStream(file);
long i = inputStream.getChannel().size();
if (i == 0) {
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
refuseVoicePermissionsDialog();
}else {
//表示所有权限都授权了,这块添加已经获取权限后要执行的方法
}
} catch (Exception e) {
e.printStackTrace();}
}
/**
* 用户拒绝了权限申请提醒
*/
private void refuseVoicePermissionsDialog() {
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
new AlertDialog.Builder(ChatActivity.this)
.setMessage("录音权限被禁止,需要开启权限才能使用此功能,请在授权管理或应用程序管理打开,否则无法正常使用")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户到设置中去进行设置
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);
}
})
.setNegativeButton("取消", null)
.create()
.show();
}
package com.maobang.imsdk.util.media;
import android.media.MediaRecorder;
import android.util.Log;
import com.maobang.imsdk.util.storage.FileUtil;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 录音工具
*/
public class RecorderUtil {
private static final String TAG = "RecorderUtil";
private String mFileName = null;
private MediaRecorder mRecorder = null;
private long startTime;
private long timeInterval;
private boolean isRecording;
public RecorderUtil(){
mFileName = FileUtil.getCacheFilePath("tempAudio");
}
/**
* 开始录音
*/
public void startRecording() {
if (mFileName == null) return;
if (isRecording){
mRecorder.release();
mRecorder = null;
}
//由于权限原因,需要加入异常处理
try {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
startTime = System.currentTimeMillis();
try {
mRecorder.prepare();
mRecorder.start();
isRecording = true;
} catch (Exception e){
Log.e(TAG, "prepare() failed");
}
}catch(RuntimeException e){
//出现异常,starttime置0
startTime = 0;
//做出处理,让语音不发送
Log.e(TAG, "由于权限原因音频录制初始化失败 failed");
}finally {
}
}
/**
* 停止录音
*/
public void stopRecording() {
if (mFileName == null) return;
long stopTime = System.currentTimeMillis();
if(startTime == 0){
//如果开始录制的时间为0 ,说明录制出现问题,最常见的是由于权限引起的问题
startTime = stopTime;
}
timeInterval = stopTime - startTime;
try{
if (timeInterval>1000){
mRecorder.stop();
}
mRecorder.release();
mRecorder = null;
isRecording =false;
}catch (Exception e){
Log.e(TAG, "release() failed");
}
}
/**
* 取消语音
*/
public synchronized void cancelRecording() {
if (mRecorder != null) {
try {
mRecorder.release();
mRecorder = null;
} catch (Exception e) {
e.printStackTrace();
}
File file = new File(mFileName);
file.deleteOnExit();
}
isRecording =false;
}
/**
* 获取录音文件
*/
public byte[] getDate() {
if (mFileName == null) return null;
try{
return readFile(new File(mFileName));
}catch (IOException e){
Log.e(TAG, "read file error" + e);
return null;
}
}
/**
* 获取录音文件地址
*/
public String getFilePath(){
return mFileName;
}
/**
* 获取录音时长,单位秒
*/
public long getTimeInterval() {
return timeInterval/1000;
}
/**
* 将文件转化为byte[]
*
* @param file 输入文件
*/
private static byte[] readFile(File file) throws IOException {
// Open file
RandomAccessFile f = new RandomAccessFile(file, "r");
try {
// Get and check length
long longlength = f.length();
int length = (int) longlength;
if (length != longlength)
throw new IOException("File size >= 2 GB");
// Read file and return data
byte[] data = new byte[length];
f.readFully(data);
return data;
} finally {
f.close();
}
}
}