关于权限的问题,记录一下

最近,在搞智能语音的时候,接触到权限.由于现在android 6的出现,谷

歌对权限做出了一些修改,不像以前只需要在AndroidManifest.xml中简

单声明这些权限就好,app安装时就授权.不需要每次使用时都检查权限,

而且用户不能取消以上授权.修改过后,像麦克风和GPS这样的一些,用户是

可以在安装或运行时选择打开或关闭.这样的话就对我们编程提高了一点

难度.我的方案是这样的:遇到这样的场景时,对权限的状态做一个判断,在进

行操作.

    开始我是这样做的(以语音的权限为例):
String pkgName;
boolean permission;
AudioRecord record = new AudioRecord();
//检查当前权限,拿到当前麦克风的权限状态
ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
//拿到屏幕当前运行APP的包名
if (Build.VERSION.SDK_INT > 20) {
    pkgName =  mActivityManager.getRunningAppProcesses().get(0).processName;
 } else {
     pkgName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
PackageManager pm = mContext.getPackageManager();
permission = (PackageManager.PERMISSION_GRANTED ==                        pm.checkPermission("android.permission.RECORD_AUDIO", pkgName));
if (permission) {
    Toast.makeText(mContext, "麦克风权限打开了", Toast.LENGTH_SHORT).show();
     } else {
    Toast.makeText(mContext, "麦克风权限没有打开", Toast.LENGTH_SHORT).show();
    return;
 }

我这样做了之后,发现这并没有按照我的意愿来.后来才发现其中的原因,我

大概理解为,这个权限有没有在清单文件里面声明,没有对这个权限的状态

进行判断,所以他一直走true;

我又在网上找到一种:

AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC, 22050, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize(22050, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT));
//这句代码,看源码的时候以为是不需要的,被坑了才知道是必须的.原因不明                        
record.startRecording();
if(!(record.getRecordingState()==AudioRecord.RECORDSTATE_STOPPED)){
   //这个同上,还请高人指点
   record.release();
   //权限打开
   Toast.makeText(mContext, "麦克风权限没有打开", Toast.LENGTH_SHORT).show();
   } else{
   //权限关闭
   Toast.makeText(mContext, "麦克风权限没有打开", Toast.LENGTH_SHORT).show();
   return;
}

这样写后,这个问题才算是解决了.

记录一下,加深印象.

你可能感兴趣的:(关于权限的问题,记录一下)