android 6.0以上权限

android 6.0以上权限,我是通过PermissionsDispatcher进行申请,操作的,具体使用方法,见PermissionsDispatcher,Android 6.0运行时权限详解

@RuntimePermissions

public class SplashActivity extends BaseCompatActivity

....

@TargetApi(Build.VERSION_CODES.M)

private void requestPermission()

{

//申请权限

SplashActivityPermissionsDispatcher.doNeedsPermissionWithCheck(this);

}

//6.0权限控制

@NeedsPermission({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})

void doNeedsPermission()

{

toLogin();

}

/**

* 权限请求回调,提示用户之后,用户点击“允许”或者“拒绝”之后调用此方法

*

* @param requestCode 定义的权限编码

* @param permissions 权限名称

* @param grantResults 允许/拒绝

*/

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

{

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

SplashActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);

}

@OnShowRationale({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})

void showRationale(PermissionRequest request)

{

request.proceed(); // 提示用户权限使用的对话框

}

/**

* 如果用户拒绝该权限执行的方法

*/

@OnPermissionDenied({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})

void onPermissionDenied()

{

toLogin();

}

@OnNeverAskAgain({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})

void onNeverAskAgain()

{

toLogin();

}

6.0以下权限

6.0以下,检测权限的方法,只要Manifest.xml有注册这个权限,那么就返回true在网上找了很多检测权限的方法,最后证明都无效

现在把有效的方法说一下,SystemUtils类

判断相机权限

//Android6.0以下的摄像头权限处理:

public static boolean isCameraCanUse() {

boolean canUse = true;

Camera mCamera = null;

try {

mCamera = Camera.open();

// setParameters 是针对魅族MX5 做的。MX5 通过Camera.open() 拿到的Camera

Camera.Parameters mParameters = mCamera.getParameters();

mCamera.setParameters(mParameters);

} catch (Exception e) {

canUse = false;

}

if (mCamera != null) {

mCamera.release();

}

return canUse;

}

判断麦克风权限

/**

* 判断是是否有录音权限

*/

public static boolean isHasPermission(final Context context)

{

// 音频获取源

int audioSource = MediaRecorder.AudioSource.MIC;

// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025

int sampleRateInHz = 44100;

// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道

int channelConfig = AudioFormat.CHANNEL_IN_STEREO;

// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持

int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

// 缓冲区字节大小

int bufferSizeInBytes = 0;

bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

//开始录制音频

try

{

// 防止某些手机崩溃

audioRecord.startRecording();

}

catch (IllegalStateException e)

{

e.printStackTrace();

}

/**

* 根据开始录音判断是否有录音权限

*/

if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING)

{

return false;

}

//根据录音长度判断

byte[] bytes = new byte[1024];

int readSize = audioRecord.read(bytes, 0, 1024); //至于为什么写1024 我也不知道

if (readSize == AudioRecord.ERROR_INVALID_OPERATION || readSize <= 0)

{

return false;

}

//如果短时间内频繁检测,会造成audioRecord还未销毁完成,此时检测会返回RECORDSTATE_STOPPED状态,再去read,会读到0的size,所以此时默认权限通过

if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED)

{

return true;

}

audioRecord.stop();

audioRecord.release();//释放资源

audioRecord = null;

return true;

}

电话权限,即使关闭了,还是能拨打电话,只能说通过try-catch尝试进行判断,如果不想这么麻烦,可以使用不需要权限的拨打电话的方法

Intent intent = new Intent();

intent.setAction(Intent.ACTION_DIAL);

intent.setData(Uri.parse("tel:" + mobile));

context.startActivity(intent);

定位权限,关闭权限以后,还是可以定位,参照百度地图,高德地图,微信,qq,所以如果通过关闭定位权限,不让app定位,这个恐怕不行,只有关闭gps或者网络才可以不让定位

/**

* 手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能

*/

public static boolean isLocServiceEnable(Activity context)

{

LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (gps || network)

{

return true;

}

return false;

}

权限判断使用

通过动态申请的方法,用户可以关闭权限,或者点击不再询问,这样在用到权限的操作的时候,可能会崩溃,这个要在操作之前,进行一些权限检测,这个要分6.0以上和6.0以下的情况

//6.0以上检测某个权限是否已申请

public static boolean checkPermission(Context mContexts, String permissionName)

{

PackageManager pm = mContexts.getPackageManager();

boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(permissionName, getPackageInfo(mContexts).packageName));

return permission;

}

自定义一个dialog,作为提示

public static void showPermissionDialog(Activity activity, String info)

{

final NoticeDialog noticeDialog = new NoticeDialog(activity);

noticeDialog.setTvSureContentVisible(true);

noticeDialog.setBottomButtonLayoutVisible(false);

noticeDialog.setNoticeContent(info + "权限已关闭,请您去手机设置中开启。");

noticeDialog.setSureButtonText("确定");

noticeDialog.setSureListener(new View.OnClickListener()

{

@Override

public void onClick(View v)

{

noticeDialog.dismiss();

}

});

noticeDialog.showAtLocation(activity.getWindow().getDecorView(), Gravity.CENTER, 0, 0);

}

封装一个检测是否有麦克风权限的方法

public static boolean isHasRecordPermission(Activity activity)

{

boolean hasPermission = true;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

{

if (!checkPermission(activity, "android.permission.RECORD_AUDIO"))

{

hasPermission = false;

}

}

else

{

if (!isHasPermission(activity))

{

hasPermission = false;

}

}

return hasPermission;

}

使用方法:

