Unity3d开发的移动应用,默认只有在InputField输入文本时,可以调用系统剪贴板。如果有类似选中某个文本,复制其中内容的需求,就要使用原生插件来提供这个方法了。如:
开发原生插件的流程应该已经有很多教程了,这个不再重复,直接贴Java代码。
1. Java代码
package com.company.product;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.ClipData;
//import com.unity3d.player.UnityPlayer;
//import com.unity3d.player.UnityPlayerActivity;
public class NativePlugin extends Fragment //注意,这里继承的是Fragment。要具体理解可以了解下 Android Activity 的层级结构
{
private static final String TAG = "Plugin";
private static NativePlugin Instance = null;
private String gameObjectName;
public static NativePlugin GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new NativePlugin();
Instance.gameObjectName = gameObject;
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
//拷贝String到剪贴板
public void onClickCopy(String str) {
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", str); //Label是任意文字标签
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
}
//粘贴
public String onClickPaste(){
ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
String result = "";
ClipData clipData = cm.getPrimaryClip();
//result = cm.toString(); //ClipData{ text/plain "Label"{T:"str"}}; //取出的是ClipData
//result = cm.getText().toString(); //"str" //方法deprecated
ClipData.Item item = clipData.getItemAt(0); //这里获取第一条,也可以用遍历获取任意条
CharSequence charSequence = item.coerceToText(getActivity().getApplicationContext());
result = charSequence.toString();
return result;
}
}
2. 因为没有继承Activity,编译输出后,只需要拷贝*.jar包到Unity工程下/Plugins/Android/libs,不需要AndroidManifeset。
3. C#代码,分别去Call() Java Code中的两个方法。
public class AndroidImpl : MonoBehaviour
{
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.company.product.MyPluginClass"); //和java代码包名统一
jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name); //Main Camera
}
public void OnCopy()
{
jo.Call("onClickCopy", m_clipInputField.text);
}
public void OnPaste()
{
clipText.text = jo.Call<string>("onClickPaste");
}
}