Unity3D 調(diào)用Android與IOS的剪貼板

Unity3D剪貼板

最近遇到一個(gè)需要調(diào)用Android與IOS設(shè)備本身剪貼板的需求航徙,就是在Unity中赴捞,要將文本復(fù)制到設(shè)備本身的剪貼板中可很,然后在其他應(yīng)用程序中都能粘貼睛驳。

最開始在網(wǎng)上查到的方式是使用Unity3D本身自帶的TextEditor 類進(jìn)行使用,使用方法如下:

TextEditor te =newTextEditor();te.content =newGUIContent(yourText);te.OnFocus();te.Copy();

期初在電腦上測試時(shí)是可以用的稿械,然而這種到了Android和IOS設(shè)備上卻坑了……完全沒反應(yīng)选泻。在多方查找之下,終無結(jié)果美莫,所以能想到的方法就是在Unity中使用C#調(diào)用Android和IOS自身的接口分別實(shí)現(xiàn)页眯。

ClipboardManager cm =(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);//復(fù)制到剪貼板cm.setText(message);//從剪貼板獲取文本stringtext = cm.getText();

針對Android和IOS雙平臺

Unity3D調(diào)用Android剪貼板

publicclassClipboardTools{publicstaticClipboardManager clipboard =null;// 向剪貼板中添加文本 publicvoidcopyTextToClipboard(finalContext activity,finalString str)throwsException{? ? ? ? clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);? ? ? ? ClipData textCd = ClipData.newPlainText("data", str); ? ? ? ?clipboard.setPrimaryClip(textCd);? ? }// 從剪貼板中獲取文本publicStringgetTextFromClipboard(){if(clipboard !=null&& clipboard.hasPrimaryClip()? ? ? ? && clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {? ? ? ? ? ? ClipData cdText = clipboard.getPrimaryClip();? ? ? ? ? ? ClipData.Item item = cdText.getItemAt(0);returnitem.getText().toString();? ? ? ? }return"null";? ? }}

Android復(fù)制

首先,Android剪貼板的使用要通過從Activity中獲取ClipboardManager 服務(wù)厢呵,然后才能進(jìn)行使用窝撵。在這里我們先定義了一個(gè)靜態(tài)的ClipboardManager 引用:

publicstaticClipboardManager clipboard =null;

原因是當(dāng)Unity3D對Android類(ClipboardTools)的方法掉用完后,可能會被垃圾回收襟铭,所以將ClipboardManager 定義為靜態(tài)才能通過getTextFromClipboard()方法獲取先前存入剪貼板的文本碌奉。

對Android剪貼板類ClipboardManager 的使用是固定的用法。

Android粘貼

做好了復(fù)制寒砖,粘貼模塊就比較簡單了,固定的模式赐劣,博主在此處添加了一些 if 的邏輯判斷,是對剪貼板中內(nèi)容進(jìn)行判斷哩都,如:是否為文本魁兼,是否有內(nèi)容等……但要注意的是,若沒有將ClipboardManager 設(shè)為靜態(tài)漠嵌,則在調(diào)用完復(fù)制方法時(shí)咐汞,ClipboardTools類可能會被垃圾回收盖呼,那么ClipboardManager 的引用會變?yōu)閚ull,從新獲取不太方便化撕,所以博主就將其設(shè)為靜態(tài)了几晤。

Android剪貼板項(xiàng)目導(dǎo)入U(xiǎn)nity3D

在Unity3D中調(diào)用Android的東西,首先要在Unity3D項(xiàng)目中創(chuàng)建好環(huán)境:

1.在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄侯谁。2.在Plugins目錄下創(chuàng)建Android目錄锌仅。3.在Android 目錄下創(chuàng)建bin目錄。4.在bin 目錄下放置你編寫的類的jar包墙贱。

前三步都是創(chuàng)建文件夾就沒什么好說了,從第四步開始贱傀,這里所說的Jar包僅僅是你所寫的那個(gè)類的jar包惨撇,并非整個(gè)Android項(xiàng)目的jar包,使用Eclipse編寫的同學(xué)可以在府寒?魁衙??中將Is Library勾上株搔,就可以直接在Android項(xiàng)目下的bin文件夾下找到打好的Jar包剖淀。

第五步所說的Unity3D的 classes.jar 包,在你的Unity3D安裝目錄下的Editor\Data\PlaybackEngines\androidplayer\development\bin 目錄下纤房,直接將其復(fù)制到你的Unity3D項(xiàng)目的bin 目錄下即可纵隔。

