2025-11-20 14:21:42 +08:00
|
|
|
|
package com.tfq.library.permission;
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
|
|
|
|
|
|
import com.hjq.permissions.permission.base.IPermission;
|
|
|
|
|
|
import com.hjq.toast.Toaster;
|
|
|
|
|
|
import com.tfq.library.R;
|
|
|
|
|
|
|
2025-11-20 15:38:01 +08:00
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
2025-11-20 14:21:42 +08:00
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
|
|
public class PermissionUtils {
|
|
|
|
|
|
|
2025-11-20 15:38:01 +08:00
|
|
|
|
public static IPermission invokeGetCachePermission(String permission) {
|
2025-11-20 14:21:42 +08:00
|
|
|
|
try {
|
2025-11-20 15:38:01 +08:00
|
|
|
|
// 修正1: 使用正确的类名 PermissionUtils
|
2025-11-20 15:44:43 +08:00
|
|
|
|
Class<?> permissionUtilsClass = Class.forName("com.hjq.permissions.permission.PermissionLists");
|
2025-11-20 15:38:01 +08:00
|
|
|
|
// 修正2: 方法只需要一个String参数
|
|
|
|
|
|
Method method = permissionUtilsClass.getDeclaredMethod("getCachePermission", String.class);
|
|
|
|
|
|
// 设置可访问(因为方法是private的)
|
2025-11-20 14:21:42 +08:00
|
|
|
|
method.setAccessible(true);
|
2025-11-20 15:38:01 +08:00
|
|
|
|
// 修正3: 调用时传入null(静态方法)和permission参数
|
2025-11-20 15:06:02 +08:00
|
|
|
|
Object result = method.invoke(null, permission);
|
2025-11-20 14:21:42 +08:00
|
|
|
|
// 处理返回值
|
|
|
|
|
|
if (result instanceof IPermission) {
|
|
|
|
|
|
return (IPermission) result;
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
2025-11-20 15:38:01 +08:00
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
|
|
Log.e("Reflection", "PermissionUtils class not found", e);
|
|
|
|
|
|
} catch (NoSuchMethodException e) {
|
|
|
|
|
|
Log.e("Reflection", "getCachePermission method not found", e);
|
|
|
|
|
|
} catch (IllegalAccessException e) {
|
|
|
|
|
|
Log.e("Reflection", "Illegal access to method", e);
|
|
|
|
|
|
} catch (InvocationTargetException e) {
|
|
|
|
|
|
Log.e("Reflection", "Method invocation failed", e);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
Log.e("Reflection", "Unexpected error", e);
|
2025-11-20 14:21:42 +08:00
|
|
|
|
}
|
2025-11-20 15:38:01 +08:00
|
|
|
|
return null;
|
2025-11-20 14:21:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-20 15:38:01 +08:00
|
|
|
|
public static List<IPermission> convertToIPermissionArray(String[] permissions) {
|
2025-11-20 14:21:42 +08:00
|
|
|
|
// 将String[]转换为List<IPermission>
|
|
|
|
|
|
List<IPermission> permissionList = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
|
|
if (permissions == null || permissions.length == 0) {
|
|
|
|
|
|
return permissionList;
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int i = 0; i < permissions.length; i++) {
|
|
|
|
|
|
String permission = permissions[i];
|
|
|
|
|
|
// 1. 尝试通过反射获取缓存的IPermission
|
2025-11-20 15:38:01 +08:00
|
|
|
|
IPermission cachedPermission = invokeGetCachePermission(permission);
|
2025-11-20 14:21:42 +08:00
|
|
|
|
if (cachedPermission != null) {
|
|
|
|
|
|
permissionList.add(cachedPermission);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return permissionList;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void showGrantedPermissionsToast(Context context, List<IPermission> grantedList) {
|
|
|
|
|
|
Toaster.show(String.format(context.getString(R.string.demo_obtain_permission_success_hint)
|
|
|
|
|
|
, PermissionConverter.getNickNamesByPermissions(context, grantedList)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|