Skip to content

Android app

The Android app lives in Apps/Android/. It is an early phone shell: pairing, HEVC live view, GPU looks, scopes, camera writes, and media. It is not on Google Play yet. Join the closed-beta waitlist on openpocketcine.app. iOS is the daily driver.

Business logic stays in OpenPocketViewCore. Android follows the OpenZCine pattern, not Skip/SKIE:

  1. Portable Swift core (no SwiftUI, UIKit, or Android imports).
  2. OpenPocketCineAndroidFacade — session + hand-written JNI (@_cdecl).
  3. Gradle :app:stageSwiftCore (just android-core) builds aarch64-unknown-linux-android29 and stages libOpenPocketCineAndroid.so. arm64-v8a only. Toolchain pin: Swift 6.3.3.
  4. Kotlin core-api wraps JNI. Kotlin does not pack protocol bytes.

Build recipes: Setup. The living JNI/I/O notes: ANDROID.md.

Chrome, assists, capture, Operator Setup, and media are meant to match iOS. The gimbal stick and zoom chip sit together as a cluster in the trailing-bottom of the picture, same as iOS. D-Log2 cannot zoom while rolling — the chip grays and tap/pinch toast; idle still hops to D-Log off 1×. Long-press LUT for the same exposure compensation as iOS (−3…+3 at ½ stop, input-referred before the cube). Next/prev with LUT on keeps the grade on the same GLES host (ExoPlayer writes an OES surface; LUT / PEAK / FALSE / ZEBRA grade in LiveFeedEffectsSession like live — TextureView is only the window). Auto on a clip reads com.dji.camera.ColorGammaSxS from the original take like iOS — not the LRF/XRF sidecar (Rec.709 even for log). Shot color is stored with the cached clip. A Proxy tag means only the 720p sidecar is on the phone. Storage Full Resolution Caching matches iOS. Share/save is the original camera file — LUT bake (and Bake exposure) is iOS only. Exceptions (Frame.io, MetalFX, iOS 26 Liquid Glass, …) are listed in docs/PARITY.md.

Live picture: Vulkan when the device can init it; GLES fallback. HUD liquid glass is Kyant on API 33+ / ≥4 GB; older or low-RAM devices stay on solid frost. Present path matches iOS FeedPresentPolicy (skip duplicate timestamps, keep the last frame on freeze, one live-enable write at a time).

Wi-Fi passwords stay in Keystore, not saved-camera JSON. Pairing and live view need a physical Android phone.

Nikon PTP-IP, AccessorySetupKit, OCR SSID scanner, USB-C/HDMI paths.