Android 10 限制了對剪貼板數(shù)據(jù)的訪問權(quán)限
除非您的應(yīng)用是默認(rèn)輸入法 (IME) 或是目前處于焦點的應(yīng)用侄榴,否則它無法訪問 Android 10 或更高版本平臺上的剪貼板數(shù)據(jù)棋嘲。
導(dǎo)致問題: ClipboardManager.getPrimaryClip()==null 直接倒是獲取剪切板未空
編譯版本源碼對比版:
解決方案:
- 獲取焦點后再處理剪切板邏輯
1:監(jiān)聽焦點變化再獲取剪切板數(shù)據(jù)
@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;
/**
* 創(chuàng)建:wukuiqing
* <p>
* 時間:2018/4/17
* <p>
* 描述:
*/
public class ClipboardUtil {
private ClipboardUtil() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* 復(fù)制文本到剪貼板
*
* @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;
}
/**
* 復(fù)制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;
}
/**
* 復(fù)制意圖到剪貼板
*
* @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();
}
}
}
}
總結(jié)
Android 10 的剪切板兼容問題處理,簡單記錄一下.
歡迎點贊