日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Clipboard还能玩出花

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Clipboard还能玩出花 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Clipboard是Android提供的一個系統服務,它提供了一個全局的剪貼板,讓文字、圖片、數據,在多App間共享成為可能,今天,我們來了解下它的真面目,以及被玩壞的新姿勢。

老規矩,Google API文檔鎮樓:
https://developer.android.com/guide/topics/text/copy-paste.html

說實話,如果不是為了讓Clipboard玩出花,我真不想寫這一篇,因為——這文檔寫的真是太TM詳細了。

Clipboard應用

我們先來看看一些App對Clipboard的應用,例如手機迅雷,如果你復制了一個鏈接,那么打開迅雷后,會自動檢測并提示下載:

再例如一些翻譯軟件,例如有道詞典、滬江小D,他們都有一個功能,即復制查詞,使用的也是這個原理,我這沒裝這些App,就不截圖了,再例如比較常用的手淘喵口令,實際上也是利用這個功能,當然,也有一些比較專業的Clipboard App,例如Clipboard Actions:

我們可以看見,實際上,他就是幫你解析了各種可能的剪貼板,并對他們提供了各種后續功能的集合,確實非常實用,不過,看完今天的文章,相信你要寫一個這樣的App,估計也就分分鐘。

OK,這些就是一些Clipboard的基本使用場景,更多場景,沒有做不到,只有想不到。

基本使用

Clipboard的基本使用,就是三部曲。

獲得ClipboardManager:

ClipboardManager mClipboardManager = mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Copy:

ClipData mClipData; String text = "hello world"; mClipData = ClipData.newPlainText("test", text); mClipboardManager.setPrimaryClip(mClipData);

Paste:

ClipData clipData = mClipboardManager.getPrimaryClip(); ClipData.Item item = clipData.getItemAt(0); String text = item.getText().toString();

結束了,簡直不能再簡單,API文檔也寫的非常詳細,Demo都寫了好幾個。

不止于文字

我們可以創建以下三種類型的ClipData:

類型描述
Text newPlainText(label, text)返回ClipData對象,其中ClipData.Item對象包含一個String
URI newUri(resolver, label, URI)返回ClipData對象,其中ClipData.Item對象包含一個URI
Intent newIntent(label, intent)返回ClipData對象,其中ClipData.Item對象包含一個Intent

對應的,我們也能獲取到不同類型的ClipData。

ClipboardManager管理

ClipboardManager中有很多判斷與操作方法:

類型描述
getPrimaryClip()返回剪貼板上的當前Copy內容
getPrimaryClipDescription()返回剪貼板上的當前Copy的說明
hasPrimaryClip()如果當前剪貼板上存在Copy返回True
setPrimaryClip(ClipData clip)設置剪貼板上的當前Copy
setText(CharSequence text)設置文本到當前Copy
getText()獲取剪貼板復制的文本

玩出一朵小FaFa

在了解了上面這些內容后,我們就可以做一些比較有意思的東西了,例如,我們可以通過監控用戶剪貼板中的內容,來做一些自動的推斷,例如,用戶復制了一個英文單詞,那么我們可以推斷,用戶可能要進行翻譯,再例如,用戶復制了一個鏈接,那么我們也可以推斷,用戶可能需要打開這個鏈接,等等。

Google在文檔中,直接給出了示例的代碼:

// Examines the item on the clipboard. If getText() does not return null, the clip item contains the // text. Assumes that this application can only handle one item at a time.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);// Gets the clipboard as text. pasteData = item.getText();// If the string contains data, then the paste operation is done if (pasteData != null) {return;// The clipboard does not contain text. If it contains a URI, attempts to get data from it } else {Uri pasteUri = item.getUri();// If the URI contains something, try to get text from itif (pasteUri != null) {// calls a routine to resolve the URI and get data from it. This routine is not// presented here.pasteData = resolveUri(Uri);return;} else {// Something is wrong. The MIME type was plain text, but the clipboard does not contain either// text or a Uri. Report an error.Log.e("Clipboard contains an invalid data type");return;} }

其實非常簡單,就是判斷三種復制類型,但是我們可以在App中設置一些類似Scheme的標記,用來進行一些功能的區分,就好像淘寶的喵口令——『喵口令XXXXXXX喵口令』,我們可以通過解析這些Scheme,來獲取內容,并進行對應的操作。這也是我們前面提到的Clipboard Actions這個App做的事情。

玩出一朵大FaFa

我們首先來看ClipData.Item.coerceToText()這樣一個方法,這個方法可以將剪貼板里面的內容,直接轉化為文字,但是這個轉換,是有一定算法的,在API文檔中有比較詳細的說明,這里簡單的看下:

這個東西能干什么呢,我們知道,有些App會復制之后,打開一個Intent,為了簡單,會直接通過ClipData.Item.coerceToText()來返回一個Intent的URI,然后通過解析URI來啟動Intent,那么這里就可以被我們來利用了。

public void fakeClipboard() {// 添加一個假的Intent,模擬用戶最新加入的剪貼板內容Intent intent = new Intent();intent.setComponent(new ComponentName("com.hjwordgames", "com.hjwordgames.Splash"));intent.setAction("android.intent.action.VIEW");ClipData setClipData;setClipData = ClipData.newIntent("intent", intent);mClipboardManager.setPrimaryClip(setClipData);// 呵呵噠 App以為獲取的是自己需要的Intent,結果卻被貍貓換太子ClipData clipData = mClipboardManager.getPrimaryClip();ClipData.Item myItem;myItem = clipData.getItemAt(0);String clipDataString = myItem.coerceToText(this.getApplicationContext()).toString();try {Intent myIntent = Intent.parseUri(clipDataString, 0);startActivity(myIntent);} catch (URISyntaxException e) {e.printStackTrace();} }

其實不一定是通過Fake Intent,其它的文字、圖片等等,都可以被『偷天換日』。

另外,要實現這個監聽,我們需要注冊一個回調——addPrimaryClipChangedListener,Android真是體貼到沒朋友:

mClipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {@Overridepublic void onPrimaryClipChanged() {Log.d("xys", "onPrimaryClipChanged: ");} });

那么在這里,我們就可以完全實現剪貼板的『貍貓換太子』。那么假如我們是一個『某淘』軟件的競品,那么完全可以讓『汪口令』失效,甚至替換為我們自己的應用,同理,還有一些翻譯類軟件也是一樣,不過還好,也許是我的內心比較陰暗,目前還沒有看見這樣的App。

歡迎大家關注我的公眾號:

總結

以上是生活随笔為你收集整理的Clipboard还能玩出花的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。