<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[GlassesFlip]]></title><description><![CDATA[GlassesFlip]]></description><link>https://glassesflip.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 29 Oct 2026 16:39:09 GMT</lastBuildDate><atom:link href="https://glassesflip.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Hands-free item recognition with Meta's Wearables Device Access Toolkit: building "hold it up and get a verdict" on Android]]></title><description><![CDATA[I resell on the side, and the worst part of sourcing at a thrift store is the phone: one hand full of items, the other typing searches. So I'm building…]]></description><link>https://glassesflip.hashnode.dev/hands-free-item-recognition-with-meta-s-wearables-device-access-toolkit-building-hold-it-up-and-get-a-verdict-on-android</link><guid isPermaLink="true">https://glassesflip.hashnode.dev/hands-free-item-recognition-with-meta-s-wearables-device-access-toolkit-building-hold-it-up-and-get-a-verdict-on-android</guid><category><![CDATA[Android]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Wearables]]></category><dc:creator><![CDATA[GlassesFlip]]></dc:creator><pubDate>Mon, 26 Oct 2026 01:17:33 GMT</pubDate><content:encoded><![CDATA[<p>I resell on the side, and the worst part of sourcing at a thrift store is the phone: one hand full of items, the other typing searches. So I'm building GlassesFlip, an Android app that works with Ray-Ban Meta glasses. You hold an item up and hear what it is, what it has sold for, and a buy-or-pass call.</p>
<p>This post is about the engineering: how the app uses Meta's Device Access Toolkit (DAT), and how I got a hands-free "Live Scan" mode working without sending every camera frame to the cloud.</p>
<h2>What DAT gives you</h2>
<p>Meta's Wearables Device Access Toolkit lets an Android app open a session with supported glasses and get a camera stream. Per the docs, the stream comes in three sizes (360x640, 504x896, 720x1280) at 2 to 30 fps. The link is Bluetooth, so when bandwidth is short the SDK lowers resolution first and frame rate second. Frames are compressed, so they can look soft. You also get device state: battery, worn/not worn, hinge, and a thermal level.</p>
<p>Two practical limits shaped the design: one session per device, and a session ends when the hinges close or the glasses come off. The app has to start a new one.</p>
<h2>The button flow</h2>
<p>The first version is simple. Press the glasses' capture button, grab a photo, optionally add a spoken note, identify the item, look up prices, and read the answer through the glasses' speakers. It works, but it needs a press per item.</p>
<h2>Live Scan: no button</h2>
<p>Live Scan keeps the stream open at 504x896 / 15 fps and analyzes frames on the phone at around 4 to 5 fps. A frame only becomes a lookup if it passes a few gates:</p>
<ol>
<li>Motion gate: skip frames while your head is moving.</li>
<li>Object gate: an on-device object detector (ML Kit) has to find an object of reasonable size near the center of the frame.</li>
<li>Dwell: the same object has to stay put for about 0.7 seconds.</li>
<li>Best frame: within that window, keep the sharpest frame.</li>
<li>Dedupe: a perceptual hash stops the app from researching the same item twice in a few minutes.</li>
</ol>
<p>Then the lookups run cheapest first: barcode, then label text, then a paid cloud image search only if nothing else works. Hourly and daily caps keep the cloud calls bounded.</p>
<p>Moving quickly through a rack creates a different problem: you put an item down before its result arrives. So lookups go into a small queue, each verdict names its item ("Buy, Nike shorts, about $45 sold"), and stale results are dropped with a soft tone instead of being read out late.</p>
<h2>Things I learned the hard way</h2>
<ul>
<li>My first object gate was too strict for a hand-held item in a portrait frame, and the detector was running in single-object mode. Zero locks until I added per-gate counters to the log and looked at which stage was failing.</li>
<li>Streams drop. The app needs one owner for the camera session, retry with backoff on a real drop, and a visible error instead of a toggle that quietly flips back off.</li>
<li>Battery and heat aren't documented for continuous streaming, so the app reads the thermal level and battery and turns Live Scan off before the glasses get hot or low.</li>
</ul>
<h2>Privacy</h2>
<p>The LED stays on while streaming and the app never tries to hide it. Raw frames stay in memory and are never saved. Only the chosen crop of an item is kept in the user's scan history, and nothing here identifies people.</p>
<h2>Status</h2>
<p>GlassesFlip is in early access on Android. If you resell and want to try it, you can sign up at <a href="https://glassesflip.com">https://glassesflip.com</a>, and the changelog is at <a href="https://glassesflip.com/releases">https://glassesflip.com/releases</a>. I'd love to hear what a good voice verdict should say, and how you'd tune the gates.</p>
<p>GlassesFlip is an independent app and is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc., EssilorLuxottica, or eBay Inc. Ray-Ban is a registered trademark of Luxottica Group S.p.A.; Meta and eBay are trademarks of their respective owners.</p>
]]></content:encoded></item></channel></rss>