CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Even Realities アプリ用GitHubリポジトリをビルドして、アプリとG2の接続まで試してみた

前回紹介したEven Realities G2ですが、個人的に最も関心が高いのはアプリ開発です。

G2向けSDKの公開が近いうちに予定されていますが、調べてみるとG1のときにGitHubリポジトリがあったようです。

Even RealitiesのDiscordをみてみると、それをForkしている人もいました。

discord.com

そこで、今回はG1向け公式リポジトリ「EvenDemoApp」を使ってビルドしてみました。

その結果、以下がわかりました。

  • このリポジトリはスマホアプリ (ios/android) 開発向け
  • G1とペアリングできるアプリは1つだけ
  • つまり、オリジナルアプリ-G1のペアを作る前に、公式アプリ-G1のペアリングを削除する必要がある

試したところ、iOS/Androidでのビルド、および各アプリからG2の認識はできました。しかし、アプリからメッセージを送るなどはできませんでした。

せっかくなので、ビルド方法を書いておきます。


1/22追記

この記事に書いてある内容ではビルドまでしかできないので、こちらの記事をご覧ください。

www.crossroad-tech.com

G2と連動できるスマートフォンアプリのリポジトリはこちらです。(適宜更新予定)

github.com


今回の環境
- Mac OS Tahoe 26.2
- iPhone 15 Pro (iOS 26.2)
- Nothing Phone 3a (Android 16)

  • Xcode 26.01
  • Android Studio 2025.2
  • Flutter 3.38.6

1. Even Realitiesはサンプルアプリを公開している。しかし、構築方法や使い方の詳細が書かれていない

こちらが公開されているリポジトリです。
github.com

しかし、Readmeを読んでいただくとわかりますが、これが何で、どうするとビルドできるか、どのように使えばよいのかは何も書いていません。通信プロトコルの詳細仕様は書いてあります。

似たようなことはRedditでも指摘されています。

Readme on that repo is quite interesting - it doesn't seem to be related to the demo app at all - instead it contains unsorted bits of notes about the G1 protocol (valuable bit of information).
そのリポジトリの Readme は非常に興味深いものです。デモ アプリとはまったく関係がないようですが、代わりに G1 プロトコルに関する未整理のメモが含まれています (貴重な情報です)。

https://www.reddit.com/r/EvenRealities/comments/1ivh0zl/making_custom_apps_for_even_realities_g1/

そこで、Even RealitiesのDiscordを読んでいくと、このリポジトリをforkした人のReadmeに少し手順らしきものが書いてありました。

github.com

このReadmeの説明でFlutterを使っていることがわかり、Flutterの基本的な情報を色々調べたところ、ビルドの手順がわかりました。

補足:上記のリポジトリは cp .env.example .env とあるのですが、そもそも.gitIgnoreで.env*で除外されているので.env.exampleが存在せず、初手からつまづいたので追えていません。

2. 環境構築

2.1 公式リポジトリをダウンロードしFlutterで環境構築

リポジトリはこのような構成です。

Repository of Even Demo app

手順はタイトルの通りです。これはFlutterを使ったプロジェクトなので、まずはFlutterの環境構築をします。

こちらのFlutter公式サイト?に手順がありました。

Install Flutter

[1] Visual Studio CodeのExtensionとして導入

こちらをインストールします。
marketplace.visualstudio.com

[2] Visual Studio Codeから新規プロジェクトを初回作成する

cmd(ctrl)+shift+pでコマンドパレットを出して、flutter new projectを実行します。Download SDK?というメッセージが出るのでyesを押します。

SDK相当のbinファイルなどを保存するディレクトリを聞かれます。これはDocumentsフォルダなどどこでもよいです。あとでPATHを通すためです。

[3] PATHを通す

Macの場合、~/.zshrcファイルを開いてこのように書きます。 (Documents/Flutter_SDKというフォルダに作った場合)

export PATH="$HOME/Documents/Flutter_SDK/flutter/bin:$PATH"

その後以下を実行して、flutterコマンドが実行できることを確認します。

