Files
yusheng-android/BaseModule/src/main/java/com/xscm/moduleutil/utils/ProcessFragment.java
2025-11-07 09:22:39 +08:00

176 lines
5.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<String, Boolean> 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<String, Boolean> 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();
}
}
}
}