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

来源:互联网 发布:樱井知香影音先锋 编辑:程序博客网 时间:2024/05/21 14:02

基本上只在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.



1 0
原创粉丝点击