Unity获取移动端的剪贴板和写入剪贴板操作

        因为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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值