# 剪贴板权限请求弹窗频繁

#### 问题现象

应用在正常使用过程中，频繁弹出请求剪贴板访问权限的弹窗，包含以下两种现象：

1.  用户拒绝授予剪贴板权限，依旧反复弹出授权弹窗。
2.  对于任意剪贴板内容进行频繁请求访问。

#### 背景知识

剪贴板服务：提供管理系统剪贴板的能力，支持系统复制、粘贴功能。系统剪贴板支持对文本、HTML、URI、Want、PixelMap等内容的操作。

1.  申请访问剪贴板权限：系统为提升用户隐私安全保护能力，剪贴板读取接口增加权限管控。
    *   使用安全控件访问剪贴板内容：无需申请权限，使用了安全控件的应用无需做任何适配就可以访问剪贴板内容。
    *   申请ohos.permission.READ\_PASTEBOARD权限访问剪贴板内容：使用自定义控件的应用可以通过申请ohos.permission.READ\_PASTEBOARD权限，在用户授权的场景下访问剪贴板内容。
        
        查看ohos.permission.READ\_PASTEBOARD介绍，审视应用是否符合申请该权限的使用场景。
        
        在AGC侧申请Profile文件，将用于后续的应用签名信息配置。
        
        在module.json5配置文件中声明权限。
        
        通过弹窗向用户申请权限，对于用户误操作未授予权限，可以二次向用户申请授权或者跳转设置的方式完成授权操作。
        
2.  使用剪贴板进行复制粘贴：@ohos.pasteboard (剪贴板)为开发者提供数据的复制粘贴能力。当需要使用复制粘贴等功能时，例如：复制文字内容到备忘录中粘贴，复制图库照片到文件管理粘贴，就可以通过剪贴板来完成。
3.  使用Web组件与系统剪贴板交互处理网页内容：开发者能够通过Web组件和系统剪贴板进行交互，实现各种类型数据的复制和粘贴。支持通过菜单、键盘快捷键以及W3C剪贴板接口对网页内容执行剪切、复制和粘贴操作。

#### 问题定位

根据授权弹窗样式判断重复弹窗属于系统授权弹窗或者自定义弹窗。

1.  对于系统授权弹窗，根据ohos.permission.READ\_PASTEBOARD介绍分析场景是否合理，以及权限是否为必选项。以位置权限授权弹窗样式为例，前者调用接口为requestPermissionsFromUser()，如果用户拒绝授权，将无法再次拉起弹框。后者为requestPermissionOnSetting()，如果用户在首次弹窗授权时已授权，调用当前接口将无法拉起弹窗。
2.  对于自定义弹窗，可参考@ohos.pasteboard (剪贴板)相关API进行检索，排查弹窗的触发条件与时机是否正确，如检测剪贴板内容，达到直达对应页面的效果。搜索getSystemPasteboard接口，查看获取系统剪贴板对象后是否进行合理逻辑判断，再弹窗提醒用户是否访问。

#### 分析结论

#### 场景一

应用申请剪贴板的权限的场景不合理，且用户拒绝授权后频繁通过requestPermissionOnSetting()二次申请等方式申请剪贴板权限。

#### 场景二

自定义申请访问剪贴板内容的弹窗，由于触发弹窗条件与时机不正确导致频繁弹窗。以检测剪贴板内容直达相应页面的场景为例，仅使用hasData判断剪贴板是否有数据，或者仅通过hasDataType判断是否有支持处理的数据类型，则直接触发申请访问剪贴板内容的弹窗，显然是不合理的。

#### 修改建议

#### 场景一

参考ohos.permission.READ\_PASTEBOARD中场景介绍，合理通过弹窗向用户申请权限，推荐用户主动触发。对于非必须剪贴板权限的业务场景，避免频繁发起申请。

#### 场景二

应用申请剪贴板权限需要提前判断剪贴板上的内容是否包含所需数据，避免出现无效弹框。

1.  使用hasData判断剪贴板是否有数据，无数据则不访问剪贴板。
2.  使用hasDataType/getMimeTypes判断是否包含应用当前场景支持处理的数据类型，如果没有对应的数据类型，则不访问剪贴板。
3.  使用getChangeCount（API 18以上）获取剪贴板的内容变化次数，与上次读取剪贴板时查询的变化次数比较是否一致，一致则剪贴板内容无变化，不访问剪贴板。
4.  使用detectPatterns判断是否包含应用自身口令的格式，如果格式不匹配，则不访问剪贴板。应用读取口令后如果确认是自身的口令，建议使用cleardata清除剪贴板口令内容。