Unity Android 之 在Unity中直接使用Android的 Toast 功能


一、简单介绍

整理一些在Unity上可以方便调用 Android 方法的一些接口脚本,便于后期开发使用。

调用 Android 的 Toast 功能实现消息文字内容显示。

二、使用说明

1、字符串数据直接调用

"测试 Test_AndroidProcessData".ToastShow();

2、通过类中函数传入字符串数据调用
        AndroidProcessData.ToastStringShow("第二种方式 测试 Test_AndroidProcessData");

三、效果预览

图3-1 Toast 效果预览

四、实现步骤

1、打开Unity,新建一个工程,如下图

图4-1 打开Unity,新建工程

2、在工程中创建脚本,AndroidProcessData 实现调用 Toast 的功能, Test_AndroidProcessData 测试 Toast 的功能,如下图

图4-2 添加脚本

3、把脚本 Test_AndroidProcessData 挂载到场景中,如下图

图4-3 挂载脚本

4、运行场景,测试效果,如下图

图4-4 Toast 测试效果

五、关键代码

1、AndroidProcessData

using UnityEngine;

/// <summary>
/// 调用 Android 一些方法的整理
/// </summary>
public static class AndroidProcessData
{
#if UNITY_ANDROID
    /// <summary>
    /// 调用 Android 的 Toast 功能使用
    /// </summary>
    /// <param name="text">显示的文字信息</param>
    /// <param name="activity">AndroidJavaObject对应着Android里面实例化的对象</param>
    public static void ToastShow(this string text, AndroidJavaObject activity = null)
    {
        Debug.Log(text);
        if (activity == null)
        {
            AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        }
        AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
        AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
        activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", text);
            Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
        }
        ));
    }

    /// <summary>
    /// 第二种方式 Toast 数据
    /// </summary>
    /// <param name="str">数据内容</param>
    public static void ToastStringShow(object str, AndroidJavaObject activity = null)
    {
#if UNITY_ANDROID
        if (activity == null)
        {
            AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        }
      
        AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
        AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
        activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", str.ToString());
            Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
        }
        ));
    }
#endif

    /// <summary>
    /// C# 中的字符串 string 转为 Java 中的 String
    /// </summary>
    /// <param name="CSharpString">C# 中的字符串数据</param>
    /// <returns></returns>
    public static AndroidJavaObject toJavaString(this string CSharpString)
    {
        return new AndroidJavaObject("java.lang.String", CSharpString);
    }
#endif



}
//相关说明
//a.AndroidJavaClass对应着Android里面的Java类,而AndroidJavaObject对应着Android里面实例化的对象。
//b.一定要切记C#里的String和Java的String不是一码事,所以调用Android方法时如果需要传字符串为参数时,不能直接给个字符串,应该给个Java里的String,例如 new AndroidJavaObject("java.lang.String","你想传的字符串");
//c.由于AndroidJavaClass对应的是类,所以一般用之来调用对应的类的静态变量(GetStatic<Type>)或者静态方法(CallStatic<Type>("functionName", param1, param2,....));其中的Type为返回类型,注意是Java的返回类型不是C#的,一般整型和布尔型是通用的,其他的如果不清除可以统一写返回类型为AndroidJavaObject,当然没有返回类型的不需要写Type。
//d.AndroidJavaObject对应的是实例对象,所以用new方法给其初始化时要注意说明其是哪个类的实例对象。再比如刚才那个例子: AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", "字符串的值");



2、Test_AndroidProcessData

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test_AndroidProcessData : MonoBehaviour
{
    AndroidJavaClass UnityPlayer;
    AndroidJavaObject activity;
    // Start is called before the first frame update
    void Start()
    {
        UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        // 调用方式 一
        "测试 Test_AndroidProcessData".ToastShow(activity);
        AndroidProcessData.ToastStringShow("第二种方式 测试 Test_AndroidProcessData", activity);

         // 调用方式 二
        "测试 Test_AndroidProcessData".ToastShow();
        AndroidProcessData.ToastStringShow("第二种方式 测试 Test_AndroidProcessData");
    }

   
}

本文转自 https://blog.csdn.net/u014361280/article/details/104533327,如有侵权,请联系删除。

posted @ 2022-05-28 15:10  yassine  阅读(386)  评论(0编辑  收藏  举报