$ source ~/.zshrc
$ flutter --version
flutter --version
Flutter 3.38.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 8b87286849 (4 days ago) • 2026-01-08 10:49:17 -0800
Engine • hash 6f3039bf7c3cb5306513c75092822d4d94716003 (revision 78fc3012e4) (4
days ago) • 2026-01-07 18:42:12.000Z
Tools • Dart 3.10.7 • DevTools 2.51.1

2.2 flutter pub getを実行して、依存関係解決、必要なパッケージをダウンロード

ダウンロードしたリポジトリのトップディレクトリで以下を実行します。

$ flutter pub get

これで、pubspec.yamlに書かれたパッケージの依存関係解決、ダウンロードが行われます。

2.3.1 (iOSの場合) iosフォルダでコマンド実行してからXcodeを開いてビルド

このようなコマンドを実行します。

$ cd ios
$ flutter precache --ios  
$ pod install  

その後、iosフォルダを指定してXcodeで開きます。あとは一般的なビルド手順でビルドしてiPhone実機にデプロイします。

2.3.2 (Androidの場合) androidフォルダをAndroid Studioで開いてからビルド

こちらは記述が古いためなのか、そのままではビルドが通らなかったので以下を直しました。

Android Studio内蔵のGemini No cost tierで確認しています。

◾️setting.gradleの8.1.0を8.1.1にする

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version "8.1.1" apply false  
    id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}

◾️FlutterToastPlugin.kt

冒頭の下記をコメントアウト

//import io.flutter.plugin.common.PluginRegistry.Registrar  

この後直すMethodCallHandlerImplの引数変更に合わせて修正

private fun setupChannel(messenger: BinaryMessenger, context: Context, binding: FlutterPlugin.FlutterPluginBinding){
    channel = MethodChannel(messenger, "PonnamKarthik/fluttertoast",)
    val handler = MethodCallHandlerImpl(context,binding)
    channel?.setMethodCallHandler(handler,)
}

◾️MethodCallHandlerImpl.kt

冒頭の下記をコメントアウト

//import io.flutter.view.FlutterMain

◾️fontAssetのif文3箇所を以下のように修正

if (fontAsset != null) {
  val key = flutterPluginBinding.flutterAssets.getAssetFilePathByName(fontAsset)
  textView.typeface = Typeface.createFromAsset(context.assets, key);
}

これでビルドして実機で確認できました。

3. 動作確認結果

使い方ですが、公式アプリとG2の接続を切った状態で、今回デプロイしたアプリを開き、画面冒頭の「Not Installed」ボタンをタップします。

すると、そばにあるペア候補のG2情報が表示されるので選択すると、下記のような画面になります。

Even app top screen

Xでも紹介しました。

このアプリを使うと、アプリからG2に対して、

  • BMP形式の画像送付
  • Notification送付
  • テキストメッセージ送付

ができるようです。

しかし、BMP, Notification, テキストを試しましたが、G2側には何も表示されませんでした。

ここまではiOS, Androidで共通です。

一方、iOSの場合ですがXcodeでデプロイした直後 (Xcode上でログが表示される状態) であれば使えるのですが、XcodeとiPhoneの接続を切って、iPhone単体でアプリを実行すると瞬間で終了してしまいます。

Provisioning Fileの有効期限が切れた時のような挙動です。色々試したのですが解決できませんでした。

4. おわりに

ひとまずiOS/Androidアプリのどちらでも、G2と接続できることはわかりました。あとは、このリポジトリはそもそもG1で動くのかを知りたいところです。

というのも、1年前のredditでこのように書いてあり、このリポジトリは2年前からほとんど変わっていないようです。

Official demo app (https://github.com/even-realities/EvenDemoApp/) - contains a skeleton of a demo app, although without the ability to actually connect to glasses. My attempts in running it on Android resulted in a few screens that can be navigated around but not doing anything with the glasses.
公式デモアプリ (https://github.com/even-realities/EvenDemoApp/) - デモアプリの骨組みは含まれていますが、実際にメガネに接続することはできません。Androidで実行してみたところ、いくつかの画面は操作できるものの、メガネに何も反応しませんでした。

G2向け公式SDKを待ちつつ、時間があればもう少し通信周りを調べてみたいと思います。