【问题标题】:EyeGesture and EyeGestureManager clarity needed需要 EyeGesture 和 EyeGestureManager 清晰度
【发布时间】:2014-12-17 20:28:22
【问题描述】:

Google 审核小组要求眼镜器皿:

如果没有预期用户会调暗屏幕 看着

这与 Glass 的“此时此地”体验一致。 如果没有预期,玻璃器皿应始终使屏幕变暗 用户正在查看它。理想情况下,它的行为类似于时间线,并且 15s 后变暗。用户可以通过抬头“唤醒”屏幕。

要进行更新:如果用户没有查看结果 卡片卷轴,调暗屏幕。

这暗示了使用EyeGestureGlass Develop Page 的任何地方似乎都没有提到它。

经过一番搜索,我发现来自this stackoverflow post (Google Glass Eye Gesture Crashing (EyeGestureLib))this EyeGesture library (github) 似乎不再起作用(并且在4 个月内没有更新)。

使用this revised EyeGesture library (github) 提出的已接受答案(来自stackoverflow 帖子)

还提到(在 stackoverflow 帖子中 - 作为评论):

基本上,您是在尝试公开 Glass 中存在的类 环境本身,但不是通过官方 API。通过声明 这些存根类(没有实现任何方法)并通过 将它们放入 com.google.android.glass.eye 包中,我们 允许我们的代码使用这些未实现的类进行编译。在 运行时,系统具有这些类的实现和 应用程序将改为使用系统的实现。

以下是我的以下问题:

  1. 是否会很快(以及何时)推出 EyeGesture 的官方 API?
  2. 我尝试按照建议的指南将the revised EyeGesture library 实施到我的活动中,但没有任何运气。我可能做错了什么?
  3. 我是否遗漏了什么东西才能被检测到?我知道GestureDetector 需要Override onGenericMotionEvent(MotionEvent event),EyeGesture 有类似的东西吗?

这是我目前正在做的事情:

我有一个名为 com.google.android.glass 的包,在这个包中我有以下内容:

  • EyeGestureenum那个implements Parcelable
  • EyeGestureManagerclass

我在主包里有:

  • GestureIdsclass(这个与 github 不同,它是公共类而不是私有类)

在我的活动中,我有:

private void createEyeGestureDetector(ResultActivity resultActivity) {
    final GestureIds gestureIds = new GestureIds();
    //The github guide didn't mention any class names for 
    //mEyeGestureManager and mEyeGestureListener .. so I added some..
    EyeGestureManager mEyeGestureManager = EyeGestureManager.from(resultActivity);
    EyeGestureManager.Listener mEyeGestureListener = new EyeGestureManager.Listener() {
        @Override
        public void onDetected(EyeGesture gesture) {
            Log.i("EyeGestureListener", "Gesture: " + gesture.getId());
            int id = gesture.getId();
            if(id == gestureIds.WINK_ID || id == gestureIds.DOUBLE_WINK_ID) {
                Log.d("EyeGesture", "Wink");
            } else if (id == gestureIds.BLINK_ID || id == gestureIds.DOUBLE_BLINK_ID){
                Log.d("EyeGesture", "Blink");
            } else if (id == gestureIds.LOOK_AT_SCREEN_ID || id == gestureIds.LOOK_AWAY_FROM_SCREEN_ID) {
                Log.d("EyeGesture", "Screen");
            }

        }
    };
}

在我的onCreate 我有:

//..
super.onCreate(bundle);
createEyeGestureDetector(this);
//..

更新 Logcat:

当我这样做时:

for (EyeGesture eg : EyeGesture.values()) {
    boolean supported = mEyeGestureManager.isSupported(eg);
    Log.w("yupyup", eg.name() + ":" + supported);
}

我明白了:

12-10 18:40:51.252    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ WINK:true
12-10 18:40:51.252    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ DOUBLE_WINK:false
12-10 18:40:51.252    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ BLINK:false
12-10 18:40:51.252    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ DOUBLE_BLINK:true
12-10 18:40:51.260    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ DON:true
12-10 18:40:51.268    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ DOFF:true
12-10 18:40:51.268    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ LOOK_AT_SCREEN:true
12-10 18:40:51.268    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ LOOK_AWAY_FROM_SCREEN:false

我还添加了(来自第一个 github 链接):

