@RequiresApi(Build.VERSION_CODES.M)
public class PermissionActivity extends Activity {private static final String TAG = PermissionActivity.class.getSimpleName();// 需要启动service的intent keypublic static final String KEY_SERVICE_INTENT = "service_intent";public static final String KEY_ACTIVITY_INTENT = "activity_intent";// 权限申请public static final int REQUEST_CODE_PERMISSION = 1024;public static String[] PERMISSIONS_REQUEST = {permission.CAMERA,permission.READ_EXTERNAL_STORAGE,permission.WRITE_EXTERNAL_STORAGE,permission.READ_PHONE_STATE};// service的权限private Intent mServiceIntent;private Intent mActivityIntent;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);BioLog.d(TAG, "onCreate()...");// 获取service IntentIntent intent = getIntent();if (intent != null) {mServiceIntent = intent.getParcelableExtra(KEY_SERVICE_INTENT);mActivityIntent = intent.getParcelableExtra(KEY_ACTIVITY_INTENT);}// 检查权限if (!hasPermissions(this)) {requestPermissions(PERMISSIONS_REQUEST, REQUEST_CODE_PERMISSION);} else {checkAndSettingOverlayPermission();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {BioLog.d(TAG, "onRequestPermissionsResult()...grantResults:" + grantResults.length);if (requestCode == REQUEST_CODE_PERMISSION) {boolean granted = hasPermissions(grantResults);if (granted) { // 授予刷脸,检查overlay权限checkAndSettingOverlayPermission();} else { // 未授予退出刷脸callbackNoPermission();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {BioLog.d(TAG, "onActivityResult()...resultCode:" + resultCode);if (requestCode == REQUEST_CODE_PERMISSION) {if (Settings.canDrawOverlays(this)) {callService();} else { // 未授予权限callbackNoPermission();}} else {super.onActivityResult(requestCode, resultCode, data);finish();}}@Overrideprotected void onDestroy() {BioLog.d(TAG, "onDestroy()...");super.onDestroy();}public static boolean hasPermissions(Context context) {boolean granted = true;for (String permission : PERMISSIONS_REQUEST) {if (PackageManager.PERMISSION_DENIED == context.checkSelfPermission(permission)) {BioLog.w("PERMISSION_DENIED : permission=" + permission);granted = false;break;}}return granted;}private static boolean hasPermissions(int[] grantResults) {boolean granted = true;for (int index = 0; grantResults.length > 0 && index < grantResults.length; index ++) {if (PackageManager.PERMISSION_DENIED == grantResults[index]) {granted = false;break;}}return granted;}/*** overlay权限检查*/private void checkAndSettingOverlayPermission() {BioLog.i(TAG, "checkAndSettingOverlayPermission()...");if (!Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + this.getPackageName()));startActivityForResult(intent, REQUEST_CODE_PERMISSION);// 给用户提示Toast.makeText(this, getString(R.string.request_overlay_permission_note),Toast.LENGTH_SHORT).show();} else {callService();}}private void callService() {try {if (mServiceIntent != null) {BioLog.d(TAG, "mContext.startService(intent=" + mServiceIntent + ") : bundle=" + mServiceIntent.getExtras());this.startService(mServiceIntent);}else if(getIntent().hasExtra(KEY_ACTIVITY_INTENT) && mActivityIntent != null){BioLog.i(TAG, PerfLog.KEY_TAG + "mContext.startActivity(intent=" + mActivityIntent + ") : bundle=" + mActivityIntent.getExtras());startActivity(mActivityIntent);LaunchTimeRecord.recordLaunchPhase1Time();}} catch (Exception e) {BioLog.e(TAG, "failed to start service");}this.finish();}/*** 退出刷脸*/private void callbackNoPermission() {BioLog.i(TAG, "callbackNoPermission()...");SmileObserverData observerData = new SmileObserverData();observerData.action = ZIMResponseCode.ZIM_RESPONSE_CANCEL_BY_USER;observerData.subCode = ZcodeConstants.ZCODE_NO_CAMERA_PERMISSION;observerData.msg = ZcodeConstants.getMessage(ZcodeConstants.ZCODE_NO_CAMERA_PERMISSION);ObserverManager.getInstance().notifyDataChange(observerData);finish();}
}