相机权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if(!SystemUtils.checkPermission(ChooseFamilyMemberActivity.this,"android.permission.CAMERA")

){

SystemUtils. showPermissionDialog(ChooseFamilyMemberActivity.this,"相机");

return;

}

}else{

if (!SystemUtils.isCameraCanUse())

{//针对6.0以下

SystemUtils. showPermissionDialog(ChooseFamilyMemberActivity.this,"相机");

return;

}

}

定位权限

if(!SystemUtils.checkPermission(context,"android.permission.ACCESS_FINE_LOCATION")

||!SystemUtils.checkPermission(context,"android.permission.ACCESS_COARSE_LOCATION")){

SystemUtils.showPermissionDialog(context,"位置");

return;

}

if(!SystemUtils.isLocServiceEnable(context)){

final NoticeDialog noticeDialog = new NoticeDialog(context);

noticeDialog.setTitleVisible(true);

noticeDialog.setTitle("提示");

noticeDialog.setNoticeContent("定位不可用,请打开gps或者网络");

noticeDialog.setBottomButtonLayoutVisible(false);

noticeDialog.setTvSureContentVisible(true);

noticeDialog.setSureButtonText("确定");

noticeDialog.setSureListener(new View.OnClickListener()

{

@Override

public void onClick(View v)

{

noticeDialog.dismiss();

}

});

noticeDialog.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER, 0, 0);

return;

}

麦克风权限

if (!SystemUtils.isHasRecordPermission(activity))

{

SystemUtils.showPermissionDialog(activity, "麦克风");

return;

}

参考资料

Android6.0权限机制(三):6.0以前国产手机权限处理

android6.0麦克风权限,android 6.0权限检测以及6.0以下,麦克风、相机权限判断相关推荐

  1. android 4.0 电话录音,ANDROID音频系统散记之四:4.0音频系统HAL初探

    昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...

  2. android 几个麦克风,在Android中同时在多个应用中使用麦克风

    我们有一个Android设备,我们希望microphone同时使用2应用程序. 实际上,我们有一个在后台运行的声音命令服务(我们正在使用该CMU Sphinx库).问题是当我们启动录像机(相机应用程序 ...

  3. Android项目的targetSDK=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题...

    相信大家对Android6.0以上的动态权限已经有所了解,很多童鞋也已经跃跃欲试地将自己项目的targetSDK升级到了23及其以上,很不幸的是我也成为了其中一员,然而我还是图样图森破了,升级之后的问 ...

  4. 获取权限android sync,GitHub - AndSync/XPermissionUtils: 可能是最精简的Android6.0运行时权限处理方式,支持Rationale提示...

    # XPermissionUtils 可能是最精简的Android6.0运行时权限处理方式,支持Rationale提示,只有一个类,100行代码,所有弹窗等操作由用户自行处理,在Demo中也有提供代码 ...

  5. Android踩坑日记:android7.0动态相机权限

    前提: 项目中使用的动态权限开源库github:https://github.com/yanzhenjie/AndPermission. 转载必须注明本文转自严振杰的博客:http://blog.cs ...

  6. 这可能是最精简的Android6.0运行时权限处理,百行代码的工具类,支持Rationale,附:各种权限详细处理

    0x00:前言 对于Android6.0运行时权限的处理方式网上有很多,包括注解,RxJava等等.一直没有正面提到我关心的问题–如果我不在Activity或者Fragment里面,需要运行时权限该怎 ...

  7. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  8. Android程序报错:Anroid 6.0 权限问题java.io.FileNotFoundException: ……:open failed: EACCES (Permission denied)

    异常 java.io.FileNotFoundException: /storage/emulated/0/Video/ekwing_main_paren.apk(你的文件路径): open fail ...

  9. Android6.0以下系统判断相机权限

    参考博文 http://blog.csdn.net/jm_beizi/article/details/51728495 关于Android权限检测问题 在6.0系统以后由于使用的是动态权限 很好判断 ...

最新文章

  1. Transformer也能生成图像
  2. 关于Oracle full outer join 的bug问题分析及处理
  3. Javascript一(变量,数据类型,正则表达式,数据,语句)
  4. Zepto源码分析-架构
  5. SAP 物料主数据屏幕增强
  6. xsd java引用_web.xml文件的 xsd引用(或dtd引用)学习
  7. Tomcat源代码阅读系列之八:Tomcat 设计模式总结
  8. 北京点击科技有限公司董事长兼总裁——王志东经典语录2
  9. 03_MySQL多表事务课堂笔记
  10. linux下tomcat脚本,Linux下重启多个 tomcat 服务的脚本(推荐)
  11. linux dhcp 负载均衡,dhcp双机负载均衡
  12. 解决ios上微信无法捕获返回键按钮事件的问题
  13. 初识 asp.net mvc(二)
  14. 单片机技术应用实训考核,AT89S52单片机应用教学,QY-KC20
  15. Hive split()、explode()和lateral view 应用单列,多列炸裂
  16. 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(一)
  17. 网络性能指标及测试方法
  18. while循环练习题-检测输入数据中奇数和偶数的个数
  19. 三菱伺服电机编码器故障判断方法
  20. STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计

热门文章

  1. [UOJ55]紫荆花之恋
  2. 浏览器保存密码后自动填充问题
  3. 在.net中Regex(正则)的应用
  4. C++ Primer 学习笔记(第四章:表达式)
  5. puppet cert maintain
  6. ORACLE分页SQL语句
  7. 极客新闻——06、刘润:给年轻人的10条工作建议
  8. Java 实现 SSH 协议的客户端登录认证方式
  9. 从零到一编码实现Redis分布式锁
  10. 企业架构的过去、现在与未来