android 应用宝上应用隐私权限声明的处理

场景说明

最近运维同学反馈,在应用宝上传应用审核的时候被打回,原因是用户隐私权限的处理,通知内容如下


android 登录后根据权限隐藏menu 安卓app隐私权限_点击事件

然后查看了一下市面上淘宝等其他应用的样式,发现效果如下所示:


android 登录后根据权限隐藏menu 安卓app隐私权限_android_02

根据上面的内容可知,主要是需要在应用第一次安装的时候,提醒用户隐私权限相关的声明,并且用户可以进入隐私权限界面查看相关隐私内容。

逻辑实现

通过上面的说明,结合市面上常用的实现方式,该功能的流程图如下所示:

android 登录后根据权限隐藏menu 安卓app隐私权限_android_03

由于判断是否是第一次进入和隐私权限界面在大多数的应用中都已经存在,因此本文主要介绍对话框中文本布局的实现。

文本变色

观察上面的淘宝的效果,可以看出,对话框的说明内容中文本区域部分字体变色且可点击,这部分主要是通过SpannableStringBuilder类实现其效果,实现如下:

SpannableStringBuilder spannable = new SpannableStringBuilder(tv_msg.getText());

传入的参数为要处理的文本,要实现文本变色,可通过调用SpannableStringBuilder的setSpan方法来实现:

spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#C89C3C")), 9, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_msg.setText(spannable);

该方法包含四个参数:

  • 第一个参数:要变色文本的颜色
  • 第二个参数:变色文本开始的index
  • 第三个参数:变色文本结束的index
  • 第四个参数:设置变色文本的开始和结束区域范围,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE前后都不包括
文本添加点击事件

接下来,处理文字区域的点击事件,和上面的方法类似,通过ClickableSpan即可添加点击事件,自定义一个类继承ClickableSpan,实现其中的onClick()方法

private class TextClick extends ClickableSpan {
        @Override
        public void onClick(View widget) {
            Log.e("eeee_click", "点击事件处理");
        }

        @Override
        public void updateDrawState(@NonNull TextPaint ds) {
            //添加点击事件,同时修改文本颜色
            ds.setColor(Color.parseColor("#C89C3C"));
        }
    }

然后调用SpannableStringBuilder的setSpan方法设置点击事件:

tv_msg.setMovementMethod(LinkMovementMethod.getInstance());
spannable.setSpan(new TextClick(), 9, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_msg.setText(spannable);

添加点击事件和颜色之后,发现点击后文字后有个背景色,如果要去除这个背景色,只需设置:

tv_msg.setHighlightColor(Color.parseColor("#00ffffff"));
完整代码
private void showSecurityDialog() {
        //TODO 显示提醒对话框
        securityDialog = new Dialog(this, R.style.my_dialog);
        securityDialog.setCancelable(false);//返回键也会屏蔽
        securityDialog.setCanceledOnTouchOutside(false);
        View view = View.inflate(this, R.layout.dialog_activity_sercurity, null);
        TextView tv_msg = view.findViewById(R.id.sercurity_tv_msgnotice);
        TextView tv_cancel = view.findViewById(R.id.sercurity_tv_cancel);
        TextView tv_positive = view.findViewById(R.id.sercurity_tv_positive);
        SpannableStringBuilder spannable = new SpannableStringBuilder(tv_msg.getText());
        spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#C89C3C")), 9, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv_msg.setMovementMethod(LinkMovementMethod.getInstance());
        spannable.setSpan(new TextClick(), 9, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv_msg.setText(spannable);
        tv_msg.setHighlightColor(Color.parseColor("#00ffffff"));

        tv_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                securityDialog.dismiss();
                finish();
            }
        });
        tv_positive.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                securityDialog.dismiss();
                //TODO 进入主界面
            }
        });

        securityDialog.setContentView(view);
        securityDialog.show();
    }

    private class TextClick extends ClickableSpan {
        @Override
        public void onClick(View widget) { //在此处理点击事件
            Log.e("eeee_click", "点击");
            //TODO 点击事件处理
        }

        @Override
        public void updateDrawState(@NonNull TextPaint ds) {
            ds.setColor(Color.parseColor("#C89C3C"));
        }
    }

至此,即可实现类似淘宝的权限声明对话框操作