因为unity都是在PC端做开发的,不能直接调用到ios或者android系统的一些类库,一般当unity的应用需要获取或者写入手机的剪贴板这一类的操作时,基本都是通过在xcode或者andriod studio编写好对应的方法类库,然后导入到unity应用工程的plugins文件夹对应的ios或者android文件夹中再进行引用。
以unity获取手机剪贴板信息为例,ios与android获取剪贴板的方法虽然代码不一样,但原理是相同的——都是通过原生代码向底层获取对应剪切板的权限与信息,并进行读取或者写入的操作。
android
安卓端的话需要先在android studio中创建一个空的应用,创建剪切板工具类,最后生成jar包。网上有很多生成jar包的教程,如果对as输出jar包不了解的话可以自行百度一下。
下面附上安卓工具类代码
package com.example.getclipboard;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.ClipboardManager;
import android.content.Context;
public class ClipboardTools {
public static ClipboardManager clipboard = null ;
// 向剪贴板中添加文本
public void copyTextToClipboard(final Context activity, final String str) throws Exception {
clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);
ClipData textCd = ClipData.newPlainText( "data" , str);
clipboard.setPrimaryClip(textCd);
}
// 从剪贴板中获取文本
public String getTextFromClipboard() {
clipboard = (ClipboardManager) activity.getSystemService(Activity.CLIPBOARD_SERVICE);
if (clipboard.hasPrimaryClip()
&& clipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
ClipData cdText = clipboard.getPrimaryClip();
ClipData.Item item = cdText.getItemAt(0);
return item.getText().toString();
}
return "" ;
}
}
将生成的jar用解压软件打开的话,可以看到对应的文件层级格式会对应包结构,基本都是com.xx.xxx.xxxx的格式,这个格式要与我们在unity获取jar的类对应的字符串对应,下面会详细说明。
把生成的jar包放入unity工程根目录下plugins的andriod文件夹下,如果没有的话可自行创建。
在unity中,是通过AndroidJavaObject类来获取生成jar包里面的类,代码如下
#if UNITY_ANDROID
AndroidJavaObject androidObject = new AndroidJavaObject("com.zengqi.clipboardapp.ClipboardTools");
AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
if (activity != null)
{
//获取剪切板
str = androidObject.Call<String>("getTextFromClipboard",activity);
//写入剪切板
androidObject.Call("copyTextToClipboard", activity, str);
}
#endif
上面代码中的com.zengqi.clipboardapp.ClipboardTools这一串的字符串,其中com.zengqi.clipboardapp是指包名,ClipboardTools指剪切板的工具类。下一行的activity是安卓中unity实例化出来的activty,安卓跟unity是通过这个activity进行数据交互。
IOS端
ios端会比安卓方便一点,不需要在xcode上进行操作,只需要在plugins文件夹下的ios文件夹上添加对应的类与头文件即可。
首先在plugins/ios/文件夹下创建对应的.h文件 与.mm文件,这个可以直接用文本文档编写,最后个修改为对应的.h与.mm文件即可。
.h文件
#import <Foundation/Foundation.h>
@ interface Clipboard : NSObject
extern "C"
{
void _copyTextToClipboard(const char *textList);
const char* _GetClipboardText();
}
@end
.mm文件
#import "Clipboard.h"
@implementation Clipboard
- (void)objc_copyTextToClipboard : (NSString*)text
{
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = text;
}
- (NSString*)GetClipboardText
{
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
return pasteboard.string;
}
@end
extern "C" {
static Clipboard *iosClipboard;
char* _MakeStringCopy(const char* str)
{
if(str==NULL){ return NULL;}
char* res=(char*)malloc(strlen(str)+1);
strcpy(res,str);
return res;
}
void _copyTextToClipboard(const char *textList)
{
NSString *text = [NSString stringWithUTF8String: textList] ;
if(iosClipboard == NULL)
{
iosClipboard = [[Clipboard alloc] init];
}
[iosClipboard objc_copyTextToClipboard: text];
}
const char* _GetClipboardText()
{
if(iosClipboard == NULL)
{
iosClipboard = [[Clipboard alloc] init];
}
return _MakeStringCopy([[iosClipboard GetClipboardText] UTF8String]);
}
}
上面两个类创建好后就可以在需要调用 的c#类里面进行引用。
#if UNITY_IPHONE
[DllImport("__Internal")]
private static extern void _copyTextToClipboard(string text);
[DllImport("__Internal")]
private static extern string _GetClipboardText();
#endif
定义好上面的引用后,就可以直接对剪切板的方法进行引用了
#if UNITY_IPHONE
//获取剪切板的内容
_GetClipboardText();
//将字符串写入剪切板
_copyTextToClipboard (input);
#endif