Prototype camera and media guide¶
Camera input, media-library imports and simulated prototype state have different assertion boundaries. The captures below establish runtime prerequisites and library seeding, not completed prototype scenarios.
Support matrix¶
The matrix covers Android emulators on API 36 google_apis and
google_apis_playstore (AOSP evidence is API 30) and the iOS Simulator.
injected identifies a fixture route; simulated-only identifies synthetic
input. Neither label asserts an end-to-end prototype run. Physical devices are
not covered.
| Feature / runtime boundary | Android emulator | Physical Android | iOS Simulator | Physical iPhone |
|---|---|---|---|---|
| Default back-camera scene (API 36) | simulated-only | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
| Front-camera capture (captured config) | unsupported | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
Exact camera fixture (imagefile: / videofile:) |
injected | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
| Virtual-scene QR poster | simulated-only | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
| Media library seeding | injected | unverified, needs account/hardware | injected | unverified, needs account/hardware |
| Photo Picker / PHPicker selection | unverified | unverified, needs account/hardware | unverified | unverified, needs account/hardware |
| Library-image barcode detection | unverified | unverified, needs account/hardware | unverified | unverified, needs account/hardware |
| VisionKit DataScanner | unverified | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
| NFC reading | unsupported | unverified, needs account/hardware | unsupported | unverified, needs account/hardware |
| Microphone capture / audio injection | unverified | unverified, needs account/hardware | unverified | unverified, needs account/hardware |
| Speech recognition | unverified | unverified, needs account/hardware | unverified | unverified, needs account/hardware |
Setup and evidence boundaries¶
| Feature | Setup or captured evidence | Assertion boundary |
|---|---|---|
| Default camera | Both API 36 AVD configs have hw.camera.back=emulated, hw.camera.front=none; dumpsys media.camera reports one back device, as does AOSP API 30. |
Synthetic frames are smoke-level. A hardware-feature declaration does not establish a front camera in this config. |
| Camera fixture modes | emulator -help-camera-back lists emulated, webcam<N>, environment, imagefile:<filename>, videofile:<filename>, image360:<filename>, none. environment uses the AVD’s environment.ini. At launch, select an exact fixture with -camera-back imagefile:/absolute/photo.png or -camera-back videofile:/absolute/clip.mp4. |
imagefile: / videofile: are deterministic input routes for exact fixture assertions; mode availability is not a completed scan. Webcam and 360-image behavior were not exercised. |
| Virtual-scene poster | On a running Android emulator already configured with a virtual-scene back camera, use setDeviceState {cameraPoster:{mode:"qr",text:"ticket",surface:"wall"}}. Image mode accepts mode:"image",path:"/absolute/poster.png"; clear uses mode:"clear". Surface is wall (default) or table; image paths must name an existing PNG/JPG/JPEG without whitespace. |
The source uses the console’s virtualscene-image command. Console acceptance cannot confirm visibility: camera pose may face away. Poster frames remain smoke-level. The tool is not exercised. |
| Android library import | putAppFile {target:{domain:"media_library"},files:[{sourcePath:"/absolute/photo.png",destinationPath:"photo.png"}]} stages media and verifies MediaStore discovery. A lower-level push to /sdcard/Pictures/ plus MEDIA_SCANNER_SCAN_FILE also produces an indexed MediaStore image row. |
An indexed row establishes seeding. It does not establish picker selection or byte equality; compare pulled bytes for exact file assertions. Current Android tool reads are bounded to Download/automobile-media. |
| Android picker | API 36 PICK_IMAGES resolves to the system Photo Picker activity. API 30 AOSP has no PICK_IMAGES activity; GET_CONTENT image/* resolves to com.android.documentsui/.picker.PickActivity. |
Intent resolution is not a picker UI run. Use the API 30 content-picker fallback rather than assuming the newer picker exists. |
| iOS library import | The same putAppFile target imports images/videos through simctl addmedia on a Simulator. Imported media appears in Photos. |
Photos visibility is established; PHPicker selection is not. The tool exposes no bounded iOS media-library enumeration/read for pulling imported bytes. |
| Permissions | setAppPermissions {appId:"com.example.app",action:"grant",permissions:["photos"],platform:"ios"} requests Photos access; camera and microphone use their named iOS permissions. Android uses its runtime permission names, such as android.permission.CAMERA and android.permission.RECORD_AUDIO. |
simctl privacy <udid> grant photos <bundle> pre-grants full library access; photos-add and media-library are separate services. Confirm the app’s full-access state before assuming the Photos prompt is gone. Denied statuses from the bundle-less CLI probe do not describe an app’s authorization. |
| iOS camera and scanner | The Simulator exposes no video devices, has no Camera app, and DataScanner reports itself unsupported and unavailable. | Camera capture and DataScanner are unsupported on this Simulator. Use Vision VNDetectBarcodesRequest on a library image as the alternative path; barcode behavior was not exercised. |
| NFC | No NFC/HCE features on either API 36 Android image; API 30 AOSP also has no NFC feature. iOS NFCNDEFReaderSession.readingAvailable is false. |
No hardware NFC scenario is established by these virtual runtimes. |
| Audio and speech | injectAudioInput {file:"/absolute/voice.wav"} accepts uncompressed PCM WAV; alternatively use tone:{frequencyHz:1000,durationMs:2000}, never both. Android uses the local emulator gRPC audio route; iOS requires a host loopback default input shared by all Simulators, with one injection per host. Physical devices are refused. Grant the app microphone permission separately. SFSpeechRecognizer.isAvailable can be true on the Simulator. |
Injection, recording and transcription are not exercised. An available recognizer or input device does not establish a working voice-note flow. |
| Prototype time simulation | prototype {action:"simulate",id:"demo",advanceTimeMs:1000} advances prototype timers (integer 1–3600000 ms), subject to the connected runtime’s timer capability. |
This is timer simulation, not a camera, media-result or speech injection route. |
Photo Picker and PHPicker UI behavior remains unverified. PhotosUI framework presence is not evidence of PHPicker behavior; the bundle-less CLI’s PHPicker class lookup is not an app-level support test. Granting Photos access also does not create a camera or install a Camera app on the Simulator.
Scenario boundaries¶
| Scenario | Intended route | Captured acceptance |
|---|---|---|
| Post photo | Seed the media library, select through the platform picker, then compare the resulting file with the fixture where readable. | Not exercised; physical-device runs are unverified, needs account/hardware. |
| Scan ticket | Android exact input uses imagefile: / videofile:; virtual-scene posters provide a smoke route. On iOS Simulator, decode a library image with Vision instead of DataScanner. |
Not exercised; physical-device runs are unverified, needs account/hardware. |
| Voice note | Grant microphone permission, inject a known WAV where supported, record and inspect the resulting audio. | Not exercised; physical-device runs are unverified, needs account/hardware. |