@Override
protected void onStart(){
    super.onStart();
    createEyeGestureDetector(this);
    for (EyeGesture eg : EyeGesture.values()) {
        boolean supported = mEyeGestureManager.isSupported(eg);
        Log.w("yupyup", eg.name() + ":" + supported);
    }
    mEyeGestureManager.register(EyeGesture.LOOK_AT_SCREEN, mEyeGestureListener);
    mEyeGestureManager.register(EyeGesture.LOOK_AWAY_FROM_SCREEN, mEyeGestureListener);
    mEyeGestureManager.register(EyeGesture.WINK, mEyeGestureListener);

}

@Override
protected void onStop(){
    mEyeGestureManager.unregister(EyeGesture.LOOK_AT_SCREEN, mEyeGestureListener);
    mEyeGestureManager.unregister(EyeGesture.LOOK_AWAY_FROM_SCREEN, mEyeGestureListener);
    mEyeGestureManager.unregister(EyeGesture.WINK, mEyeGestureListener);
    super.onStop();
}

这给了我:

12-10 18:46:11.314    2553-2553/com.google.android.glass.websurg.websurg I/EyeGestureManager﹕ Removing listener: com.google.android.glass.websurg.websurg.ResultActivity$1@41b8b908 for eye gesture: LOOK_AT_SCREEN
12-10 18:46:11.314    2553-2553/com.google.android.glass.websurg.websurg I/EyeGestureManager﹕ Removing listener: com.google.android.glass.websurg.websurg.ResultActivity$1@41b8b908 for eye gesture: LOOK_AWAY_FROM_SCREEN
12-10 18:46:11.314    2553-2553/com.google.android.glass.websurg.websurg I/EyeGestureManager﹕ Removing listener: com.google.android.glass.websurg.websurg.ResultActivity$1@41b8b908 for eye gesture: WINK

但是它们没有被检测到。即使是 WINK,因为它似乎受到支持。

