# GPS推流（IPC）

## **简单介绍**

X3pro智能眼镜的GPS功能并非由眼镜本身直接获取，而是依赖于与之连接的手机。

在使用过程中，用户需要确保手机已授予对应的位置权限，否则无法获取准确的GPS信息。同时，保持手机与眼镜的稳定连接也至关重要，因为任何连接中断都可能导致GPS数据传输失败。这种设计虽然在一定程度上限制了眼镜的独立性，但借助手机的强大定位能力，能够为用户提供更精准的导航和位置服务，满足日常出行和户外活动的需求。

X2眼镜自带GPS，考虑到稳定性问题，也可以通过以下方式同时获取手机GPS，从而提高数据稳定性及准确性

## **API介绍**

<table data-header-hidden><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td>调用方法</td><td>使用说明</td><td>示例代码</td></tr><tr><td>开启gpsIPC .OpenPhoneGPS()<br></td><td><strong>参数与返回值细节：没有参数，和返回</strong><br><strong>异常场景说明：注意申请如下权限：Android.Permission.FineLocation 和 Android.Permission.CoarseLocation</strong>以及保持手机蓝牙连接<br><strong>调用时机建议：保持手机眼镜眼镜连接状态下，申请对应权限后，进行使用</strong>。</td><td><pre><code>IPC.OpenPhoneGPS();
</code></pre></td></tr><tr><td>监控 gps 状态变化 事件IPC.GpsStateChagneCallBack</td><td><strong>参数与返回值细节：回调函数参数 PhoneGPSResultType 和 对应 string 信息，回调函数没有返回</strong><br><strong>异常场景说明：注意申请如下权限：Android.Permission.FineLocation 和 Android.Permission.CoarseLocation</strong>以及保持手机蓝牙连接<br><strong>调用时机建议：保持手机眼镜眼镜连接状态下，申请对应权限后，进行使用</strong>。</td><td><pre class="language-c#"><code class="lang-c#">IPC.GpsStateChagneCallBack += GPSStateChange
IPC.GpsStateChagneCallBack -= GPSStateChange;

//对应的事件函数示例
private void GPSStateChange(PhoneGPSResultType code, string msg)
{
m\_state = code;
} </code></pre><p><br></p></td></tr><tr><td>获取gps数据IPC.GPSPushCallBack</td><td><strong>参数与返回值细节：回调函数参数 time 时间戳、latitude 纬度、longitude 经度、horizontalAccuracyMeters 水平精确米数，和 对应 AccuracyMeters 精确米数，回调函数没有返回</strong><br><strong>异常场景说明：注意申请如下权限：Android.Permission.FineLocation 和 Android.Permission.CoarseLocation</strong>以及保持手机蓝牙连接<br><strong>调用时机建议：保持手机眼镜眼镜连接状态下，申请对应权限后，进行使用</strong>。</td><td><pre class="language-c#"><code class="lang-c#">IPC.IPC.GPSPushCallBack += GPSMsgPush ;
IPC.IPC.GPSPushCallBack -= GPSMsgPush ;

//对应的事件函数示例
public void GPSMsgPush(long time, double latitude, double longitude, double altitude, double speed,
double horizontalAccuracyMeters, double AccuracyMeters)
{
m\_gpsMsg = time + "," + latitude + "," + longitude + "," + altitude + "," + speed;
m\_state = PhoneGPSResultType.PHONE\_CONNECTED;
} </code></pre><p><br></p></td></tr><tr><td>关闭gpsIPC.ClosePhoneGPS()</td><td><strong>参数与返回值细节：没有参数，和返回</strong><br><strong>异常场景说明：注意申请如下权限：Android.Permission.FineLocation 和 Android.Permission.CoarseLocation</strong>以及保持手机蓝牙连接<br><strong>调用时机建议：保持手机眼镜眼镜连接状态下，申请对应权限后，进行使用</strong>。</td><td><pre class="language-c#"><code class="lang-c#">IPC.ClosePhoneGPS(); </code></pre><p><br></p></td></tr><tr><td>检查蓝牙连接状态见 监控 gps 状态变化 事件</td><td><br></td><td><br></td></tr></tbody></table>

## **构建场景**

搭建好基础环境，并且根据需要导入 Sample 功能能力 Demo 。

![](/files/b06519cc177e8d3a49f081c5bff635639ed0b5f8)

### **1. 新建场景**

新建 Unity3D 工程，取名 GPS

![](/files/c261042c782e96ff1e764ea25abfaace81957cb4)

### **2. 设置 MainCamera**

打开场景，MainCamera 的 ClearFlags 为 SolidColor ，Background 为 黑色

![](/files/aeb07b850823856973ef2c4ba6080adf0d6d0dd2)

### **3. 在场景中添加资源**

鼠标右键，在场景中添加一个 Canvas

![](/files/e07fd56ff94fc9d38d16b7ce07733ff8ac2c609b)

这里可以删除掉多余的 EventSystem

![](/files/3b765a2c7f6d0e0c627d1e6c58f6211b2e272cf8)

