@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"/>