【问题讨论】:

    标签: java android google-glass android-logcat google-gdk


    【解决方案1】:

    Google 团队已经回答了其中一些问题,但我会继续提供有关他们回答的更多详细信息,并提供另一种方法来完成您要求的这些事情。

    如果没有预期用户正在看,请调暗屏幕 它。

    这与 Glass 的“此时此地”体验一致。 如果没有预期,玻璃器皿应始终使屏幕变暗 用户正在查看它。理想情况下,它的行为类似于时间线,并且 15s 后变暗。用户可以通过抬头“重新唤醒”屏幕。

    要进行的更新:如果用户没有查看 卡片卷轴,调暗屏幕。

    Glass 会自行处理,但问题是如果用户没有触摸 Glass 垫大约 10 秒或更长时间,Glass 会进入睡眠状态,而您的应用程序将停止运行。 解决此问题的好方法是让 Glass 屏幕始终打开并检查用户何时查看屏幕或何时移除 Glass。

    如果用户注视屏幕,则增加屏幕亮度,如果他们移开视线,则降低屏幕亮度。

    如果他们从脸上取下 Glass,请将亮度降低到零,关闭屏幕并停止运行您拥有的所有大型 CPU 密集型代码。

    如果他们将 Glass 重新戴在脸上,请增加屏幕亮度,打开屏幕,然后启用所有 CPU 密集型代码。

    您可以只使用一个布尔变量来确定何时开始或停止运行。如果您不希望应用在几秒钟内没有触摸事件后停止运行,建议您使用此方法。它还可以在运行您的应用时节省电池电量。

    我上面所说的代码示例如下:

    获取屏幕亮度:

    //Get Screen Brightness
        public float getScreenBrightness() {
           WindowManager.LayoutParams wMLayout = getWindow().getAttributes();
           return  wMLayout.screenBrightness;
        }
    

    设置屏幕亮度(0到1):

     //Set Screen Brightness
        public boolean setScreenBrightness(float sBrightness){
            if(sBrightness>=0){
                WindowManager.LayoutParams wMLayout = getWindow().getAttributes();
                wMLayout.screenBrightness = sBrightness; //Modify Brightness
                getWindow().setAttributes(wMLayout); //Apply changes
                return true;
            }else
            {
                return false;
            }
        }
    

    保持屏幕开启或关闭:

        //Turn Screen On/Off
    public void keepScreenOn(boolean screenOn){
        if(screenOn) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }else{
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }
    

    不要忘记在 Manifest 中添加权限:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

    如果你只是在做开发并且现在不想担心权限,你可以使用:

    <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" />
    

    并避免查找要使用的权限。我建议你现在就使用它,因为它可以节省你在开发过程中的时间,而且你不必担心编码时的权限。

    [眼睛手势]

    没有可用于检测这些的 Google 官方 API。现在任何可用的东西都是为了访问隐藏的 Glass API 的小技巧。 Glass 团队正在研究它,他们说 API 只会在可靠时发布。现在,根据他们的说法,它并不完美。

    注意

    我将在下面发布的答案应该有效,但可能不适用于下一次 Glass 更新。当他们确实更新时,某些东西会神奇地发生变化,并且一个功能将停止工作。 Glass API 和 Glass 本身处于 Beta 模式,因此预计在官方 EYE Gesture API 发布之前情况会不断变化。

    有两种方法可以检测眼睛手势。一种方法是使用 IntentFilter 并等待“手势”消息。另一种方法是使用 Stub Library 访问隐藏的 Glass API。我将在这里讨论这两种方法,因为每种方法都有优点和缺点。

    方法一(存根库):

    这是您当前尝试的方式。

    优点

    可以检测更多手势

    缺点

    眨眼不能弯腰拍照。

    您使用的库与我使用的仍在工作的库不同。如果这不起作用,我会尝试解决您的问题,然后您应该按照我使用我使用的库的方式进行操作。

    你第 1 步错了。

    第 1 步:创建存根:

    创建一个名为 com.google.android.glass 的包。在这个包中 创建两个类:EyeGesture 和 EyeGestureManager

    应该是

    com.google.android.glass.eye

    不是

    com.google.android.glass

    com.google.android.glass 过去可能有效,但更新过多。

    因此,EyeGesture 和 EyeGestureManager 必须放在名为 com.google.android.glass.eye

    的包中

    如果仍未检测到眼睛手势,请忘记该库并使用我当前使用的库。关闭您的项目并创建一个新项目。

    步骤:

    1) 从here 下载库。 (上次更新是 4 个月前)。您当前使用的可能是 8 个月前甚至一年前的最后一次更新。

    https://github.com/prt2121/EyeGestureLib

    zip 文件的名称很长,例如“EyeGestureLib-fwenindioniwenubwudew”。

    将 Zip 文件重命名为“EyeGestureLib”。

    解压里面的文件夹,名字长如“EyeGestureLib-f8a9fef3bde4396f947106e78cd0be7c7ecdd5a6

    将该文件夹重命名为“EyeGestureLib

    “EyeGestureLib”文件夹内应该有两个文件夹,分别称为“EyeGestureStub”和“EyeGestureDemoApp”加上其他无用的文件。

    2) 打开 Eclipse 并创建一个新项目。 创建一个简单的 MainActivty 类活动。

    3) 在您的 MainActivity 类中:

    private EyeGestureManager mEyeGestureManager;
    private EyeGestureListener mEyeGestureListener;
    
    private EyeGesture target1 = EyeGesture.WINK;
    private EyeGesture target2 = EyeGesture.DOUBLE_BLINK;
    private EyeGesture target3 = EyeGesture.LOOK_AT_SCREEN;
    

    onCreate内:

    mEyeGestureManager = EyeGestureManager.from(this);
    mEyeGestureListener = new EyeGestureListener();
    

    onStart内:

    mEyeGestureManager.register(target1, mEyeGestureListener);
    mEyeGestureManager.register(target2, mEyeGestureListener);
    mEyeGestureManager.register(target3, mEyeGestureListener);
    

    onStop内:

    mEyeGestureManager.unregister(target1, mEyeGestureListener);
    mEyeGestureManager.unregister(target2, mEyeGestureListener);
    mEyeGestureManager.unregister(target3, mEyeGestureListener);
    

    MainActivity 内部(不在任何函数内部,而是在 MainActivity 类内部的任何位置):

    private class EyeGestureListener implements Listener {
    
        @Override
        public void onEnableStateChange(EyeGesture eyeGesture, boolean paramBoolean) {
    
        }
    
        @Override
        public void onDetected(final EyeGesture eyeGesture) {
           //Show what we just detected
           Log.i(eyeGesture.toString() , " is detected");
    
                  //Check which eye event occured
            if (eyeGesture.name() == target1.name()) {
                // Wink
                Log.i("EyeGesture: ", " you just winked");
            } else if (eyeGesture.name() == target2.name()) {
                // Double blink
                Log.i("EyeGesture: ", " you just double winked");
            } else if (eyeGesture.name() == target3.name()) {
                // Look at Screen
                Log.i("EyeGesture: ", " you Looked at Screen");
            }
    
        }
    }
    

    4) 你会得到错误。 导入 EyeGestureLib 文件夹中的 EyeGestureStub修复它。

    修复错误:

    a) 转到文件 -> 导入 -> Android -> 现有 Android 代码进入工作区

    单击下一步浏览并浏览EyeGestureLib文件夹内的EyeGestureStub文件夹。

    如果存在“EyeGestureDemoApp”,请务必排除它。您需要 EyeGestureLib 文件夹,其中包含 EyeGestureEyeGestureManager强>。

    b) 右键单击​​“EyeGestureStub-> 属性 -> Android -> 在右侧,在 Project Build Target 下确保“Glass Development Kit Preview复选框 em>选中

    Library 下,确保“Is Library”复选框被选中

    点击应用确定退出窗口。

    c) 打开 Android SDK 管理器。检查安装的 Android SDK Build-tools 的版本。我有 21.1.1。

    d)打开EyeGestureStubproject.properties,修改sdk.buildtools=18.1 .1sdk.buildtools=21.1.1 完成

    完成。如果您按照说明进行操作,它应该可以工作。

    运行它并选择MainActivity作为Launch Activity

    [仍然无法正常工作?导入一切 && 从那里工作]

    如果您无法使用它,请删除当前项目并导入下载的整个项目,然后从那里开始工作。这是最简单的方法。在编译之前,您可能需要修复一些错误。**

    要导入项目,

    1) 转到文件 -> 其他 -> Android -> 来自现有代码的 Android 项目

    下一步 -> 浏览

    然后选择包含 EyeGestureStubEyeGestureDemoAppEyeGestureLib 文件夹.

    确保在 Project to ImportEyeGestureStubEyeGestureDemoApp 都是复选框被选中然后点击Finish

    2) 右键单击​​“EyeGestureStub-> 属性 -> Android -> 在右侧,在 Project Build Target 下确保“Glass Development Kit Preview复选框 em>选中

    Library 下,确保“Is Library”复选框被选中

    点击应用确定退出窗口。

    3) 右键单击​​“MainActivity-> 属性 -> Android -> 在右侧,在 Project Build Target 下确保“Glass Development Kit Preview复选框 em>选中

    4)你会得到不可见的错误,不会显示。

    查看它转到 Windows -> 显示视图 -> 问题 在那里,你会看到所有的问题。

    下一步修复它,我们必须将 Android SDK Build-tools 版本与 project.propertiesEyeGestureStubMainActivity

    的 /em>

    a) 打开 Android SDK 管理器。检查安装的 Android SDK Build-tools 的版本。我有 21.1.1。

    b)打开EyeGestureStubproject.properties,修改sdk.buildtools=18.1 .1sdk.buildtools=21.1.1

    c) 打开 MainActivityproject.properties 并更改 sdk.buildtools=18.1 .1sdk.buildtools=21.1.1

    注意:更改第一个 project.properties 可能会自动更改第二个。

    完成。如果您按照说明进行操作,它应该可以工作。

    运行它并选择MainActivity作为Launch Activity

    方法二(IntentFilter)

    优点

    眨眼可以停止拍照。

    缺点

    检测到WINK ONLY

    第一种方法可以接收四个事件(WINKDOUBLE_WINKDOUBLE_BLINK ,LOOK_AT_SCREEN,) 但这种方法只能接收一个事件(WINK)。

    如果您只想检测 ONLY WINK 而无需 Glass 拍照,此方法非常有用。

    要收听 Intent,您必须扩展 BroadcastReceiver。

    public class EyeGesture extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getStringExtra("gesture").equals("WINK")) {
    
                 //Disable Camera Snapshot
                abortBroadcast();
    
                Log.e("WINKED ","");
            }else {
                Log.e("SOMETHING", "is detected " + intent.getStringExtra("gesture"));
            }
        }
    }
    

    您必须在 Manifest 中注册 Intent,如下所示:

     <receiver android:name="com.inno.inno.glassplugin.EyeGesture">
                    <intent-filter>
                        <action android:name="com.google.android.glass.action.EYE_GESTURE" />
                    </intent-filter>
     </receiver>
    

    Manifest 中指定的名称必须与EyeGesture 监听意图的类的名称相匹配。

    就这么简单。不需要库,但只能检测到 WINK。当检测到眨眼时,它还会阻止 Glass 拍照。如果您希望 Glass 在检测到事件时拍照,您可以评论 abortBroadcast();

    这适用于目前希望从 Glass 中检测眼睛手势的任何人。在 Google 发布官方 Eye Gesture API 之前,这些是目前唯一的解决方案。

    您应该申请新的 Glass API 功能 here。将其归档为 Glass Eye Gesture API 请求。如果 Glass 团队收到太多此功能请求,他们会将其作为首要任务并发布。我已经申请了。

    【讨论】:

    • 很好的答案。好细节。表明你经历了很多来弄清楚它是如何工作的。干杯。
    • lol 我花了 15 天的时间,我不想让其他任何人经历这个。将 com.google.android.glass 更改为 com.google.android.glass.eye 是否对您有用,还是您必须使用我在此处链接的 Lib 来完成?
    • 这实际上是我的一个错字,但是是的。 :)
    • @Programmer 如果我要实现第二种方法,我将如何在不同的活动中赋予 WINK 手势不同的行为?只是将 放在我的 中吗?
    • @Questioning,我不明白你的问题。你介意提供你试图做什么的例子吗?如果太长,请创建一个新帖子并在此处发布链接。我会去那里回答。
    【解决方案2】:

    得到了 Google Glass Review 团队的回复。他们的回应:

    如果没有预期用户正在看,请调暗屏幕 它。

    这与 Glass 的“此时此地”体验一致。 如果没有预期,玻璃器皿应始终使屏幕变暗 用户正在查看它。理想情况下,它的行为类似于时间线,并且 15s 后变暗。用户可以通过抬头“唤醒”屏幕。

    要进行的更新:如果用户没有查看 卡片卷轴,调暗屏幕。

    是这样的吗:

    平台处理这个,你是否以某种方式覆盖它,是 显示结果时您持有唤醒锁吗?

    所以到目前为止,它似乎并不打算直接与 EyeGesture 一起工作,因为它显然是自动完成的(这部分需要确认)。无论如何,尝试处理LOOK_AT_SCREEN 是没有意义的,因为LOOK_AWAY_FROM_SCREEN 没有得到处理。

    12-10 18:40:51.268    2405-2405/com.google.android.glass.websurg.websurg W/yupyup﹕ LOOK_AWAY_FROM_SCREEN:false
    

    对于那些有兴趣处理 Wink EyeGesture 的人来说,根据我收集的一些信息(需要确认),这里显然是有效的。

    使用的想法是使用EyeGestureEyeGestureManager 存根。它们几乎存在于环境中,但不存在于 API 中。这意味着要访问它们,您需要创建在运行时可以工作的 Subs(至少我是这么理解的)。

    在处理WINK EyeGesture 时显然存在一个已知错误。它会拍照。这可能是由于在 Google Glass 设置中激活了检测到眨眼时拍照。 (需要确认)。

    那么具体怎么处理呢?

    第 1 步:创建存根:

    创建一个名为com.google.android.glass 的包。在这个包中创建两个类:EyeGestureEyeGestureManager

    眼睛手势:

    package com.google.android.glass.eye;
    
        import android.os.Parcel;
        import android.os.Parcelable;
    
        /**
         *  https://gist.github.com/victorkp/9094a6aea9db236a97f3E
         * 
         */
        public enum EyeGesture implements Parcelable {
            BLINK, DOFF, DON, DOUBLE_BLINK, DOUBLE_WINK, LOOK_AT_SCREEN, LOOK_AWAY_FROM_SCREEN, WINK;
    
            public int getId(){
                return -1;
            }
    
            @Override
            public int describeContents() {
                return 0;
            }
    
            @Override
            public void writeToParcel(Parcel dest, int flags) {
    
            }
        }
    

    EyeGestureManager:

    package com.google.android.glass.eye;
    
    import android.content.Context;
    
    /**
     * 
     * If there are any updates required check: https://gist.github.com/victorkp/9094a6aea9db236a97f3
     * 
     */
    public class EyeGestureManager {
        public static final int INFINITE_TIMEOUT = -1;
        public static final String SERVICE_NAME = "eye_gesture";
    
        public interface Listener {
            public void onDetected(EyeGesture gesture);
        }
    
        public static EyeGestureManager from(Context paramContext) {
            return null;
        }
    
        public void activateGazeLogging(boolean paramBoolean) {
        }
    
        public boolean applyAndSaveCalibration(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean clearCalibration(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public void enableGazeService(boolean paramBoolean) {
        }
    
        public boolean endCalibrationInterval(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean isCalibrationComplete(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean isGazeLogging() {
            return false;
        }
    
        public boolean isRegistered() {
            return false;
        }
    
        public boolean isSupported(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean loadCalibration(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean register(EyeGesture gesture, EyeGestureManager.Listener listener){
            return false;
        }
    
        public boolean startCalibrationInterval(EyeGesture paramEyeGesture) {
            return false;
        }
    
        public boolean unregister(EyeGesture gesture, EyeGestureManager.Listener listener) {
            return false;
        }
    }
    

    太好了,你有两个存根。您应该注意到的第一件事是它们不是 100% 像来自 github 链接的那个。一些功能已被弃用,我保留了那些有效的功能。 (我没有尝试过每一个)。

    接下来是什么?那么你需要(不是真的,但如果你这样做会更容易)创建GestureId 类(是的,你可以把它放在任何你想要的地方)。

    手势ID:

    package com.google.android.glass.websurg.websurg;
    
    import com.google.android.glass.eye.EyeGesture;
    
    /**
     * 
     *
     * For updates check out: https://gist.github.com/victorkp/9094a6aea9db236a97f3
     * 
     *
     * 
     */
    public class GestureIds {
        public int BLINK_ID;
        public int WINK_ID;
        public int DOUBLE_BLINK_ID;
        public int DOUBLE_WINK_ID;
        public int LOOK_AT_SCREEN_ID;
        public int LOOK_AWAY_FROM_SCREEN_ID;
    
        public GestureIds() {
            BLINK_ID = EyeGesture.BLINK.getId();
            WINK_ID = EyeGesture.WINK.getId();
            DOUBLE_BLINK_ID = EyeGesture.DOUBLE_BLINK.getId();
            DOUBLE_WINK_ID = EyeGesture.DOUBLE_WINK.getId();
            LOOK_AT_SCREEN_ID = EyeGesture.LOOK_AT_SCREEN.getId();
            LOOK_AWAY_FROM_SCREEN_ID = EyeGesture.LOOK_AWAY_FROM_SCREEN.getId();
        }
    }
    

    现在您已经掌握了所有课程,可以真正开始了。请记住,存根是在运行时可以正常工作的存根(至少我是这么认为的,因为我没有收到任何错误?

    假设你有一个 MainActivity 并且你想添加 EyeGesture:

    private void createEyeGestureDetector(Context context) {
        mGestureIds = new GestureIds();
        mEyeGestureManager = EyeGestureManager.from(context);
        mEyeGestureListener = new EyeGestureManager.Listener() {
            @Override
            public void onDetected(EyeGesture gesture) {
                Log.w("EyeGestureListener", "Gesture: " + gesture.getId());
                int id = gesture.getId();
                if (id == mGestureIds.WINK_ID || id == mGestureIds.DOUBLE_WINK_ID) {
                    Log.d("EyeGesture", "Wink");
                } else if (id == mGestureIds.BLINK_ID || id == mGestureIds.DOUBLE_BLINK_ID) {
                    Log.d("EyeGesture", "Blink");
                } else if (id == mGestureIds.LOOK_AT_SCREEN_ID || id == mGestureIds.LOOK_AWAY_FROM_SCREEN_ID) {
                    Log.d("EyeGesture", "Screen");
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.w("detected", "omg detected");
                    }
                });
    
            }
        };    
    }
    

    请注意,我还有一个 run()。我已经添加了两个,因为一个 github 链接有它而另一个没有。两种都试了,好像没检测到。

    你在你的 onCreate(); 中调用这个(上面那个)函数; ,然后在你的 onResume();

    mEyeGestureManager.register(EyeGesture.LOOK_AT_SCREEN, mEyeGestureListener);
    mEyeGestureManager.register(EyeGesture.LOOK_AWAY_FROM_SCREEN, mEyeGestureListener);
    mEyeGestureManager.register(EyeGesture.WINK, mEyeGestureListener);
    

    在你的 onPause() 上:

    mEyeGestureManager.unregister(EyeGesture.LOOK_AT_SCREEN, mEyeGestureListener);
            mEyeGestureManager.unregister(EyeGesture.LOOK_AWAY_FROM_SCREEN, mEyeGestureListener);
            mEyeGestureManager.unregister(EyeGesture.WINK, mEyeGestureListener);
    

    现在这一切似乎都起作用了(调用函数时没有错误,并且显示日志表明它们已被调用(注意存根中没有日志))。

    但是,我的谷歌眼镜似乎没有检测到 EyeGesture。我很确定一切都很好,或者我错过了一些小事。我不会接受它作为答案,因为它只回答了我的部分问题。随意尝试一下,让我知道它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多