Unity使用Android系统剪贴板复制&粘贴

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mseol/article/details/78518754

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");
    }
}

猜你喜欢

转载自blog.csdn.net/mseol/article/details/78518754
今日推荐