package com.yuyh.library.permission; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.util.Log; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; /** * Created by hupei on 2016/4/26. */ class AcpManager { private static final String TAG = "AcpManager"; private static final int REQUEST_CODE_PERMISSION = 0x38; private static final int REQUEST_CODE_SETTING = 0x39; private Context mContext; private Activity mActivity; private AcpService mService; private AcpOptions mOptions; private AcpListener mCallback; private final List<String> mDeniedPermissions = new LinkedList<>(); private final Set<String> mManifestPermissions = new HashSet<>(1); AcpManager(Context context) { mContext = context; mService = new AcpService(); getManifestPermissions(); } private synchronized void getManifestPermissions() { PackageInfo packageInfo = null; try { packageInfo = mContext.getPackageManager().getPackageInfo( mContext.getPackageName(), PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } if (packageInfo != null) { String[] permissions = packageInfo.requestedPermissions; if (permissions != null) { for (String perm : permissions) { mManifestPermissions.add(perm); } } } } synchronized void request(AcpOptions options, AcpListener acpListener) { mCallback = acpListener; mOptions = options; checkSelfPermission(); } private synchronized void checkSelfPermission() { mDeniedPermissions.clear(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { Log.i(TAG, "Build.VERSION.SDK_INT < Build.VERSION_CODES.M"); mCallback.onGranted(); onDestroy(); return; } String[] permissions = mOptions.getPermissions(); for (String permission : permissions) { //检查申请的权限是否在 AndroidManifest.xml 中 if (mManifestPermissions.contains(permission)) { int checkSelfPermission = mService.checkSelfPermission(mContext, permission); Log.i(TAG, "checkSelfPermission = " + checkSelfPermission); //如果是拒绝状态则装入拒绝集合中 if (checkSelfPermission == PackageManager.PERMISSION_DENIED) { mDeniedPermissions.add(permission); } } } //如果没有一个拒绝是响应同意回调 if (mDeniedPermissions.isEmpty()) { Log.i(TAG, "mDeniedPermissions.isEmpty()"); mCallback.onGranted(); onDestroy(); return; } startAcpActivity(); } private synchronized void startAcpActivity() { Intent intent = new Intent(mContext, AcpActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } synchronized void requestPermissions(Activity activity) { mActivity = activity; boolean shouldShowRational = false; for (String permission : mDeniedPermissions) { shouldShowRational = shouldShowRational || mService.shouldShowRequestPermissionRationale(mActivity, permission); } Log.i(TAG, "shouldShowRational = " + shouldShowRational); String[] permissions = mDeniedPermissions.toArray(new String[mDeniedPermissions.size()]); if (shouldShowRational) showRationalDialog(permissions); else requestPermissions(permissions); } private synchronized void showRationalDialog(final String[] permissions) { new AlertDialog.Builder(mActivity) .setMessage(mOptions.getRationalMessage()) .setPositiveButton(mOptions.getRationalBtnText(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(permissions); } }).show(); } private synchronized void requestPermissions(String[] permissions) { mService.requestPermissions(mActivity, permissions, REQUEST_CODE_PERMISSION); } synchronized void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_PERMISSION: LinkedList<String> grantedPermissions = new LinkedList<>(); LinkedList<String> deniedPermissions = new LinkedList<>(); for (int i = 0; i < permissions.length; i++) { String permission = permissions[i]; if (grantResults[i] == PackageManager.PERMISSION_GRANTED) grantedPermissions.add(permission); else deniedPermissions.add(permission); } if (!grantedPermissions.isEmpty() && deniedPermissions.isEmpty()) { mCallback.onGranted(); onDestroy(); } else if (!deniedPermissions.isEmpty()) showDeniedDialog(deniedPermissions); break; } } private synchronized void showDeniedDialog(final List<String> permissions) { new AlertDialog.Builder(mActivity) .setMessage(mOptions.getDeniedMessage()) .setCancelable(false) .setNegativeButton(mOptions.getDeniedCloseBtn(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { mCallback.onDenied(permissions); onDestroy(); } }) .setPositiveButton(mOptions.getDeniedSettingBtn(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startSetting(); } }).show(); } /** * 摧毁本库的 AcpActivity */ private void onDestroy() { if (mActivity != null) mActivity.finish(); } /** * 跳转到设置界面 */ private void startSetting() { if (MiuiOs.isMIUI()) { Intent intent = MiuiOs.getSettingIntent(mActivity); if (MiuiOs.isIntentAvailable(mActivity, intent)) { mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); } } else { try { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) .setData(Uri.parse("package:" + mActivity.getPackageName())); mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); } catch (ActivityNotFoundException e) { e.printStackTrace(); try { Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING); } catch (Exception e1) { e1.printStackTrace(); } } } } synchronized void onActivityResult(int requestCode, int resultCode, Intent data) { if (mCallback == null || mOptions == null || requestCode != REQUEST_CODE_SETTING) { onDestroy(); return; } checkSelfPermission(); } }