package com.xscm.moduleutil.utils; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.blankj.utilcode.util.ToastUtils; import com.xscm.moduleutil.R; import com.xscm.moduleutil.base.CommonAppContext; import com.xscm.moduleutil.widget.CommonAppConfig; import java.util.LinkedHashMap; import java.util.Map; /** * Created by cxf on 2018/9/29. * 处理 检查权限和 startActivityForResult 的回调的Fragment */ public class ProcessFragment extends Fragment { private Context mContext; private PermissionCallback mPermissionCallback; private ActivityResultCallback mActivityResultCallback; private LinkedHashMap mMap; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getActivity(); } /** * 申请权限 */ public void requestPermissions(PermissionCallback callback, String... permissions) { if (callback == null || permissions == null || permissions.length == 0) { return; } boolean isAllGranted = true; if (mMap == null) { mMap = new LinkedHashMap<>(); } else { mMap.clear(); } for (String permission : permissions) { boolean isGranted = ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED; mMap.put(permission, isGranted); if (!isGranted) { isAllGranted = false; } } if (isAllGranted) { callback.onAllGranted(); callback.onResult(mMap); mPermissionCallback = null; } else { mPermissionCallback = callback; requestPermissions(permissions, 0); } } /** * 申请权限结果 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { boolean isAllGranted = true; if (mMap == null) { mMap = new LinkedHashMap<>(); } else { mMap.clear(); } for (int i = 0, len = grantResults.length; i < len; i++) { boolean isGranted = grantResults[i] == PackageManager.PERMISSION_GRANTED; mMap.put(permissions[i], isGranted); if (!isGranted) { isAllGranted = false; } } if (isAllGranted) { if (mPermissionCallback != null) { mPermissionCallback.onAllGranted(); } } else { showTip(); } if (mPermissionCallback != null) { mPermissionCallback.onResult(mMap); } mPermissionCallback = null; } /** * 拒绝某项权限时候的提示 */ private void showTip() { if (mMap == null && mMap.size() == 0) { return; } StringBuilder sb = new StringBuilder(); for (Map.Entry entry : mMap.entrySet()) { if (!entry.getValue()) { switch (entry.getKey()) { case Manifest.permission.READ_EXTERNAL_STORAGE: case Manifest.permission.WRITE_EXTERNAL_STORAGE: String permissionStorage = WordUtil.getString(R.string.permission_storage); if (sb.indexOf(permissionStorage) < 0) { sb.append(permissionStorage); sb.append(","); } break; case Manifest.permission.CAMERA: sb.append(WordUtil.getString(R.string.permission_camera)); sb.append(","); break; case Manifest.permission.RECORD_AUDIO: sb.append(WordUtil.getString(R.string.permission_record_audio)); sb.append(","); break; case Manifest.permission.ACCESS_COARSE_LOCATION: sb.append(WordUtil.getString(R.string.permission_location)); sb.append(","); CommonAppConfig.getInstance().clearLocationInfo(); break; case Manifest.permission.READ_PHONE_STATE: sb.append(WordUtil.getString(R.string.permission_read_phone_state)); sb.append(","); break; } } } String s = sb.toString(); if (!TextUtils.isEmpty(s) && s.length() > 1) { s = s.substring(0, s.length() - 1); } final String tip = String.format(WordUtil.getString(R.string.permission_refused), s); CommonAppContext.postDelayed(new Runnable() { @Override public void run() { ToastUtils.showShort(tip); } }, 300); } public void startActivityForResult(Intent intent, ActivityResultCallback callback) { mActivityResultCallback = callback; super.startActivityForResult(intent, 0); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (mActivityResultCallback != null) { mActivityResultCallback.onResult(resultCode, data); if (resultCode == -1) {//RESULT_OK mActivityResultCallback.onSuccess(data); } else { mActivityResultCallback.onFailure(); } } } }