注:有些朋友可能進(jìn)行了第五步后會出現(xiàn)Unity報(bào)錯(cuò),這時(shí)可以先不進(jìn)行第五步看看能不能搞定炮姨,原因可能是因?yàn)榕渲脝栴}捌刮,還待校驗(yàn)……

Unity3D調(diào)用Android類與方法

在Unity3D中對Android類與方法的調(diào)用方法代碼如下:

#ifUNITY_ANDROIDAndroidJavaObject androidObject =newAndroidJavaObject("com.test.ClipboardTools");? ? AndroidJavaObject activity =newAndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");if(activity ==null)return;// 復(fù)制到剪貼板androidObject.Call("copyTextToClipboard", activity, input);// 從剪貼板中獲取文本String text =androidObject.Call("getTextFromClipboard");#endif

首先,或取出先前編寫的Android類的實(shí)例對象:

AndroidJavaObject androidClass = androidClass =newAndroidJavaObject("com.test.ClipboardTools");

要注意的是舒岸,后面的字符串"com.test.ClipboardTools"是你Android項(xiàng)目的<類目錄> + <類名>绅作,這個(gè)不能寫錯(cuò),寫錯(cuò)就無法或取出你要的Android類蛾派。

接著俄认,是獲取Android所需要的Activity對象,也就是Android 項(xiàng)目中 copyTextToClipboard 方法所需要的 Context 參數(shù)洪乍,由于我們的Android類沒有繼承于Activity 類眯杏,而對ClipboardManager 的使用又需要當(dāng)前Android運(yùn)行時(shí)主線程的Activity,所以博主采用的是從 Unity3D 中獲取后傳輸過去典尾。

最后是對ClipboardManager 類的 “復(fù)制”役拴、“獲取”兩個(gè)方法的調(diào)用。

#if UNITY_ANDROID 和 #endif 代表的是在指定的平臺才進(jìn)行編譯钾埂,如此處的 UNITY_ANDROID 代表期間的代碼只在Android平臺才進(jìn)行編譯河闰,若是直接使用科平,則可能在IOS平臺出現(xiàn)編譯異常,因?yàn)镮OS平臺并沒有AndroidJavaObject 這種類的庫文件姜性。

Unity3D調(diào)用IOS剪貼板

使用Unity3D調(diào)用IOS的剪貼板相對容易瞪慧,但是需要在MAC上進(jìn)行編寫測試。

IOS對剪貼板的使用

對IOS平臺的調(diào)用博主采用簡潔的方式部念,讓Unity3D調(diào)用C弃酌,再用C去調(diào)用IOS的方法。先附上兩個(gè)文件的源碼:

Clipboard.h 文件 :

@ interface Clipboard :NSObjectextern"C"{/*? compare the namelist with system processes? */void_copyTextToClipboard(constchar*textList);}@end

Clipboard.mm 文件 :

@implementationClipboard//將文本復(fù)制到IOS剪貼板- (void)objc_copyTextToClipboard : (NSString*)text{UIPasteboard*pasteboard = [UIPasteboardgeneralPasteboard];? ? pasteboard.string = text;}@endextern"C"{staticClipboard *iosClipboard;void_copyTextToClipboard(constchar*textList)? ? {NSString*text = [NSStringstringWithUTF8String: textList] ;if(iosClipboard ==NULL)? ? ? ? {? ? ? ? ? ? iosClipboard = [[Clipboard alloc] init];? ? ? ? }? ? ? ? ? ? ? [iosClipboard objc_copyTextToClipboard: text];? ? }}

.h文件和.mm文件需要放在Unity項(xiàng)目的Assets/Plugins/目錄下的任意目錄下儡炼。

與C相同妓湘,Object-C也是需要一個(gè)頭文件負(fù)責(zé)定義,還有一個(gè)真正編寫內(nèi)容的文件乌询,這個(gè)文件可以有兩種后綴“.m"和”.mm"榜贴,“.m"中只能編寫Object-C代碼,而”.mm"中可以編寫C代碼妹田。

在Clipboard.h中唬党,我們定義了一個(gè)C的方法,在Clipboard.mm中鬼佣,我們實(shí)現(xiàn)了C的方法驶拱,并在其中調(diào)用了IOS的剪貼板功能。代碼挺簡單晶衷,就不進(jìn)行一一解釋了蓝纲。

