创建PermissionActivity请求悬浮窗权限

@RequiresApi(Build.VERSION_CODES.M)
public class PermissionActivity extends Activity {
    private static final String TAG = PermissionActivity.class.getSimpleName();

    // 需要启动service的intent key
    public 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;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BioLog.d(TAG, "onCreate()...");
        // 获取service Intent
        Intent 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();
        }
    }

    @Override
    public 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);
    }

    @Override
    protected 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();
        }
    }

    @Override
    protected 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-->
<activity
    android:name="com.alipay.zoloz.zface.orange.PermissionActivity"
    android:theme="@android:style/Theme.Translucent"/>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值