1. package com.glandroid.smssender;
  2.  
  3. import android.content.DialogInterface;
  4. import android.content.pm.PackageManager;
  5. import android.os.Build;
  6. import android.support.annotation.NonNull;
  7. import android.support.v4.app.ActivityCompat;
  8. import android.support.v7.app.AlertDialog;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.widget.Toast;
  11.  
  12. /**
  13. * @author Admin
  14. * @version $Rev$
  15. * @des ${TODO}
  16. * @updateAuthor $Author$
  17. * @updateDes ${TODO}
  18. */
  19. public class BaseActivity extends AppCompatActivity {
  20. //**************** Android M Permission (Android 6.0权限控制代码封装)
  21. private int permissionRequestCode = 88;
  22. private PermissionCallback permissionRunnable;
  23.  
  24. public interface PermissionCallback {
  25. void hasPermission();
  26.  
  27. void noPermission();
  28. }
  29.  
  30. /**
  31. * Android M运行时权限请求封装
  32. *
  33. * @param permissionDes 权限描述
  34. * @param runnable 请求权限回调
  35. * @param permissions 请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS
  36. */
  37. public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) {
  38. if (permissions == null || permissions.length == 0)
  39. return;
  40. // this.permissionrequestCode = requestCode;
  41. this.permissionRunnable = runnable;
  42. if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) {
  43. if (permissionRunnable != null) {
  44. permissionRunnable.hasPermission();
  45. permissionRunnable = null;
  46. }
  47. } else {
  48. //permission has not been granted.
  49. requestPermission(permissionDes, permissionRequestCode, permissions);
  50. }
  51.  
  52. }
  53.  
  54. private boolean checkPermissionGranted(String[] permissions) {
  55. boolean flag = true;
  56. for (String p : permissions) {
  57. if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {
  58. flag = false;
  59. break;
  60. }
  61. }
  62. return flag;
  63. }
  64.  
  65. private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) {
  66. if (shouldShowRequestPermissionRationale(permissions)) {
  67. /*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale() 返回 true,应该显示一些为什么需要这个权限的说明
  68. 2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale() 返回 false
  69. 3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale() 返回 false*/
  70. // Provide an additional rationale to the user if the permission was not granted
  71. // and the user would benefit from additional context for the use of the permission.
  72. // For example, if the request has been denied previously.
  73.  
  74. // Snackbar.make(getWindow().getDecorView(), requestName,
  75. // Snackbar.LENGTH_INDEFINITE)
  76. // .setAction(R.string.common_ok, new View.OnClickListener() {
  77. // @Override
  78. // public void onClick(View view) {
  79. // ActivityCompat.requestPermissions(BaseAppCompatActivity.this,
  80. // permissions,
  81. // requestCode);
  82. // }
  83. // })
  84. // .show();
  85. //如果用户之前拒绝过此权限,再提示一次准备授权相关权限
  86. new AlertDialog.Builder(this)
  87. .setTitle("提示")
  88. .setMessage(permissionDes)
  89. .setPositiveButton("授权", new DialogInterface.OnClickListener() {
  90. @Override
  91. public void onClick(DialogInterface dialog, int which) {
  92. ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
  93. }
  94. }).show();
  95.  
  96. } else {
  97. // Contact permissions have not been granted yet. Request them directly.
  98. ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
  99. }
  100. }
  101.  
  102. private boolean shouldShowRequestPermissionRationale(String[] permissions) {
  103. boolean flag = false;
  104. for (String p : permissions) {
  105. if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) {
  106. flag = true;
  107. break;
  108. }
  109. }
  110. return flag;
  111. }
  112.  
  113. /**
  114. * Callback received when a permissions request has been completed.
  115. */
  116. @Override
  117. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
  118. @NonNull int[] grantResults) {
  119. if (requestCode == permissionRequestCode) {
  120. if (verifyPermissions(grantResults)) {
  121. if (permissionRunnable != null) {
  122. permissionRunnable.hasPermission();
  123. permissionRunnable = null;
  124. }
  125. } else {
  126. Toast.makeText(this, "暂无权限执行相关操作!", Toast.LENGTH_SHORT).show();
  127. if (permissionRunnable != null) {
  128. permissionRunnable.noPermission();
  129. permissionRunnable = null;
  130. }
  131. }
  132. } else {
  133. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  134. }
  135.  
  136. }
  137.  
  138. public boolean verifyPermissions(int[] grantResults) {
  139. // At least one result must be checked.
  140. if (grantResults.length < 1) {
  141. return false;
  142. }
  143.  
  144. // Verify that each required permission has been granted, otherwise return false.
  145. for (int result : grantResults) {
  146. if (result != PackageManager.PERMISSION_GRANTED) {
  147. return false;
  148. }
  149. }
  150. return true;
  151. }
  152. //********************** END Android M Permission ****************************************
  153. }