1、启动主activity时候判断权限并弹PermissionActivity

 intent = new Intent(mContext, BizRemoteConfig.getInstance().needMVPSwitch() ?MVPOrangeActivity.class : OrangeActivity.class);if (!CacheActivityManager.CACHE_ACTIVITY) {intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);}intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P || // api < 23(Settings.canDrawOverlays(mContext) && PermissionActivity.hasPermissions(mContext.getApplicationContext()))) { // 已经授权BioLog.i(TAG, PerfLog.KEY_TAG + "mContext.startActivity(intent=" + intent + ") : bundle=" + intent.getExtras());mContext.startActivity(intent);AlipayLoggerFactory.getSequenceLogger().add(RecordConstants.ENTER_DETECTION_START).submit();LaunchTimeRecord.recordLaunchPhase1Time();} else { // 附屏或者悬浮UI需要在activity申请权限Intent intentToPermissionActivity = new Intent(mContext, PermissionActivity.class);intentToPermissionActivity.putExtra(PermissionActivity.KEY_ACTIVITY_INTENT, intent);intentToPermissionActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);mContext.startActivity(intentToPermissionActivity);}

2、OrangeActivity在onStart时候

mPresentation.setZolozCardEngine(mCardEngine);
if(Build.VERSION.SDK_INT > VERSION_CODES.P){mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
}
mPresentation.show();

3、AndroidManifest.xml中添加

<!--request permission-->
<activityandroid:name="com.alipay.zoloz.zface.orange.PermissionActivity"android:theme="@android:style/Theme.Translucent"/>

创建PermissionActivity请求悬浮窗权限相关推荐

  1. 安卓,悬浮窗权限动态请求

      示例: AndroidManifest.xml中: <!-- 悬浮窗所需权限 --> <uses-permission android:name="android.pe ...

  2. android 悬浮窗权限,Android 悬浮窗权限校验

    悬浮窗权限: 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSI ...

  3. 不用悬浮窗权限弹出全局dialog的解决方法

    如何在application弹出一个全局的dialog? 思路一: 直接在application new dialog执行show方法. 问题,直接在application或服务中new dialog ...

  4. Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了

    机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...

  5. Android越过悬浮窗权限显示悬浮窗

    文/Shawon(简书作者) 原地址 http://www.jianshu.com/p/167fd5f47d5c ,经验证,此方法可以越过大多数手机的悬浮球权限. 但是对MIUI8无效,MIUI8中应 ...

  6. android适配华为m5,2019-05-29 Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了...

    兼容8.0,小米,魅族,华为等难适配机型都可完美适配. 悬浮窗插入接口 在实现悬浮窗之前,我们需要知道通过什么接口,能够将一个控件放入到屏幕中去. Android的界面绘制,都是通过WindowMan ...

  7. 突破小米悬浮窗权限控制--不需要权限的悬浮窗

    突破小米悬浮窗权限控制–不需要权限的悬浮窗 在上一篇文章讲了Android的Toast拓展,在原生Toast基础上对显示时长和显示动画做了二次封装,强化了Toast的部分功能.也分析了对于二次封装的E ...

  8. android检查悬浮窗权限,Android 悬浮窗权限校验

    悬浮窗权限: 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSI ...

  9. android代码开启悬浮窗权限,Android 悬浮窗权限校验(示例代码)

    悬浮窗权限: 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSI ...

最新文章

  1. 【二级java】操作题知识点积累
  2. 【C语言】学习笔记3——字符串
  3. Ptthon学习记录(八)-------list和元组
  4. Python使用struct处理二进制
  5. Serverless Kubernetes 再升级 | 全新的网关能力增强
  6. java进程被kill_定位JAVA进程被kill的原因
  7. Python__正则表达式
  8. python程序双向链表_Python 实现双向链表(图解)
  9. 5.1傅里叶展开,傅里叶级数推导--非常棒
  10. Windows服务器配置与管理-------DHCP服务器搭建与管理
  11. 图片压缩工具ImageOptim
  12. android的Activity采用透明主题
  13. 盛语小智教育机器人是骗人的_盛语小智机器人骗局揭露【是不是真的有效】多久可以见...
  14. XCTF 攻防世界Web题目 mfw
  15. opencv立方体的画法_美术生干货,最详细的立方体透视变化及画法讲解,不看后悔!...
  16. 降采样,过采样,欠采样,子采样,下采样,上采样,你学会了吗?【总结】
  17. jsp开发中cannot resolve taglib with uri的解决方法
  18. linux设备驱动之pci设备的I/O和内存
  19. 自适应动态规划学习笔记(3)
  20. Android融云会话及会话列表的实现

热门文章

  1. mysql序列表,自增序列生成合同编号
  2. java师傅的名人名言
  3. Vmware Centos7 配置静态 ip 和 使宿主机和虚拟机互相 ping 通
  4. matlab awgn矩阵,MATLAB中产生高斯白噪声,涉及到awgn和wgn函数
  5. c语言readline库6,GNU Readline Library编译及简单分析
  6. Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments
  7. 你口口声声说放不下一个人
  8. 软件项目管理习题——软件生命周期
  9. (二)马克飞象Markdown编辑器的使用效果 | 以 马克飞象Markdown编辑器 为例
  10. C++ dlopen使用