Android 获取剪切板为空,高版本兼容

Android 10 限制了对剪贴板数据的访问权限

除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则它无法访问 Android 10 或更高版本平台上的剪贴板数据。

image.png

导致问题: ClipboardManager.getPrimaryClip()==null 直接倒是获取剪切板未空

编译版本源码对比版:


29

30

解决方案:

  1. 获取焦点后再处理剪切板逻辑

1:监听焦点变化再获取剪切板数据
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            //获取剪切板文字逻辑写到这里。
        }
    }


2:重写 onResume() 方法然后延时获取剪切板

  protected void onResume() {
    super.onResume();
    //延时获取
}

2: 获取剪切板代码

package xxx

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

/**
 * 创建:wukuiqing
 * 

* 时间:2018/4/17 *

* 描述: */ public class ClipboardUtil { private ClipboardUtil() { throw new UnsupportedOperationException("u can't instantiate me..."); } /** * 复制文本到剪贴板 * * @param text 文本 */ public static void copyText(Context context,final CharSequence text) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newPlainText("text", text)); } /** * 获取剪贴板的文本 * * @return 剪贴板的文本 */ public static String getText(Context context) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = clipboard.getPrimaryClip(); if (clip != null && clip.getItemCount() > 0) { return clip.getItemAt(0).coerceToText(context).toString(); } return null; } /** * 复制uri到剪贴板 * * @param uri uri */ public static void copyUri(Context context,final Uri uri) { ClipboardManager clipboard = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newUri(context.getContentResolver(), "uri", uri)); } /** * 获取剪贴板的uri * * @return 剪贴板的uri */ public static Uri getUri(Context context) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = clipboard.getPrimaryClip(); if (clip != null && clip.getItemCount() > 0) { return clip.getItemAt(0).getUri(); } return null; } /** * 复制意图到剪贴板 * * @param intent 意图 */ public static void copyIntent(Context context,final Intent intent) { ClipboardManager clipboard = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newIntent("intent", intent)); } /** * 获取剪贴板的意图 * * @return 剪贴板的意图 */ public static Intent getIntent(Context context) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = clipboard.getPrimaryClip(); if (clip != null && clip.getItemCount() > 0) { return clip.getItemAt(0).getIntent(); } return null; } /** * 清空剪切板第一条 * @param context * @return */ public static void clearFirstClipboard(Context context) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = clipboard.getPrimaryClip(); if (clip != null && clip.getItemCount() > 0) { clipboard.setPrimaryClip(ClipData.newPlainText(null, "")); if (clipboard.hasPrimaryClip()) { clipboard.getPrimaryClip().getItemAt(0).getText(); } } } }

总结

Android 10 的剪切板兼容问题处理,简单记录一下.

欢迎点赞

参考:

1:Android 10 中的隐私权变更

2:andoridQ获取剪切板内容,当复制内容到剪切板,应用从后台切换到前台,无法获取剪切板内容问题

你可能感兴趣的:(Android 获取剪切板为空,高版本兼容)