diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/PermissionDescriptionHelper.java b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/PermissionDescriptionHelper.java new file mode 100644 index 00000000..cc83cc6a --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/PermissionDescriptionHelper.java @@ -0,0 +1,129 @@ +package com.xscm.moduleutil.utils; + +import android.Manifest; +import android.graphics.Color; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import com.luck.picture.lib.interfaces.OnPermissionDescriptionListener; +import com.luck.picture.lib.permissions.PermissionConfig; +import com.luck.picture.lib.utils.DensityUtil; +import com.luck.picture.lib.widget.MediumBoldTextView; + +/** + * com.xscm.moduleutil.utils + * qx + * 2025/10/30 + */ +// PermissionDescriptionHelper.java +public class PermissionDescriptionHelper { + private static final String TAG_EXPLAIN_VIEW = "TAG_EXPLAIN_VIEW"; + + public static class PermissionDescriptionListener implements OnPermissionDescriptionListener { + @Override + public void onPermissionDescription(Fragment fragment, String[] permissionArray) { + View rootView = fragment.requireView(); + if (rootView instanceof ViewGroup) { + addPermissionDescription(false, (ViewGroup) rootView, permissionArray); + } + } + + @Override + public void onDismiss(Fragment fragment) { + removePermissionDescription((ViewGroup) fragment.requireView()); + } + } + + public static OnPermissionDescriptionListener createListener() { + return new PermissionDescriptionListener(); + } + + public static void addPermissionDescription(boolean isHasSimpleXCamera, ViewGroup viewGroup, String[] permissionArray) { + int dp10 = DensityUtil.dip2px(viewGroup.getContext(), 10); + int dp15 = DensityUtil.dip2px(viewGroup.getContext(), 15); + MediumBoldTextView view = new MediumBoldTextView(viewGroup.getContext()); + view.setTag(TAG_EXPLAIN_VIEW); + view.setTextSize(14); + view.setTextColor(Color.parseColor("#333333")); + view.setPadding(dp10, dp15, dp10, dp15); + view.setBackgroundColor(Color.WHITE); // 添加背景色确保可见 + + String title; + String explain; + + if (TextUtils.equals(permissionArray[0], PermissionConfig.CAMERA[0])) { + title = "相机权限使用说明"; + explain = "相机权限使用说明\n用户app用于拍照/录视频"; + } else if (TextUtils.equals(permissionArray[0], Manifest.permission.RECORD_AUDIO)) { + if (isHasSimpleXCamera) { + title = "麦克风权限使用说明"; + explain = "麦克风权限使用说明\n用户app用于录视频时采集声音"; + } else { + title = "录音权限使用说明"; + explain = "录音权限使用说明\n用户app用于采集声音"; + } + }else if (TextUtils.equals(permissionArray[0], Manifest.permission.ACCESS_FINE_LOCATION)){ + title = "定位权限"; + explain = "定位权限使用说明\n用户app获取当前位置,方便更好的推荐附近玩乐"; + } + else { + title = "存储权限使用说明"; + explain = "存储权限使用说明\n用户app写入/下载/保存/读取/修改/删除图片、视频、文件等信息"; + } + int startIndex = 0; + int endOf = startIndex + title.length(); + SpannableStringBuilder builder = new SpannableStringBuilder(explain); + builder.setSpan(new AbsoluteSizeSpan(DensityUtil.dip2px(viewGroup.getContext(), 16)), startIndex, endOf, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + builder.setSpan(new ForegroundColorSpan(0xFF333333), startIndex, endOf, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + view.setText(builder); + view.setBackground(ContextCompat.getDrawable(viewGroup.getContext(), com.xscm.moduleutil.R.drawable.ps_demo_permission_desc_bg)); + + // 确保视图可见 + view.setVisibility(View.VISIBLE); + view.setZ(9999); // 提高Z轴确保在最上层 + + if (isHasSimpleXCamera) { + RelativeLayout.LayoutParams layoutParams = + new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + layoutParams.topMargin = DensityUtil.getStatusBarHeight(viewGroup.getContext()); + layoutParams.leftMargin = dp10; + layoutParams.rightMargin = dp10; + viewGroup.addView(view, layoutParams); + } else { + ConstraintLayout.LayoutParams layoutParams = + new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT); + // 修改约束设置,确保视图位置正确 + layoutParams.topToTop = ConstraintSet.PARENT_ID; + layoutParams.leftToLeft = ConstraintSet.PARENT_ID; + layoutParams.rightToRight = ConstraintSet.PARENT_ID; + layoutParams.leftMargin = dp10; + layoutParams.rightMargin = dp10; + layoutParams.topMargin = DensityUtil.dip2px(viewGroup.getContext(), 50); + viewGroup.addView(view, layoutParams); + } + + // 强制刷新布局 + viewGroup.requestLayout(); + viewGroup.postInvalidate(); + } + + public static void removePermissionDescription(ViewGroup viewGroup) { + if (viewGroup != null) { + View tagExplainView = viewGroup.findViewWithTag(TAG_EXPLAIN_VIEW); + if (tagExplainView != null) { + viewGroup.removeView(tagExplainView); + } + } + } + +} +