Запустите приложение Google Maps из Unity3D на Android, сразу начав навигацию - PullRequest
1 голос
/ 05 ноября 2019

Для небольшой демонстрации, которую я создаю, я пытаюсь запустить навигацию в Картах Google прямо из приложения Unity3D, просто открыв URL, такой как Application.OpenURL( "https://www.google.com/maps?daddr=Some+Address" );. Хотя это приводит к тому, что приложение Google Maps открывается правильно и дает мне обзор возможных маршрутов, я хотел бы пропустить это и сразу начать навигацию, скажем, используя кратчайший маршрут (или любой маршрут, это действительно не имеет значения),Я подумал, что обычно можно выполнить с помощью Intents , но похоже, что Unity не имеет интерфейса для этого.

Есть ли какой-то другой способ сделать это?

1 Ответ

1 голос
/ 07 ноября 2019

Начиная с версии 2018.3 Unity позволяет добавлять .java файлы в проект Unity, и они компилируются при сборке проигрывателя Android.

1) Скопируйте выходной файл UnityAndroidLocation.java в каталог Активы / Плагины / Android в вашем проекте Unity.

2) Перейдите: [Файл]> [Настройки сборки]> [Настройки игрока]> [Плеер] и скопируйте имя пакета.

3) В обоих классах найдитеи замените "ual.ual.ual" имя пакета на то, которое вы скопировали на шаге 2) .


"UnityAndroidLocation.cs" класс:

using UnityEngine;
public class UnityAndroidLocation : MonoBehaviour
{
#if UNITY_ANDROID || UNITY_EDITOR
    private static AndroidJavaObject plugin = null;
#endif


    // Use this for initialization
    void Awake()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        plugin = new AndroidJavaClass("ual.ual.ual.UnityAndroidLocation").CallStatic<AndroidJavaObject>("instance");
#endif
    }


    /// <summary>
    /// <para>Open Google Map with Specific Adress.</para>
    /// <para>Adress: [City, street]</para>
    /// </summary>
    /// <param name="Adress">Adress.</param>
    public void GoogleMapWithAdress(string Adress)
    {
        plugin.Call("GoogleMapWithAdress", Adress);
    }

    /// <summary>
    /// <para>Open Google Map with Specific Coordinate.</para>
    /// <para>Zoom (integer number 2-23)</para>
    /// </summary>
    /// <param name="latitude">Latitude.</param>
    /// <param name="longitude">Longitude.</param>
    /// <param name="zoom">Zoom.</param>
    public void GoogleMapWithCoordinate(float latitude, float longitude, int zoom)
    {
        plugin.Call("GoogleMapWithCoordinate", latitude, longitude, zoom);
    }
}

"UnityAndroidLocation.java" класс:

package ual.ual.ual;

import android.content.Intent;
import android.net.Uri;
import com.unity3d.player.UnityPlayer;

public class UnityAndroidLocation {
    private static UnityAndroidLocation _instance;

    public UnityAndroidLocation() {
    }

    public void GoogleMapWithAdress(String Adress) {
        String uri = "geo:0,0?q=" + Adress;
        Intent mapIntent = new Intent("android.intent.action.VIEW", Uri.parse(uri));
        UnityPlayer.currentActivity.startActivity(mapIntent);
    }

    public void GoogleMapWithCoordinate(float latitude, float longitude, int zoom) {
        if (zoom < 2) {
            zoom = 2;
        }

        if (zoom > 23) {
            zoom = 23;
        }

        String uri = "geo:" + latitude + "," + longitude + "?z=" + zoom;
        Intent mapIntent = new Intent("android.intent.action.VIEW", Uri.parse(uri));
        UnityPlayer.currentActivity.startActivity(mapIntent);
    }

    public static UnityAndroidLocation instance() {
        if (_instance == null) {
            _instance = new UnityAndroidLocation();
        }

        return _instance;
    }
}

Примечание: например, если имя вашего пакета - "com.my.app", результирующее имя будет выглядеть так:

Класс "UnityAndroidLocation.cs":

plugin = new AndroidJavaClass("com.my.app.UnityAndroidLocation").CallStatic<AndroidJavaObject>("instance");

Класс "UnityAndroidLocation.java":

package com.my.app;

import android.content.Intent;
import android.net.Uri;
import com.unity3d.player.UnityPlayer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...