Android Java开发中设置剪贴板后hasPrimaryClip返回false如何解决?
解决方案
适配Android 10及以上剪贴板权限限制
Android 10(API 级别 29)开始引入了剪贴板访问限制:只有应用处于前台、且当前Activity已经获取到输入焦点时,才能正常调用hasPrimaryClip()、getPrimaryClip()读取剪贴板内容。
如果你的读取逻辑是在onCreate()、onStart()这类Activity未完成渲染、未获取输入焦点的生命周期阶段执行,就会出现hasPrimaryClip()返回false的问题,可将读取逻辑迁移到onWindowFocusChanged()回调中执行:@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard.hasPrimaryClip()) { // 此处即可正常读取剪贴板内容 } } }统一使用Activity Context获取剪贴板服务
尽量不要用ApplicationContext获取CLIPBOARD_SERVICE,ApplicationContext的生命周期和Activity不绑定,在部分系统版本上会导致剪贴板访问权限校验异常,直接用当前Activity的Context获取服务即可:// 不要使用getApplicationContext(),直接用当前Activity的Context ClipboardManager clipboard = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);特殊机型适配
部分国产ROM对剪贴板做了额外的权限控制,需要确认应用的「读取剪贴板」权限已经在系统设置中开启,可在应用中增加权限申请引导,提示用户开启对应权限。
内容的提问来源于stack exchange,提问作者Mahesh Gouda
相关产品推荐
相关产品推荐

