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

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值