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
 * <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 的剪切板兼容問題處理,簡單記錄一下.

歡迎點贊

參考:

1:Android 10 中的隱私權變更

2:andoridQ獲取剪切板內容,當復制內容到剪切板,應用從后臺切換到前臺,無法獲取剪切板內容問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容