把 Canvas 上的 Render Mode 修改为 Screen-Space-Camera，Render Camera 修改为场景中的 MainCamera

![](/files/786e5fc3f69d7daf3c743e7b2240b2b21362ac71)

在 Canvas 下添加 Text ，用来 GPS 数据显示

![](/files/eca15f6e8c292f0fa86ea030002fcf85d3daf190)

在场景中，添加一个 GameObject ，改名为 GPS

![](/files/4c6f46b5902cdd42c91d2fdd203c1d2b5f83d44b)

### **4. 创建一个 GPS 脚本，获取展示 GPS 数据**

创建一个 GPS 脚本

![](/files/f033c42bdb7c3043bbe86ac9b52ba12ccb367033)

在 GPS 脚本，实现获取 GPS 信息相关功能

```c#
using RayNeo.API;
using UnityEngine;
using UnityEngine.UI;

public class GPS : MonoBehaviour
{
    public Text m_gpsInfo;
    private PhoneGPSResultType m_state = PhoneGPSResultType.UNKNOW;
    private string m_gpsMsg;

    // Start is called before the first frame update
    void Start()
    {
        PermissionUtil.TryQueryPermission(UnityEngine.Android.Permission.FineLocation);
        PermissionUtil.TryQueryPermission(UnityEngine.Android.Permission.CoarseLocation);
        IPC.OpenPhoneGPS();
        IPC.GpsStateChagneCallBack += GPSStateChange;
        IPC.GPSPushCallBack += GPSMsgPush;
    }

    private void OnDestroy()
    {
        IPC.ClosePhoneGPS();
    }

    // Update is called once per frame
    void Update()
    {
        if (m_state == PhoneGPSResultType.UNKNOW)
        {
            m_gpsInfo.text = "No GPS Data";
        }
        else
        {
            m_gpsInfo.text = "gps state:" + m_state + "\n" + m_gpsMsg;
        }
    }

    private void GPSStateChange(PhoneGPSResultType code, string msg)
    {
        m_state = code;
    }

    public void GPSMsgPush(long time, double latitude, double longitude, double altitude, double speed,
                           double horizontalAccuracyMeters, double AccuracyMeters)
    {
        m_gpsMsg = $"GPS : \nlongitude={longitude},\naltitude={altitude},\ntime={time},\nlatitude={latitude},\nspeed={speed}"; 
        m_state = PhoneGPSResultType.PHONE_CONNECTED;
    }
}
```

在场景中的 GPS 上添加 GPS 脚本，并把对应的 Text 进行赋值

![](/files/4c858222dacbae91b02aa496bdf910c5c5fd7d9d)

### **5. 添加双击 TP 操控板退出应用功能**

在 Scripts 文件夹（没有自行创建即可）下，创建一个 QuitApp 脚本

![](/files/df19e2e0cc8e77cb2da834bb7aa98c066da4fe13)

双击脚本，打开编辑器，编写双击 TP 退出代码

```c#
using RayNeo;
using UnityEngine;

public class QuitApp : MonoBehaviour
{
    /// <summary>
    /// 退出应用
    /// </summary>
    public void ToQuitApp()
    {
        Application.Quit();
    }

    void Start()
    {
        // 添加双击事件
        SimpleTouchForLite.Instance.OnDoubleTap.AddListener(ToQuitApp);
    }

    private void OnDestroy()
    {
        if (SimpleTouchForLite.SingletonExist)
        {
            // 移除双击事件
            SimpleTouchForLite.Instance.OnDoubleTap.RemoveListener(ToQuitApp);
        }

    }
}
```

把 QuitApp 挂载到 GPS 物体上

![](/files/bd69e3a798e57f786d843f26adff24d6ad7ec6e0)

## **编译运行场景**

### **1. 编译打包 APK**

把 GPS 场景 添加到 Scene In Build 中，点击 Build 进行 打包 APK

![](/files/2a4acb334eac5c4d1c37785c27603f2b0da557da)

### **2. 连接设备**

X3pro 眼镜通过设备线，连接电脑，使用 adb devices ，查看连接的设备

![](/files/495c3477083d472ce3cb376b42cbcde8edb49412)

### **3. 安装应用**

之前编译打包好的应用，使用 adb install xxx.apk 进行安装

![](/files/3e84ed6756421c2722f9333fb32b3d962b70d5e6)

### **4. 查看运行应用**

可以在眼镜上看到刚刚安装的应用

![](/files/5370b92eb2bf5ab0b17c447aca23654e9ea7e564)

单击 TP 操作板，运行应用，简单效果如下

![](/files/93940b286f6cad34da78c73b4c38b83b9d7799ad)

值得注意的是，权限的申请

![](/files/0c3627e084e390dbabe9c629180ce78700c02801)

并保持手机眼镜连接状态


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rayneo.gitbook.io/rayneo-devdoc/x-xi-lie/unity-kai-fa/ji-chu-neng-li-api/gps-tui-liu-ipc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
