Android6.0系统以下的麦克风权限处理

基本上只在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<String> 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<String> 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<String> 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();
        }
    }



}

这个就是我对6.0以下,语音权限被禁止后,怎么判断权限是被禁止的,然后给出提示。就是判断录音文件大小是否为0.



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值