這里稍微發(fā)下牢騷:博主學(xué)習(xí)過數(shù)種編程語言,自信在學(xué)習(xí)一種新語言時(shí)不會寫至少能看懂房铭,然而Object-C的出現(xiàn)碾碎了博主的現(xiàn)實(shí)驻龟,尼瑪,這方法定義到底是神馬意思缸匪?簡直反人類啊……

Unity3D對IOS類的調(diào)用

Unity3D對IOS的使用倒是比較簡單翁狐,不過也需要進(jìn)行環(huán)境配置:

1.在Untiy3D項(xiàng)目的Assets目錄下創(chuàng)建Plugins目錄。2.在Plugins目錄下創(chuàng)建IOS目錄凌蔬。3.在IOS 目錄下放置".h"文件和".mm"文件露懒。

然后是調(diào)用的C#源碼:

usingUnityEngine;usingSystem.Collections;usingSystem.Runtime.InteropServices;publicclassClipboardManager{#ifUNITY_IPHONE/* Interface to native implementation */[DllImport ("__Internal")]privatestaticexternvoid_copyTextToClipboard(stringtext);#endifpublicstaticvoidCopyToClipboard(stringinput){#ifUNITY_ANDROID// 對Android的調(diào)用#elifUNITY_IPHONE_copyTextToClipboard(input);#endif}}

這是一個(gè)C#類,CopyToClipboard()方法是對剪貼板的應(yīng)用砂心,大家可以看到懈词,在ClipboardManager類里面,定義了這種東西:

#ifUNITY_IPHONE/* Interface to native implementation */[DllImport ("__Internal")]privatestaticexternvoid_copyTextToClipboard(stringtext);#endif

這表示在IOS平臺的編譯上辩诞,會導(dǎo)入Objcet-C編寫的IOS方法坎弯,這是固定的寫法,大概了解即可,不要忘了導(dǎo)入庫文件哦(using System.Runtime.InteropServices;)

在下面抠忘,就可以直接對IOS定義方法的調(diào)用了撩炊,不過博主還是推薦加上以下東西:

#ifUNITY_ANDROID#elifUNITY_IPHONE#endif

以免在跨平臺編譯時(shí)出現(xiàn)問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崎脉,一起剝皮案震驚了整個(gè)濱河市拧咳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囚灼,老刑警劉巖骆膝,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灶体,居然都是意外死亡阅签,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門蝎抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉择,“玉大人,你說我怎么就攤上這事织中。” “怎么了衷戈?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵狭吼,是天一觀的道長。 經(jīng)常有香客問我殖妇,道長刁笙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任谦趣,我火速辦了婚禮疲吸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘前鹅。我一直安慰自己摘悴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布舰绘。 她就那樣靜靜地躺著蹂喻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捂寿。 梳的紋絲不亂的頭發(fā)上口四,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音秦陋,去河邊找鬼蔓彩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赤嚼。 我是一名探鬼主播旷赖,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼探膊!你這毒婦竟也來了杠愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逞壁,失蹤者是張志新(化名)和其女友劉穎流济,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌闯,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳瘟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姿骏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖声。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖分瘦,靈堂內(nèi)的尸體忽然破棺而出蘸泻,到底是詐尸還是另有隱情,我是刑警寧澤嘲玫,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布悦施,位于F島的核電站,受9級特大地震影響去团,放射性物質(zhì)發(fā)生泄漏抡诞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一土陪、第九天 我趴在偏房一處隱蔽的房頂上張望昼汗。 院中可真熱鬧,春花似錦鬼雀、人聲如沸顷窒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋肮。三九已至,卻和暖如春璧疗,著一層夾襖步出監(jiān)牢的瞬間坯辩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工崩侠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漆魔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像改抡,于是被迫代替她去往敵國和親矢炼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,193評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程阿纤,因...
    小菜c閱讀 6,432評論 0 17
  • 陪她一起去了上海句灌、北京。見著日漸慘白的她的臉欠拾,他只能在掩上房門后默默流淚胰锌。他甚至不能明白命運(yùn)的殘酷何以落在她的身上...
    vitors閱讀 343評論 1 1
  • 2015年末,從北京的始發(fā)列車去往哈爾濱… 哈爾濱藐窄,一個(gè)經(jīng)常念叨在口中的城市资昧,她的冬天的姿態(tài)吸引著我,一個(gè)南方的孩...
    熊二不三閱讀 327評論 1 0
  • 我是日記星球133號星寶寶宋翠藍(lán),我正在參加日記星球第3期蛻變之旅刹枉。 原創(chuàng)日記(34)2017.03.22 小雨 ...
    黑金公主閱讀 311評論 0 5