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); } } } }