BaseFragment 权限不使用反射

This commit is contained in:
jk 2025-11-20 16:47:24 +08:00
parent ee56f71251
commit df3481c924
14 changed files with 105 additions and 125 deletions

View File

@ -1,18 +1,13 @@
package com.tfq.library.base; package com.tfq.library.base;
import static com.tfq.library.app.BaseConstants.REQUEST_PER; import static com.tfq.library.app.BaseConstants.REQUEST_PER;
import static com.tfq.library.permission.PermissionUtils.convertToIPermissionArray;
import static com.tfq.library.permission.PermissionUtils.showGrantedPermissionsToast;
import android.Manifest;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.LayoutRes; import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -22,12 +17,12 @@ import androidx.fragment.app.Fragment;
import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.XXPermissions; import com.hjq.permissions.XXPermissions;
import com.hjq.permissions.permission.base.IPermission; import com.hjq.permissions.permission.base.IPermission;
import com.tfq.library.utils.LogK; import com.hjq.toast.Toaster;
import com.tfq.library.R;
import com.tfq.library.permission.PermissionConverter;
import com.tfq.library.view.Animation; import com.tfq.library.view.Animation;
import com.tfq.library.view.AuthDialog; import com.tfq.library.view.AuthDialog;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -71,29 +66,22 @@ public abstract class BaseFragment extends Fragment {
/** /**
* 权限请求 * 权限请求
*/ */
protected void requestPermission(String[] per, Listener listener) { protected void requestPermission(IPermission[] per,Listener listener) {
requestPermission(per, content, listener); requestPermission(per, content, listener);
} }
protected void requestPermission(String[] per, String content, Listener listener) { protected void requestPermission(IPermission[] per, String content, Listener listener) {
if (!TextUtils.isEmpty(content)) { if (!TextUtils.isEmpty(content)) {
this.content = content; this.content = content;
} }
requestPermission(per, content, true, false, listener); requestPermission(per, content, true, listener);
} }
protected void requestPermission(String[] per, String content, boolean show_doNotAskAgain, Listener listener) { protected void requestPermission(IPermission[] per, String content, boolean req_permission, Listener listener) {
if (!TextUtils.isEmpty(content)) { if (!TextUtils.isEmpty(content)) {
this.content = content; this.content = content;
} }
requestPermission(per, content, true, show_doNotAskAgain, listener); requestPermission(per, req_permission, listener);
}
protected void requestPermission(String[] per, String content, boolean req_permission, boolean show_doNotAskAgain, Listener listener) {
if (!TextUtils.isEmpty(content)) {
this.content = content;
}
requestPermission(per, req_permission, show_doNotAskAgain, listener);
} }
/** /**
@ -101,33 +89,25 @@ public abstract class BaseFragment extends Fragment {
* *
* @param permission 权限集合 * @param permission 权限集合
* @param req_permission 申请权限之前是否提示默认false不提示 * @param req_permission 申请权限之前是否提示默认false不提示
* @param show_doNotAskAgain 权限申请失败是否调整到设置页,默认false不关闭
* @param listener 监听 * @param listener 监听
*/ */
protected void requestPermission(String[] permission, boolean req_permission, boolean show_doNotAskAgain, Listener listener) { protected void requestPermission(IPermission[] permission, boolean req_permission, Listener listener) {
if (!req_permission) {//不弹窗直接申请权限 if (!req_permission) {//不弹窗直接申请权限
requestPermission(permission, show_doNotAskAgain, listener); requestPermission(permission, null ,listener);
} else {//先弹窗,再去申请 } else {//先弹窗,再去申请
new AuthDialog(getActivity(), REQUEST_PER, new AuthDialog.Listener() { new AuthDialog(getActivity(), REQUEST_PER, new AuthDialog.Listener() {
@Override @Override
public void callBack() { public void callBack() {
//同意申请权限,去申请 //同意申请权限,去申请
requestPermission(permission, show_doNotAskAgain, listener); requestPermission(permission, null ,listener);
} }
}).show(); }).show();
} }
} }
private void requestPermission(String[] permission, boolean show_doNotAskAgain, Listener listener) { private void requestPermission(IPermission[] iPermissions, Object object, Listener listener) {
List<IPermission> iPermissionList = convertToIPermissionArray(permission);
for (int i = 0; i < iPermissionList.size(); i++) {
LogK.e("iPermissionList="+iPermissionList.get(i));
}
if (iPermissionList.isEmpty()){
return;
}
XXPermissions.with(getActivity()) XXPermissions.with(getActivity())
.permissions(iPermissionList) .permissions(iPermissions)
.request(new OnPermissionCallback() { .request(new OnPermissionCallback() {
@Override @Override
public void onResult(@NonNull List<IPermission> grantedList, @NonNull List<IPermission> deniedList) { public void onResult(@NonNull List<IPermission> grantedList, @NonNull List<IPermission> deniedList) {
@ -136,7 +116,7 @@ public abstract class BaseFragment extends Fragment {
return; return;
} }
listener.success(); listener.success();
showGrantedPermissionsToast(requireActivity(),grantedList); showGrantedPermissionsToast(requireActivity(), grantedList);
} }
@ -154,6 +134,11 @@ public abstract class BaseFragment extends Fragment {
}); });
} }
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)));
}
/******************************lifecycle area*****************************************/ /******************************lifecycle area*****************************************/
@Nullable @Nullable
@Override @Override

