Android 10以及以上版本限制了对剪贴板数据的访问
除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则它无法访问 Android 10 或更高版本平台上的剪贴板数据。
导致问题: ClipboardManager.getPrimaryClip()==null 直接倒是获取剪切板未空
编译版本源码对比版:
解决方案:
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
* <p>
* 时间:2018/4/17
* <p>
* 描述:
*/
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 的剪切板兼容问题处理,简单记录一下.