admin管理员组

文章数量:1291260

 

Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法)

 

目录

Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法)

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

aar 方法 Android 端

aar法 /不用aar法  Unity 端

六、关键代码


 

一、简单介绍

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

本节介绍,在Unity 的 Android 开发中,应用需求打开外部浏览器,并指定打开某个网页的功能;这里调用Android封装的方法,介绍两种方法,一种是使用aar进行封装,另一种是不用封装aar的方法;

 

二、实现原理

1、Uri.parse(url)

2、new Intent(Intent.ACTION_VIEW, uri)

3、startActivity(intent)

4、涉及Unity Android 交互的知识

 

三、注意事项

1、不管是 aar 还是不用 aar,调用的都是 Android 统一的接口,哪种方便哪种便于理解,就用哪种方法吧,仅供参考

 

四、效果预览

 

五、实现步骤

aar 方法 Android 端

1、打开Android Studio,新建一个Android Library

 

2、新建一个类,编写代码,实现调用打开网址网页浏览器的方法

 

3、编译对应 aar 包

 

4、指定位置就可以找到 aar 了

 

aar法 /不用aar法  Unity 端

1、打开Unity,新建一个空工程

 

2、把aar 导入工程中

 

3、在场景中,添加两个Button ,分别打开浏览器的不同方法

 

4、编写脚本,实现两种方法打开浏览器

 

5、把 测试脚本挂载到场景中,并对应赋值

 

6、打包,运行效果如上图

 

六、关键代码

1、BrowserWrapper

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

public class BrowserWrapper : MonoSingleton<BrowserWrapper>
{

    public void OpenBrowserWithAAR(string url)
    {
        if (Application.platform == RuntimePlatform.Android)
        {

            Debug.Log(GetType()+ "/OpenBrowserWithAAR()/");

            Debug.Log(GetType() + MAndroidJavaObject.Call<string>("OpenBrowser",url));


        }
    }

    public void OpenBrowserWithNoAAR(string url)
    {
        if (Application.platform == RuntimePlatform.Android)
        {

            Debug.Log(GetType() + "/OpenBrowserWithNoAAR()/");

            AndroidJavaObject uri = new AndroidJavaObject("android.Uri").CallStatic<AndroidJavaObject>("parse", url);
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", "android.intent.action.VIEW", uri);
            GetActivity().Call("startActivity", intent);


            /*

            Android 端代码 对应解析

            Uri uri = Uri.parse(url);
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);

             */

       

        }
    }


    #region 私有变量

    AndroidJavaObject _mAndroidJavaObject;

    public AndroidJavaObject MAndroidJavaObject
    {
        get
        {
            if (_mAndroidJavaObject == null)
            {
                _mAndroidJavaObject = new AndroidJavaObject("com.example.xan.openbrowser.BrowserUtil");
            }

            return _mAndroidJavaObject;
        }
    }


    #endregion

    #region 获取Unity Activity



    private static string unityPlayerClass = "com.unity3d.player.UnityPlayer";
    public static AndroidJavaObject GetActivity()
    {
        AndroidJavaClass jc = new AndroidJavaClass(unityPlayerClass);
        if (jc == null)
        {
            Debug.LogErrorFormat("Failed to get Unity Player class, {0}", unityPlayerClass);
            return null;
        }
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        if (activity == null)
        {
            Debug.LogError("Failed to obtain Android Activity from Unity Player class.");
            return null;
        }
        return activity;
    }

    #endregion
}

 

2、TestBrowserWrapper

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

public class TestBrowserWrapper : MonoBehaviour
{
    public Button AARButton;
    public Button NoARRButton;

    // Start is called before the first frame update
    void Start()
    {
        AARButton.onClick.AddListener(()=> {
            BrowserWrapper.Instance.OpenBrowserWithAAR("http://www.baidu");
        });

        NoARRButton.onClick.AddListener(() => {
            BrowserWrapper.Instance.OpenBrowserWithNoAAR("http://www.baidu");
        });
    }

   
}

 

3、MonoSingleton

using UnityEngine;

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance = null;

    private static readonly object locker = new object();

    private static bool bAppQuitting;

    public static T Instance
    {
        get
        {
            if (bAppQuitting)
            {
                instance = null;
                return instance;
            }

            lock (locker)
            {
                if (instance == null)
                {
                    // 保证场景中只有一个 单例
                    T[] managers = Object.FindObjectsOfType(typeof(T)) as T[];
                    if (managers.Length != 0)
                    {
                        if (managers.Length == 1)
                        {
                            instance = managers[0];
                            instance.gameObject.name = typeof(T).Name;
                            return instance;
                        }
                        else
                        {
                            Debug.LogError("Class " + typeof(T).Name + " exists multiple times in violation of singleton pattern. Destroying all copies");
                            foreach (T manager in managers)
                            {
                                Destroy(manager.gameObject);
                            }
                        }
                    }


                    var singleton = new GameObject();
                    instance = singleton.AddComponent<T>();
                    singleton.name = "(singleton)" + typeof(T);
                    singleton.hideFlags = HideFlags.None;
                    DontDestroyOnLoad(singleton);

                }
                instance.hideFlags = HideFlags.None;
                return instance;
            }
        }
    }

    protected virtual void Awake()
    {
        bAppQuitting = false;

        
    }

    protected virtual void OnDestroy()
    {
        bAppQuitting = true;
    }
}

 

本文标签: 方法两种网页浏览器手机Android