View File

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

View File

@ -12,10 +12,9 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.hjq.permissions.XXPermissions; import com.hjq.permissions.XXPermissions;
import com.hjq.permissions.permission.base.IPermission; import com.hjq.permissions.permission.PermissionLists;
import com.tfq.demo.R; import com.tfq.demo.R;
import com.tfq.library.base.BaseActivity; import com.tfq.library.base.BaseActivity;
import com.tfq.library.permission.PermissionUtils;
import com.tfq.library.utils.LogK; import com.tfq.library.utils.LogK;
import com.tfq.library.utils.ToasterUtil; import com.tfq.library.utils.ToasterUtil;
@ -82,9 +81,7 @@ public class Activity_Font extends BaseActivity {
selectedScaleIndex(4); selectedScaleIndex(4);
} }
IPermission iPermission = PermissionUtils.invokeGetCachePermission(Manifest.permission.WRITE_SETTINGS); boolean granted = XXPermissions.isGrantedPermission(this, PermissionLists.getWriteSettingsPermission());
assert iPermission != null;
boolean granted = XXPermissions.isGrantedPermission(this, iPermission);
if (!granted) { if (!granted) {
ll_perssion.setVisibility(View.VISIBLE); ll_perssion.setVisibility(View.VISIBLE);
} }
@ -96,9 +93,7 @@ public class Activity_Font extends BaseActivity {
} }
private void onClick(View view) { private void onClick(View view) {
IPermission iPermission = PermissionUtils.invokeGetCachePermission(Manifest.permission.WRITE_SETTINGS); boolean granted = XXPermissions.isGrantedPermission(this, PermissionLists.getWriteSettingsPermission());
assert iPermission != null;
boolean granted = XXPermissions.isGrantedPermission(this, iPermission);
int viewId = view.getId(); int viewId = view.getId();
if (viewId == R.id.iv_back) { if (viewId == R.id.iv_back) {

View File

@ -19,4 +19,7 @@ android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
useLocal=false useLocal=false
# useLocal=false # ???????????? # useLocal=false # ???????????
# 指定Java 17的路径
org.gradle.java.home=C:/Users/123/.jdks/ms-21.0.8

View File

@ -1 +1 @@
304826bd11e9614142ecd6345b5a6680 8484d44231bc0a42d661517b25bcf324

View File

@ -1 +1 @@
0696947ead6e87bacf305f13922505aa927c0932 cbb875fe2eed61f4175f5d06b03701b69e6b0ab9

View File

@ -1 +1 @@
36f3d8b6a99ff5b00a62b0dc0d87b1100a8425c3b3385446998fe7cfe93ac6d1 2115630d449cbe8977ce7d33a093b5e7c0d5342574e78ef4a721a4de41a22a5b

View File

@ -1 +1 @@
4a4c5bb3f49e44b95fc07bee60b9088c295a319b0bf2d868761d11a7d7068c1b6e45c7fc51ed34edbfccb1e43070b0675758f0ad8093f4d824fdf01753b35501 aff9f0a6f957794a8551d622e37b202256d5e24ed3ee14c3be8c500461dc4b2f456dadc7235b83938ed40431413a8e438ed9becc76f39624cf9f9005a16507ec

View File

@ -9,6 +9,6 @@
<version>1.0.0</version> <version>1.0.0</version>
<version>1.0.1</version> <version>1.0.1</version>
</versions> </versions>
<lastUpdated>20251120080338</lastUpdated> <lastUpdated>20251120082435</lastUpdated>
</versioning> </versioning>
</metadata> </metadata>

View File

@ -1 +1 @@
2e9274ee9bfe3ae9684d844f3f5e4f39 c0eb4b622c9b34b5ed5b2a7f35607749

View File

@ -1 +1 @@
383ccc9dc24b76213b99acadc58e972486e84339 5f09b653ebd212a50527b8f7c0090da8a08d53db

View File

@ -1 +1 @@
8cda9377a8fd92e350167b3a6bf85354a2ff3aa3673c09cd522d8f5555eccd9d 9832aa356914d02dbfb6fb17707e35b8907ee1b732decb2e084d6b6ac1fae916

View File

@ -1 +1 @@
e52c69c4171259a8989e2ed833809b696eae3ed2789d5792995592b64d684ba4949ca67d4af3649d00e44770c0b32ed69f60bdd8644e153fc1879419787c891c c6644c0c74578920dbcabc210653858b599728a5fafcfc8d6aa6aa434e7fa1df9091648b8bf625e142acc0ce9ddfc059188c3f81fc683cb4007a604c8592429b