有人送你半價
解鎖時在應用程式裡輸入這組代碼。它不綁定你,也不綁定這支手機。
一支手機,
就是一台真正的儀器。
Signal Collector 持續把手機能取得的感測器、無線電與網路資料直接記錄到手機裡——沒有雲端儲存,量測資料不會離開裝置。
實機截圖 · Pixel 10a
-
進行中的量測。圓環顯示陸續進來的衛星、網路與感測器。
-
挑選要量測什麼。每個來源都是一列,說明它記錄什麼。
-
開始、重設與停止,上方是時長、距離與紀錄筆數。
-
面板下半部:各個來源正在做什麼,以及要離開手機的那個檔案。
-
設定:傳送到你自己的伺服器、單位,以及停止之後會發生什麼。
MVP 範圍
走一趟,
拿到完整的環境。
- 01GPS、GNSS 與裝置感測器
- 02行動網路:LTE / 5G / 3G / 2G
- 03Wi‑Fi、Bluetooth 與網路環境
- 04透過 Wi‑Fi 與行動網路的連續網際網路測繪
它派得上什麼用場
每一個案例,
最後都是一個檔案。
量測儀器賣的不是來源清單,而是它能回答的問題。以下是這個應用程式所針對的十二種情境中的六種——每一種都是走一趟,最後留下一個檔案。
會議室裡的死角
把手機放進口袋走過整層樓,在每道門口口述一段備註。得到的是逐秒的吞吐量、手機當時真正連上的 AP,以及 一個具體的房間,而不是各說各話 ——兩個部門之間從此有了共同的依據。
不需要工程車的路測
兩張 SIM 同時掃描,GPS 每秒一次,手機固定在儀表板上。每一次技術、Cell ID 或 PCI 的變化都會記成一筆事件,因此 換手的位置可以精確到公尺.
GPS 完全幫不上忙的勘查
在倉庫裡,天空就是屋頂。用應用程式自己的取景器替每條走道拍一張照片做標記,同時收集 AP、MLO 連結與 RTT 距離—— 在買下第一台新 AP 之前就有一張覆蓋圖.
自己會回報的感測器
一棟樓裡有數十個 BLE 溫度計,沒有一個配對過。走過去,它們的溫度、濕度與電池電壓就會 帶著名稱、以 SI 單位抵達,就放在它們來源的位元組旁邊。
給房東看的證據
走十分鐘就會得到一個檔案,裡面有時間戳記、位置、訊號強度與各個房間的照片。「到處訊號都很好」於是變成 一句可以查證的說法.
不接受雲端的客戶
照常量測,然後傳送到你自己的 S3、WebDAV 或 SFTP——或者直接交出一個檔案。照片與語音備註絕不會進到手機相簿,因此 保密協議仍然簽得下去.
看得見的
工作進度。
1.5.1 版在每次安裝時都附上全部十二種語言,讓你看得到長時間的匯出或重設正在進行,並加入隨手記事本,用來收沒有量測時記下的測點、照片與測試。
真的裝在裡面的語言
Google Play 過去只提供手機在安裝當下擁有的語言,因此各應用程式的語言選單雖然列出捷克文與其他語言, 背後卻沒有字串。現在每次安裝都會附上全部十二種翻譯。
按鍵上的彗星
在大型量測上,下載、分享與重設要花幾秒到幾分鐘。現在有一顆彗星沿著按鍵的邊緣繞行,尾巴隨著完成的部分變長,下方還有一行即時文字說明 完成了多少、已經執行多久,以及大約還要多久。寫入開始之前會先顯示可用空間——快不夠時是琥珀色,匯出放不下時是紅色。
隨手記事本
測點、照片、語音備註、一次性網際網路測試與 Wi-Fi 吞吐量循環,現在都不再需要先按「開始」。沒有量測進行時,它們會進入一份獨立的紀錄, 不啟動收集器、不佔用喚醒鎖,也不計入免費的一小時 ——它有自己的卡片、自己的分享檔案,以及自己的清空。
從圖示分享,系統原生控制項
量測停止之後長按應用程式圖示, 「分享」就在「開始」旁邊;點下去會開啟應用程式並立刻開始匯出。開關、文字欄位、選項與訊息現在都是標準的 Android 控制項——按鍵與儀器本身維持原樣。
Nothing lost
on the way out.
Version 1.5.0 adds no new key. It goes over everything that could cost a measurement its data — a Reset under a stray thumb, a point number used twice, an export torn in half by a second export — and closes each one, with a test that keeps it closed.
A Reset that asks first
The first touch on Reset deletes nothing. It opens a dialog that names what would go: the measurements, the photos and the voice notes. Cancel keeps everything; only a confirmation wipes. A thumb that brushes the key in a corridor no longer ends a day's work.
Points keep their numbers
Stop a measurement, start it again, mark a point: it gets the next number, not a repeat of one already in the file. The same holds for photo and voice marks, so two records never share one point index and the export stays unambiguous.
An export in one piece
Export takes a single atomic snapshot of the database, and two export requests at once queue instead of tearing one archive. The manifest is computed from the bytes that actually went into the archive, with a SHA-256 for every file. You get a readable archive or a plain error — never a silent torso.
Failures that stay failures
When the writer loses a batch, Stop cannot turn the run into a success. Encrypted Eddystone telemetry stops showing up as plausible plain numbers. Dual-SIM attribution, WPA3-only networks, probe time budgets and the microphone handoff are hardened, and the expandable cards tell TalkBack what they are.
Started without
opening it.
Version 1.4.0 puts Start and Stop where the hand already is — the quick settings shade and the app icon — and lets a marked point carry a photo and a voice, so what a corridor looked like leaves together with the numbers.
A tile in the shade
Start and Stop in the quick settings shade, within reach from any app and over the lock screen, where a widget cannot go. Over a secured lock it unlocks first — what it starts is location with a microphone. It measures with whatever the app measured with last, so one key never starts two different measurements.
Shortcuts under the icon
A long press on the app icon is the only control that is always on the home screen, so it offers the one thing that makes sense now: Start while nothing runs, Stop and Mark point once it does. The gate the launcher walks through is locked with a token no other app can read.
A photo and a voice at the point
A marked point can carry a photo taken through the app's own viewfinder, or a spoken note of up to ten minutes. The media never touch the phone gallery: they sit in the app's private storage and leave only through an export, which becomes a single tar.gz with a SHA-256 for every file.
Settings you can take with you
A new phone set up like the old one, without walking through two dozen sources by hand. Passwords go into the backup only if you ask, and only after a fingerprint, a face or the screen lock. The licence and the free hour never travel in it.
The data, open
to be looked at.
Version 1.3.0 puts the keys on the home screen, opens the measured rows inside the app, lets the controls be carried to the edge of the display, and starts reading sensors that are not in the phone at all.
Keys on the home screen
Three widgets that need no app opened first: a point mark with your own labels, a key that starts a saved set of sources, and a tile showing what one source is collecting. Each key keeps its own copy of what it starts, so a preset switched in the app later changes nothing on the home screen.
Rows you can read on the spot
Browse records opens the raw rows of the last measurement: filter by type and time, search the payload, and a sequence number that holds across the whole file. Marking and hiding is crossing out in the printout — the stored measurement and the export are untouched.
Keys carried to the edge
Hold Start, Reset or Stop and drag it to the bottom edge of the display; there it stays put while you scroll anywhere. Let go outside a berth and the key swings back with an overshoot as big as the distance it travelled.
Sensors that are not in the phone
BTHome, Ruuvi, ATC and pvvx, Eddystone telemetry. Read straight from the Bluetooth scan that is already running: nothing to pair, nothing to connect, no new permission. The values land named and in SI units, beside the bytes they came from.
A panel you can
put your thumb on.
Version 1.2.0 turns the screens into the front panel of an instrument. Switches light up as a whole, keys sink into their base under the thumb, and colour is left to mean a reading — everything else is grey.
Switches that light up as one
The switch is a rocker from a switchboard, cast from translucent red plastic. Switched on, the whole rocker glows instead of a dot in the corner; the I/O marking stays readable in both positions and the rocker always leans to the side that applies.
Keys that stand on a base
Start, stop and the export keys sit on their own base and a press sinks them into it, the same as the buttons here on the site. Haptics answer in the same order: a click going down, a quieter clack coming back.
Grey panel, colour that means something
The panel is neutral grey, so every colour on it is a reading: green for controls and for running, amber for warnings, red for stopping. A screen grid with divisions and dashed axes lies under the content.
Half the download
The release build is shrunk and optimised by R8, which took the bundle from 8.3 MB down to 4.3 MB, and the outdated library Google Play kept reporting is raised through the services that pull it in.
Edges instead
of pebbles.
Version 1.1.0 stops the app looking like a sketch. Shapes go to the right angle, measured values get a dial typeface, and selections become rows that say what each option means.
Sharp edges and a dial typeface
Cards, fields and buttons keep at most two pixels of rounding, and measured values are set in a face where every digit is the same width — a column of numbers no longer dances under the eye. Spacing sits on a four-point grid.
Rows with a description, not pills
Technologies, presets and targets are rows with the current value on the right. On a source with parameters, tapping the row switches it and the chevron opens its settings — a pill could not tell those two apart.
Units say what they changed
Switching units used to close the menu and leave no trace. The dialog now says what it switched to, where it shows up, and that the export stays in metres.
Out of testing,
into the world.
Version 1.0.0 is the first public release. The instrument itself is unchanged; what is new is that anyone can install it, try it for an hour before paying, and read the screens in their own language.
An hour of measuring, on the house
Every phone gets one hour of measuring time a year, split across as many measurements as you like — the tool is meant to be tried in the field, not from a screenshot. The remaining time and the date it comes back are shown right above the Start button.
Bought once, not rented
Unlocking is a single in-app purchase at the Google Play price for your country. No subscription, no expiry, and it follows the account onto every other phone you sign in to.
Permissions explained before they are asked
The first launch no longer opens with a stack of system dialogs. A screen says what each permission is for — and that location is what Android ties cells and Wi-Fi to — and the system asks only after you press the button.
Screens in your language
The app and this site speak a whole range of languages, chosen by the phone or set for Signal Collector alone. The export never follows: it stays in SI, UTC and English column names, so two files from two countries are still one dataset.
Ready for the world
and for the Store.
Version 0.10.0 completes the move to the production identity, adds full English and US units, closes the release blockers and gives the instrument a calmer, more precise visual system — without changing how it is operated.
English and Czech, neither one a bolt-on
Text is no longer produced inside the collection layer, and errors are no longer recognised by their wording. The language can be switched for the app alone, and an English phone never gets half-Czech screens. Numbers follow the locale; the export deliberately stays stable.
Metres, feet and miles
Units can follow the phone automatically, or be forced to metric or imperial in the settings. Only the screen and the notification are converted; the database and the scientific export always stay in SI.
A release with no silent traps
The production bundle requires the upload key, targets Android 16 / API 36 and carries the final identity app.signalcollector. Corrected permission checks close the crashes that followed a revoked permission, and the updated SSH client brings security fixes.
Around the globe
runs time itself.
Inside the globe sits only what has a bearing. Quantities without direction got their own bands outside the horizon, the operator composes the instrument themselves — and measured data can finally leave the phone by a route other than the share sheet.
Four quantities in the ring
Noise, temperature, pressure and now light. The angle along a band is time, not bearing — one minute split into seconds, so the head of the trace sweeps like a second hand with a gap behind it where values have aged out of the minute.
You compose the view
The middle button switches off whatever the cursor rests on. A switched-off row stays in the list with its value, only struck through: the filter changes the picture, not the measurement.
Data can leave on their own
The gear icon gained S3, WebDAV and SFTP destinations. Passwords are encrypted with a key from the Android Keystore, an address without https is rejected, and the server key fingerprint is verified.
You can see
where the signal came from.
The pulsing background circle gave way to a globe of the sky. Satellites sit where they actually are — and anything without a direction lights the whole ring instead of inventing a bearing.
Satellites in their real place
Android reports azimuth and elevation for GNSS only, and the app has recorded them since day one — there was simply nowhere to see them. Colour separates the constellation, size and brightness carry C/N0, a filled dot counts towards the fix. Verified on a Pixel 10a: 20 satellites from four constellations, 14 in the fix.
What has no bearing lights the whole horizon
Wi‑Fi gives strength, not azimuth; Bluetooth gives none either, and cells report only their identity. Samples without direction therefore ripple the entire ring rather than a sector — a sector would claim the signal came from there. The ripples also rotate, so not even the tallest of them points anywhere.
It tilts with the phone, not just turns
Lying face up it looks into the zenith, held upright it looks at the horizon — and what was near the horizon moves behind the phone. Collapsed, the card leaves a flat compass with a needle to north: calm, no flicker.
Scrolling that
never jumps away.
While hiding, the header used to take part of the gesture for itself and the content was re-measured under the finger. Now it only observes the scroll and takes nothing from it.
Content follows the finger the whole time
The finger used to drag while the page stood still until the header had collapsed — and on reversing direction it expanded again first. The header now sits above the content and takes no part in scrolling; it simply moves away, taking the status row with it.
Nothing is re-measured mid-scroll
It hides by offsetting at draw time, not by changing its height, so the content inset stays constant. Measured on a Pixel 10a: 0.30 % janky frames and no missed vsync across ten drags over the threshold where the header switches.
It returns the moment you pull down
Direction decides, not position — you do not have to scroll back to the top to get the header. Because it also returns mid-page, it got an opaque backdrop; otherwise the title would sit on top of the card text.
A scan that does not
pretend to be a measurement.
Android throttles Wi‑Fi scans and keeps handing back the same result meanwhile. The app used to write it down again and again — and the export then claimed a measurement every five seconds.
A repeated scan is recognisable
Every attempt records the state FRESH, THROTTLED or UNCHANGED together with the age of the result; per-AP records are written only for a fresh scan. Without that, the data could not tell you where measuring actually happened — and for a coverage map, that is the whole difference.
Six times denser sampling
Measured on a Pixel 10a: with throttling on, 70 rejected attempts against 45 fresh scans; with it off, zero rejections and a fresh scan every 4.2 s at the median. At walking pace that is one sample every 6 metres instead of every 40.
Points on a floor plan, throughput per network
GPS gives no position indoors, so a place marker was added — you stop, mark a point, walk on. And a new optional source visits the Wi‑Fi networks you list one by one and measures their actual throughput, not just their signal.
Every second
gets its own row.
Continuous internet measurement no longer leaves holes in the timeline. When measuring is impossible, the reason is written down — and a Wi‑Fi network that is gone is recognised at once, not ten minutes later.
A second without a measurement is still a row
A capacity burst or a manual speed test holds the link for several seconds, and the data used to be left with a gap — a full minute in the worst case. Now it says BUSY, naming who held the link. A missing second cannot be told apart from a failed measurement; a written one can.
A dead Wi‑Fi is recognised immediately
After losing Wi‑Fi, the app stayed bound to a network that no longer existed, and over six hundred samples claimed the internet was not answering. The handle is now dropped as soon as the system stops knowing about it, and the app waits for a new Wi‑Fi with internet.
A sample knows which Wi‑Fi it came from
SSID and BSSID were added to the quality record — until now only the direct Wi‑Fi source knew them, and measured quality could not be tied to a network. Android placeholder values (RSSI −127, frequency −1) are also left empty instead of looking like readings.
From your pocket you can tell
how the run is going.
The notification for a running measurement no longer just says “collecting data”. It shows the duration and the record count, refreshes every five seconds and speaks up when data stops being stored.
Time and count in the notification
On a dark screen you see 00:02:43 · 29,880 records instead of a terse line. The duration is pure collection time, the same as on the status card — a pause between Stop and Start does not count towards it.
Data loss reports itself
As soon as samples are dropped, their count joins the line, and the title changes when writing stalls or fails. It is the one thing worth reporting before the operator looks at the screen again.
Ready for Live Updates
The notification declares itself to the system as a Live Update — Android's counterpart to the iOS Dynamic Island, a strip inside the status bar itself. On the Android 16 build under test it does not render yet, because that part of the system is not switched on; the app is waiting for it, ready.
The colour tells you
what was just captured.
A wave crosses the background every time something is written — and now in a colour that says where the sample came from. From across the desk you can see not only that data is flowing, but what is being heard right now.
A colour per source
Green is sensors, blue networks, amber GNSS and violet Bluetooth. Sensors run at 50 ms, so green is a continuous swell with the other colours flashing through it — a blue flash is a network scan, a violet one Bluetooth.
The wave keeps off the text
It used to be drawn over the content as well, tinting the title in the header, the messages and the status row. Now it sits at the very bottom: it passes under the header but leaves the type alone.
Content runs under the bars
When the header hides on scroll, the cards continue under the status bar instead of stopping at it and leaving an empty strip above. The wave shows through under the bars too.
Start no longer overwrites
work in progress.
Start resumes the last measurement instead of quietly replacing it with a new one. Beyond that, the phone lets your pocket know when the connection drops or data stops being stored.
Start continues, it does not restart
Until now every Start opened a new measurement and the previous one became unreachable — it stayed in the phone, but only the new one could be exported. Now it continues, and a clean slate comes only from Reset, which deletes the previous measurement.
A pause does not count towards the duration
The duration is the sum of the time actually spent collecting, not the span from the first Start to the last Stop — for a run interrupted overnight that would claim fifteen hours of collection. In the export it is running_ms.
Interruptions are in the data
Every stop and every resume adds its own session record with a timestamp. The data therefore shows when collection ran and when it waited, so a pause is not mistaken for a hole in coverage.
A buzz at a hole in coverage
Losing the connection is a soft thud, regaining it two light taps, a failed write three firm knocks. The phone is in your pocket while you walk, and these are the events the screen cannot tell you about. Every buzz goes into the data as haptic, so a window can be cut around the vibration.
The counter runs live
The count is no longer sampled. At two thousand records per second it used to jump by more than five hundred; now it flows, and only the digits slow enough to read are animated. The figures have fixed slots and sit on the baseline.
A panel instead of a form
Start, Reset and Stop are solid colour fields — an unavailable switch turns translucent but keeps its colour. Export got its own plate with a label on which the size of the pending file grows, and a green wave crosses the background with every written sample.
How much ground
we actually covered.
This version adds distance walked next to the duration, in a way that does not credit metres to a phone lying on a desk. Beyond that, the capacity burst shows its progress and technology selection is driven by presets.
Distance walked, in metres
The status card shows Distance instead of a static source count. The value is stored with the session, so a finished measurement still shows it after an app restart, and in the export it is distance_m.
Metres, not GPS noise
A walker covers about 1.4 m between one-second fixes, while the uncertainty of a single fix is usually larger. Distance is therefore not measured between neighbours but by moving an anchor once it passes the threshold max(3 m, accuracy).
Location accuracy on show
The accuracy of the last fix sits under the metrics. When the position is too coarse to count towards distance, the card says so outright, so a number that will not move has an explanation.
The capacity burst shows its progress
A new record for the start of a burst puts its beginning into the data, not only its result. Meanwhile the UI runs a countdown next to the transport, and a burst interrupted by Stop is not left hanging.
Technology presets
“All” and “Clear all” became a single switch, with Default in front of it. The app recognises hand-tuned sensor values, asks before overwriting them and offers to keep them as the Custom preset.
Legible messages
A dark treatment tinted by message type, dismissible by dragging down. An error stays on screen for 15 seconds, an ordinary notice disappears after four.
Internet mapping
while moving through a building.
Continuous transfer mapping got its own card ahead of Start, a heartbeat began watching collection from the inside, and a code audit cleaned up the bindings to Android callbacks.
A card of its own for mapping
A separate card keeps continuous mapping apart from the one-off speed test. It can measure Wi‑Fi, cellular data or both transports at once over a specific Android Network.
A data estimate up front
The interface shows the upper bound before you start: at most 204 MB per 30 minutes for one transport and 407 MB for both.
A heartbeat over collection
A running check of the collectors, the writer and the write queue. The session then distinguishes an ordinary Stop, a writer failure and an interruption after the process died.
The export admits its gaps
The header carries the last stored timestamp, the trailing gap and the counts of accepted, written and dropped samples.
Audited callbacks
Registrations for GPS, GNSS, NMEA and navigation messages are visible in the export itself. Bluetooth Classic stores the states of the discovery cycle as well as the devices actually found.
Fixes from the code audit
The duration of a finished measurement is computed from stored timestamps, stopping the mapping leaves no NetworkCallback hanging, and sensors deliver data on their own thread.
Maintenance that
stops dropping samples.
No new measurement feature. A version born from a code audit, fixing the reliability of collection, writing and export, and moving the format to V3.
Dropped samples on show
When writing falls behind, the count appears in the app and goes into the header as dropped_samples. Samples used to vanish unannounced; ending a measurement no longer loses the last of them either.
Ranges hold
A setting outside the allowed range is pulled back into it, so a zero interval no longer spins a scan with no pause.
A disabled Bluetooth is recognised
With the adapter off, the sources are not marked as measured and ADAPTER_DISABLED goes into the export instead of a blank.
Collection off the main thread
The GNSS, location, Wi‑Fi RTT and cellular callbacks run aside, so raw GNSS no longer slows the controls. The microphone is released only after the read completes.
Format V3
SIGNAL_COLLECTOR_TXT_V3 adds the dropped_samples header and drops the source_timestamp_ns column, which only duplicated elapsed_realtime_ns.
Schema 2 without losses
The database moves by migration and existing measurements survive. Temporary files created for sharing are cleaned up, so the cache no longer grows by a whole measurement.
Transfer quality,
measured continuously.
Alongside the one-off speed test there is now a per-second stream of samples of real download, upload and RTT — bound to a specific network and enriched with radio context.
A sample every second
The measurement runs from Start to Stop and produces roughly one network_quality_sample per second.
What a sample holds
A 64 KiB download, an 8 KiB upload and three small HTTPS RTT probes. The output carries the real transfer times, short-term throughput, RTT min/avg/max, jitter, errors and timeouts.
Capacity burst
Every 30 seconds a network_capacity_probe is produced with a 1 MiB download and a 128 KiB upload.
Forced transport
The test can be sent over a specific Wi‑Fi or cellular Android Network, even when both are available at once.
Radio and location with the sample
Every sample carries the last Wi‑Fi or cellular radio context and the last known location, including its age.
Quality, not a record
The small samples are labelled as measurements of quality over time, not of maximum internet speed. The server layer supports the CLOUDFLARE, CUSTOM and LOCAL modes.
Controls that
stay where they are.
A small interface release. Actions no longer move with the state of the measurement, the top bar gives room to the content, and a message can be dismissed when it is in the way.
Download and Share stay put
The buttons keep their place. Without a finished measurement they are dimmed and inactive, not hidden.
A vanishing top bar
It hides when you scroll down and comes back when you scroll up.
Recommend from the bar
Prepares a new e‑mail with no recipient filled in, carrying a subject, a message and links to the app.
Dismissible messages
Status notices are a bottom message that can be closed; otherwise they disappear on their own after a longer interval.
The storage note moved down
The note about local data storage now sits at the very bottom, visually subdued.
Active scan
and a measured speed test.
This version introduces an experimental active cellular scan with an exact reason for refusal, and a full speed test bound to the transport actually chosen.
Active scan events
Unambiguous ACTIVE_NETWORK_SCAN_REQUESTED, STARTED, RESULT, COMPLETE and FAILED instead of guessing support from the phone brand.
The exact reason for refusal
A failed scan stores the numeric code, the exception type, the message, the carrier privileges state and the state of the MODIFY_PHONE_STATE permission.
Kept apart from passive cells
The result carries scan_mode=ACTIVE_NETWORK_SCAN and only the operator Android supplied; an unknown one stays UNKNOWN.
A test over the chosen transport
Manually over MOBILE, WIFI or sequentially BOTH, with the traffic genuinely bound to the requested Android Network. The options offered follow the validated networks available.
A complete test summary
speed_test_result carries download and upload in Mb/s, bytes and times, the minimum, mean, median, maximum and p95 RTT, jitter, packet loss, errors and the server — together with the last cell or Wi‑Fi context.
Collection that survives
The measurement continues in the background through a foreground service, preferences survive a restart, and from an estimated 10 MB upwards the export preselects GZIP.
安裝
只透過
Google Play 安裝。
- 1
從 Google Play 安裝——不需要邀請、不需要測試者名單、不必等待。
- 2
每年最多可以免費量測一小時。
- 3
當這一小時不夠用時,隨時可以在應用程式裡解鎖無限量測。
Google Play 是唯一的散布通路:更新鏈由它簽章,任何地方都不提供直接下載的 APK。應用程式本身不需要我們的帳號,也不需要我們的伺服器才能運作。
試用、價格與支援
每年一小時,
讓你想清楚。
現場儀器沒辦法只看螢幕截圖就判斷,因此 Signal Collector 給每支手機每年一小時的量測時間——足夠走完一條路線、看著圓環填滿、打開匯出檔案。這一小時計算的是量測時間,不是次數,所以可以分成好幾天、在好幾個地點用掉。用完之後,解鎖是一次性的應用程式內購買,價格依你所在國家的 Google Play 定價:沒有訂閱、沒有續約日期,而且會延伸到每一支用同一個帳號登入的手機。
意見回饋透過 Google Play 的評論進行;每則新評論都會在一天之內被讀到、轉成議題並得到回覆,修正則搭上下一次更新。付費的應用程式在量測過程中沒有廣告、沒有分析,也沒有任何第三方 SDK——開發是由售價支撐的。
應用程式實際收集什麼
從實體感測器,
到你周圍的網路。
每個來源都可以在量測之前個別開啟或關閉,部分技術還可以設定間隔。
行動網路
服務中與鄰近的基地台、LTE/NR/3G/2G 參數、註冊變更,以及實驗性的主動掃描。
GNSS 與位置
1 Hz 的 GPS、衛星、GNSS 原始量測值、時鐘、AGC、導航訊息、NMEA 與天線資訊。
Wi‑Fi 與 RTT
目前的連線、附近的 AP、Wi‑Fi 7 MLO、能力資訊,以及到支援的存取點的 RTT/FTM 測距。
Bluetooth
傳統裝置探索與 BLE 廣播負載,包含製造商資料與服務資料。
感測器與噪音
動作、磁場、氣壓、光線、接近、旋轉向量,以及參考性的 dBFS 值,且不儲存任何音訊。
網路與傳輸
每秒一次的實際下載、上傳、RTT、抖動與逾時取樣,30 秒的容量突發,以及同時綁定特定的 Wi‑Fi 與行動網路。
SIM 與 eSIM
卡槽、電信業者、MCC/MNC、漫遊,以及哪張卡承載數據——基地台本身指出的是發射端,不是誰在看它。ICCID 與 EID 都不記錄:那是固定不變的門號編號,連換手機都不會改變。
外部感測器
不在手機裡的
感測器。
手機量測它搆得到的東西。牆上的探頭、接在纜線上的儀表、屋頂上的接收器——這些得靠別的途徑進來。進來的途徑有四條,第一條已經可以用了。
會廣播的感測器 · 現已可用
BTHome、Ruuvi、ATC 與 pvvx、Eddystone 遙測。不必配對,也不必連線:感測器把讀數喊進空間裡,正在進行的掃描就聽得到。溫度、濕度、氣壓、CO₂、懸浮微粒、電壓——帶著名稱、以 SI 單位,寫在和其他資料同一個檔案裡。
Bluetooth LE 設定檔 · 規劃中
Environmental Sensing 會描述自己的量測值,因此就算是沒人聽過的儀表,也能連同單位一起讀出來。旁邊還有標準設定檔——電池、溫度計、位置——以及 Nordic UART 服務,自製探頭多半就是用它說話。
纜線上的序列埠 · 規劃中
CDC-ACM、FTDI、CP210x、PL2303、CH340。這五類晶片幾乎涵蓋所有插上 USB 而又不是磁碟的裝置:Arduino 與 ESP32 開發板、u-blox 接收器、頻譜分析儀,以及用 SCPI 回應的儀表。
區域網路上的裝置 · 規劃中
透過 mDNS 找到,用 HTTP 或單純的 TCP 串流讀取。請求會綁定到 Wi-Fi 網路,因此不會從行動數據送出,也不會在前往隔壁房間那台機器的路上迷路。
什麼都不用猜。感測器自己標記為無效的讀數會被略過,而不是寫成一個數字;加密的負載會記為加密,而不是被解讀成虛構的內容;應用程式不認得的格式會以原始位元組留在檔案裡。所有鍵值都列在 資料字典.
應用程式之外的控制
不必先開啟應用程式的
按鍵。
在現場量測,往往一隻手拿手機,另一隻手忙別的。因此每一個重要的控制項在應用程式之外都有位置,而且送出的指令與畫面上按下去的完全相同。
量測面板
這個小工具會啟動存在它裡面的來源組合與間隔。執行時它會如實顯示,並帶著這次量測的數字;再點一下會先詢問,然後才停止。按鍵保留自己啟動內容的副本,因此之後在應用程式裡切換預設組合,不會悄悄改變主畫面量測的東西。
標記測點
最多四個你自己的標籤並排——門口、轉角、窗戶各點一下,立刻寫進測點。沒有量測進行時,這個按鍵會一次完成開始量測與標記測點。
來源方塊
一個來源,一個大數字:範圍內的存取點、定位中的衛星、音量。沒有量測進行時點一下,就只用這個來源開始一次量測。
來源讀數
最多六個來源,每個一行,照你挑選的順序排列——這份清單是拿來一眼讀完的,不是拿來找的。
快速設定裡的方塊
在任何應用程式中、在鎖定畫面上都能開始與停止。它會沿用應用程式上次量測的設定。在有安全鎖的鎖定畫面上,它會要求先解鎖手機:畢竟啟動的是位置加上麥克風。
圖示底下的捷徑
沒有量測進行時,長按應用程式圖示會提供「開始」;有量測進行時則是「停止」與「標記測點」。這樣標記的測點沒有標籤——標籤在小工具按鍵上,那裡才有位置放。
通知
量測時,它帶著時長、紀錄筆數與已走距離,下方是「標記測點」與「停止」。沒有量測進行的整段時間裡,「開始」都可以留在通知欄,因此分段進行的量測不必每次都去找應用程式。
按鍵由量測本身每五秒重繪一次——小工具不可能比餵給它資料的應用程式更即時。因此每個按鍵都標著讀取數字的時間;碼錶是例外,它自己走。這些全都在同一個地方設定, 主畫面按鍵 ,就在設定選單裡,說明則在 說明.
現場驗證,2026 年 8 月 10 日
來自一支真實
手機的資料。
以下的一切都是在執行 Android 16 的 Google Pixel 10a 上量測的。在 0.7.2 版上,一次分成三段進行的量測收集了 87,597 筆紀錄:時長從 2:49 經過 7:21 增加到 8:12,量測編號始終沒變,三段之間超過二十分鐘的停頓也沒有計入時長。距離數字來自同一支手機上 0.7.1 版的九分鐘量測——距離濾除的規則自此沒有改變。
最初的 274 次定位精度介於 9 到 114 公尺之間。把相鄰定位之間的距離全部相加會得到 429 公尺,濾掉粗略定位之後是 28 公尺;把錨點移過門檻值之後得到零。測試手機沒有 SIM,因此測繪的行動網路分支正確地回報網路無法使用。
版本與資料
安裝、變更
與原始碼。
儲存庫維持私有。已登入的協作者可以在裡面找到原始碼、標記過的版本與 APK 檢查碼。
隱私
量測資料絕不離開手機。
應用程式離線運作,不含任何分析、廣告、歸因或當機回報 SDK——將來也不會加入。應用程式所使用的每一個函式庫都 列在隱私權政策裡,每一個都固定在確切的版本,因此內部的任何變動都一定伴隨一次載明此事的發行。選用的傳輸品質連續測繪,會使用公開的 Cloudflare Speedtest 端點進行小量的測試 HTTPS 傳輸與定期突發;它不是最高網速的量測。這個模組預設關閉。如果你購買解鎖,會有一份購買回報離開手機,其中不含任何量測資料;相關說明在 隱私權政策。匯出檔案可能包含敏感的位置資料與附近網路的識別碼。
運作方式
從一個感測器,
到檔案裡的一列。
每個來源都以自己的節奏執行。取樣會蓋上時間與最後已知位置,通過不阻塞的佇列,再分批寫入本機資料庫。圖中加底線的鍵值會連到 資料字典.
收集設定
這些就是應用程式在量測開始之前,為每個來源提供的參數。範圍與資料量估計與實作一致;有任何變動都會立刻反映在上方的圖裡。
範圍 10–1000 ms
範圍 100–60000 ms
範圍 5–300 秒
範圍 5–60 秒
範圍 5–300 秒
網際網路測繪連續量測使用的網路
兩者都選時,會同時使用兩個各自獨立的 Android Network 控制代碼。
範圍 500–5000 ms
範圍 1–1024 KiB
範圍 1–256 KiB
範圍 10–300 秒
範圍 64–10240 KiB
範圍 8–2048 KiB
這個估計是上限:連線較慢時,每次取樣花的時間較長,同樣的時間裡取樣數較少,傳輸的資料也較少。這不是最高速度的量測—— 原因.