最近,在搞智能语音的时候,接触到权限.由于现在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;
}
这样写后,这个问题才算是解决了.
记录一下,加深印象.