Java tutorial
/* * Copyright (c) 2017 ?. All Rights Reserved. * Use of this source code is governed by a Shanghai Unovo Information Technology Co.,Ltd license * that can be found in the LICENSE file in the root of the web site. * * http://www.unovo.com.cn * * An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. * */ package com.unovo.frame.core.permissions; import android.annotation.TargetApi; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import com.unovo.frame.core.action.IAction; import com.unovo.frame.utils.log.Logger; /** * Created by Aeatho on 2017/2/6 16:22 * * Prject: unovo-guest-app * Description: * email: aeatho@gmail.com */ public class PermissionsAction extends IAction implements PermissionsObserver { private PermissionsListener subject; private String permission; private int requestCode; public PermissionsAction(Activity context, IAction parent, PermissionsListener subject, String permission) { super(context, parent); this.subject = subject; this.permission = permission; requestCode = permission.hashCode(); } @Override protected boolean interrupt() { boolean interrupt = super.interrupt(); if (requestCode == 0) { } // SDK23 else if (Build.VERSION.SDK_INT < 23) { } // ?? else if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(getContext(), permission)) { Logger.i("???, permission = %s", permission); } // ??? else if (PackageManager.PERMISSION_DENIED == ContextCompat.checkSelfPermission(getContext(), permission)) { interrupt = true; Logger.i("PERMISSION_DENIED permission = %s", permission); doInterrupt(); } return interrupt; } @Override public void doInterrupt() { // ?????? if (!handlePermissionNone()) { Logger.i("handlePermissionNone(false)"); requestPermission(); } else { Logger.i("handlePermissionNone(true)"); } } /** * ???????? * * @return true:??requestPermission() */ protected boolean handlePermissionNone() { return false; } /** * ?? */ @TargetApi(Build.VERSION_CODES.M) protected void requestPermission() { if (subject != null) { subject.attach(this); } Logger.i("requestPermission(%s)", permission); // XT1562(Motorola) ?? // java.lang.IllegalArgumentException:Wake lock not active: android.os.Binder@3e69cbf from uid 1000 try { getContext().requestPermissions(new String[] { permission }, requestCode); } catch (IllegalArgumentException e) { Logger.e(e); } } /** * ??? * * @param alwaysDenied ???? * @return true: */ protected void onPermissionDenied(boolean alwaysDenied) { } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { Logger.i("onRequestPermissionsResult , requestCode = " + requestCode); if (subject != null) { subject.detach(this); } if (requestCode == this.requestCode) { if (permissions != null && permissions.length > 0 && permission.equals(permissions[0])) { if (grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { run(); return; } } if (ActivityCompat.shouldShowRequestPermissionRationale(getContext(), permission)) { Logger.i("onPermissionDenied(false)"); onPermissionDenied(false); } else { Logger.i("onPermissionDenied(true)"); onPermissionDenied(true); } } } }