调用:

  1. performCodeWithPermission("发送短信权限", new PermissionCallback() {
  2. @Override
  3. public void hasPermission() {
  4. SmsManager smsManager = SmsManager.getDefault();
  5. smsManager.sendTextMessage(phoneNumber, null, message, null, null);
  6. }
  7.  
  8. @Override
  9. public void noPermission() {
  10.  
  11. }
  12. }, Manifest.permission.SEND_SMS);

BaseActivity的更多相关文章

  1. Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)

      1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...

  2. 实现统一用户体验的BaseActivity

    对一个规模较大的App开发团队来说,保持统一的代码规范是个好的事情,同时,保持统一的用户体验规范也是个好的事情. 当用户进入一个页面时,一般会有以下交互场景:场景1, 初始化loading,页面从se ...

  3. Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)

    1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...

  4. BaseActivity的抽取

    Activity有些公共部分,比如setContentView.Activity管理.初始化操作.联网操作.Activity跳转.关闭当前Activity.保存用户登录信息.读取用户登录信息等. 我们 ...

  5. Android带侧滑菜单和ToolBar的BaseActivity

    写Android的时候,可能有多个界面.在风格统一的软件中,写Activity时会有很多重复.例如我所在软工课程小组的项目:Github链接 ,里面的TaskListActivity和TeacherL ...

  6. android baseActivity

    package newdemo.jeno.designdemo.activitynew; import android.os.Bundle;import android.support.annotat ...

  7. BaseActivity与BaseFragment的封装

    这篇博客主要是从BaseActivity与BaseFragment的封装开始,总结我们在实战开发中关于Fragment的注意事项以及心得体会. 先看以下效果图: 这里模拟的是用户登录模块,你可能会说, ...

  8. 布局共享(列如所有activity拥有相同的布局部分,比如actionbar,在BaseActivity中写入布局)

    有时候界面上会用到统一的布局,比如toolbar,你可能会想到在用到的地方都去加上toobar这样对于程序的开发与维护来说都显得特别麻烦,我们可以将他写在父类中. 首先创建一个BaseActivity ...

  9. BaseActivity的定义——作为所有Activity类的父类

    public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener { prote ...

  10. android应用框架搭建------BaseActivity

    网上有很多介绍BaseActivity的博文,多数是从应用的角度去描述的. 这里,我所介绍的BaseActivity不同,主要从框架搭建的角度去介绍BaseActivity的使用. 先看代码: /** ...

随机推荐

  1. Tomcat启动和请求处理解析

    tomcat是我们经常使用的组件,但是内部是如何运行的呢,我们去一探究竟. 1.tomcat架构 tomcat的整体架构图如下: Tomcat中只有一个Server,一个Server可以有多个Serv ...

  2. java的应用,SVN客户端的安装教程

    1.先注册一个百度云账号,然后打开https://console.bce.baidu.com 这个网站,按照下面的图形点击 !!!!请注意这是要收钱的,但能学习到那用微信打开你的网站也是值得的. 2. ...

  3. SVN版本库备份和恢复

    1.版本库备份 1.1.svnadmin dump方式备份 此方法借助的是Subversion官网推荐的svnadmin dump备份方式,它的优点是比较灵活,既可以进行全量备份又可以进行增量备份,并 ...

  4. easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案

    easy-mock本地部署成功后,迫不及待的想看看是否能正常访问,执行命令 npm run dev 启动项目,访问 127.0.0.1:7300 ,结果郁闷的是报错:EADDRNOTAVAIL 0.0 ...

  5. #.NET# DataGrid显示大量数据——DataGridView虚模式

    要解决的目标:如何让 Datagridview 快速平滑显示大量数据 通常,Winform 下的表格控件是很"低效"的,如 DataGrid 和 DataGridView.造成低效 ...

  6. 深入了解Looper、Handler、Message之间关系

    深入了解Looper.Handler.Message之间关系 前言及简介 上个星期我们整个项目组趁着小假期,驱车去了江门市的台山猛虎峡玩了两个多钟左右极限勇士全程漂流,感觉真得不错,夏天就应该多多玩水 ...

  7. nodejs(四) --- cluster模块详解

    什么是cluster模块,为什么需要cluster模块?  cluster在英文中有集.群的意思. nodejs默认是单进程的,但是对于多核的cpu来说, 单进程显然没有充分利用cpu,所以,node ...

  8. Paths

    Paths 在javax.tools.StandardLocation 枚举类下定义了几个枚举变量,如下: public enum StandardLocation implements Locati ...

  9. Javac的命令(-Xlint)

    在OptionName类中的枚举定义如下: XLINT("-Xlint"), XLINT_CUSTOM("-Xlint:"), -Xlint     Enabl ...

  10. AngularJS国际化配置

    AngularJS国际化配置 下载angular-translate 下载zip包:https://github.com/angular-translate/bower-angular-transla ...