Unity-Android通信:AndroidJava 使用Unity c#编写Android程序调用任何方法


Unity3d和Android可以直接用c#编写代码调用
今天实现了在Unity3d 中完全用c#调用android java 实现call 对话框的功能;

示例代码如下(可以直接使用):

using UnityEngine;
using System.Collections;
using System;

public class AndroidProxyExample : MonoBehaviour 
{
    private static int dialogCb = 123;

    class CycClickListener : AndroidJavaProxy
    {

        public CycClickListener() : base("android.content.DialogInterface$OnClickListener") { }
        void onClick(AndroidJavaObject dialogInterface, int arg1)
        {

            Debug.Log("ClickListener ---- arg1:"+arg1);
            dialogCb = arg1;
        }
    }

	void OnGUI ()
	{
		if (GUI.Button(new Rect (15, 15, 450, 75), "cd:"+dialogCb.ToString()))
		{
			AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
			
            activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
			{
                AndroidJavaObject builder = new AndroidJavaObject("android.app.AlertDialog$Builder", activity);
                builder.Call<AndroidJavaObject>("setTitle", "cyc title");
                builder.Call<AndroidJavaObject>("setMessage", "cyc this is test dialog msg");
                builder.Call<AndroidJavaObject>("setPositiveButton", "sure:)", new CycClickListener());
                
                AndroidJavaObject dialog = builder.Call<AndroidJavaObject>("create");
                dialog.Call("show");

			}));
		}
	}

运行结果:


总结其中的功能是
Unity提供的主要几个接口分别为
AndroidJavaClass 类
AndroidJavaObject 对象
AndroidJavaRunnable Unity对java.lang.Runnable object的实现
AndroidJavaProxy 接口,用于实现任何java接口;通过invoke调用接口中的方法
AndroidJavaException 继承于Exception的android异常类

有这几个东西,就可以调用实现Android中的任何方法,创建任何类,实现任何功能了。可以丢弃UnityPlayer.UnitySendMessage(GameObject, functionName,params);方法向Unity端发送message了。


需要注意的几个东西:
1.Android的命名规则,函数名都是首字母小写的;onClick(),不是OnClick()方法
2.对于interface,返回的interface只是实现了interface方法的Class, 所以,用AndroidJavaObject接收返回的interface实例
3.在Unity中,所有调用Android UI相关的东西,都要通过activity.runOnUiThead,在UI线程中调用
4.Unity中,实现Android接口,继承AndroidJavaProxy方法,构造方法要实现继承的java接口;其中,java中的接口,直接在继承的类中写(因为AndroidJavaProxy用Invoke的方式调用方法,类似于反射,只需要知道方法名和参数就可以了,并不需要知道这个方法是不是override的)
5.如果调用的方法在logcat中报错,可以查看报错内容,其中需要调用的名称或者接口方法,需要的返回类型都会在错误中:
找不到CycClickListner.onClick(AndroidJavaObject,Int32)方法,其中标明了需要的方法是onClick,方法需要的参数类型分别为AndroidJavaObjec和Int32


原文链接:http://blog.csdn.net/yanchezuo/article/details/52261944

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity调用Android相册可以通过编写本地插件来实现。以下是一种方法: 首先,创建一个Java类作为我们的本地插件。在Android Studio中,创建一个新的Java类文件,并添加以下代码: ```java import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; public class GalleryPlugin { public static void OpenGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/jpeg", "image/png"}); UnityPlayer.currentActivity.startActivityForResult(intent, 1); } } ``` 然后,在Unity中创建一个C#脚本来调用这个本地插件。在脚本中,我们将使用`DllImport`来导入Android库,并定义一个静态方法调用Java类中的方法: ```csharp using System.Runtime.InteropServices; public class AndroidGallery : MonoBehaviour { [DllImport("gallery_plugin")] private static extern void OpenGallery(); public void OpenAndroidGallery() { OpenGallery(); } } ``` 在Unity中创建一个UI按钮,并将其连接到`OpenAndroidGallery`方法。这样,当我们点击按钮时,将调用本地插件的方法。 最后,将生成的Java类文件和C#脚本文件分别放在对应的目录中,并导出到Android项目中。 通过这种方式,我们可以在Unity调用Android相册,并允许用户选择图片。一旦用户选择了图片,可以使用Unity的处理方法进行后续操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

延澈左

小小心意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值