I haven't developed on iOS but I remember reading someplace that when an app is loading it can display an image of what it looked like when the user most recently left it, in order to give the appearance of loading more quickly. I think it was one of Marco Arment's blog posts, but his site isn't available right now.
Anyway I also don't have an iPhone 4, but FaceTime for OS X shows the camera view whenever it's on so that you can see yourself whenever starting a call. I imagine FaceTime for iOS does something similar.
If you combine those two things, you get one possible explanation for what's going on. One that's pretty benign, but should probably still be avoided because it obviously spooks users. Oh, and it should probably be at the API level so that the last thing an app saves is never camera data.
That's not what's going on here. Some of the pictures that it's been showing me have come from times that I definitely wasn't using facetime (one was from while I was driving, even). Something is triggering it to take a picture, but it's not facetime.
I've got a cheap Samsung phone that takes phantom photos too. Why I'm not worried?
A: It's front-facing, so it's never of me.
B: The phone is completely worthless, so it never takes decent photos anyways. (Generally of my pocket.)
The only reason people are spooked is that Apple has higher expectations (also, tribal instinct). My buddy's Nexus phone module will crash constantly, requiring a reboot before use of the camera. His response: "Eh, whatever."
Other than saying my friend is a casual user of Android, I see nothing in my statement that bashes either Apple or Android. (Samsung, on the other hand...)
Apparently one camp or the other is fairly touchy.
It would be nice if someone could look into the iPhone's exact behavior in this regard. The FaceTime app on the new iPad doesn't seem to save an actual camera image with the screenshot on quitting. The UI comes up but the whole screen is just dark for a split second before it displays the live camera image. This is true whether you quit the app explicitly or just quickly close it and come back.
The built-in Mail app does this (stored screenshot of current app state), but 3rd-party apps do not have this ability.
3rd-party apps can display a single static image (default.png) on boot. It is common for this image to be a screenshot of the UI without any content (e.g. nav bar, toolbars, but no buttons or data) in order to give the impression of a faster/more-progressive loading process.
I don't know how it is implemented under the hood, but Facetime on iOS does not appear to be a separate app (from the user perspective, at least). Someone who has jailbroken their phone and inspected the filesystem may be able to speak to this point more directly.
Fast app switching, depending on memory availability, does sometimes freeze an app and save state to stable storage. It's possible that this is a source of the rogue image data. A quick test with Instagram suggests that the camera is disabled when an app is "backgrounded." Perhaps Apple's built-in apps (e.g. Phone, Facetime) behave differently.
it's an app that comes with xcode. you start it on your mac and attach it to your iphone & it will show you things like activity monitor does, but for your phone.
This does happen: iOS writes a snapshot of the screen when an app moves to the background. You can notice that when you open an app that you ran recently and a stale, slightly artifacted screen appears briefly before updating. That's the snapshot.
But this is at the OS level, an app has no control over it, and it's irrelevant for the whole camera thing.
Apps created outside of Apple and in the App Store have no way to change what graphic is shown when the app is launching. You can display a static image (Default.png), but that cannot be dynamically modified later.
This is irrelevant. The bug happens specifically while using Facetime, an Apple app, so it might be feasible for it to set the last image as the launch image. Also, Apple is notorious for using undocumented APIs in their own apps.
> "I haven't developed on iOS but I remember reading someplace that when an app is loading it can display an image of what it looked like when the user most recently left it"
He noted that was a trick the built-in apps use, that third party apps cannot. IIRC it was in the context of wishing that third party developers were allowed to do the same thing.
While I can't consistently reproduce this issue, I was able to get FaceTime to show up with some random image of myself in the preview of my FaceTime call.
Basically:
1. Open the camera app and flip the camera to yourself.
2. Close the camera app, and call yourself on your Mac's FaceTime app.
3. The image that showed up was of me frozen, from just a few moments prior when I flipped the camera around.
When I first saw this post, I attempted to call a friend, and saw exactly what that first poster in Apple discussions saw, a black screen.
After rebooting it's all "fine" now. (I'm running 4.3.1)
If it turns out that one of the installed apps was taking pictures without the user's knowledge, then that's one reason to like the permissions that Android shows you for every app you install: No app can take a picture without requesting the proper camera permissions, and I'm not going to install a game or a music player that requests camera permissions (or anything else totally unnecessary). (For those who don't know, the list of permissions an app requests is presented to you before you install any app.)
iPhone/iPod/iPad users can correct me if I'm wrong and iOS pops up some kind of warning when an app turns on the camera -- I know it pops up a warning under some circumstances at least.
Unless I'm mistaking, an API that let's an app take pictures without the display betraying what's going on doesn't even exist. I don't even think any API exists to take pictures — that doesn't involve the touch of a finger on the display.
Yes, there is an api to take a picture without pressing the screen. It's called -(void) takePicture and it's part of the uiimagepickercontroller class.
If I remember correctly, Color is eventually planning to passively gather audio information as you walk around in order to better know where you're at and what you're doing. Wouldn't it be funny if it was the app causing this?
They do this already. It allows the phone to detect whether you're in the same place as someone else: if two phones are hearing similar sound, then you're likely to be next to each other. Color shows you photos taken by people near you. Audio is one signal for detecting who's near.
Note: GPS sometimes doesn't work indoors, where there's no line of sight to the satellites in the sky. Cell towers and Wi-Fi work, but aren't as precise.
Huh. Depending on what they do with the audio input, that might be illegal in Massachusetts. (Our wiretap law requires all parties to consent, and it applies to any covert audio recording, not just phone conversations.)
The last post in the thread makes it sound as though an app wasn't even on the display when it happened ("I hit the button to see if anyone called me (no one did) and drove off" - and then later the picture is of him when he hit the button). iOS wizards: if you have an app up, hit the screen lock, and then later hit the home button, is the app unfrozen then, or does it wait until you unlock? I would guess waiting for the unlock based on how it looks on my iphone.
If it does wait til you unlock, it's probably an iOS bug. If it doesn't, let's look askance at their list of installed applications, particularly the ones that use the camera and that people were likely to have been using shortly before locking their screen (a guess, based on their lists: facebook).
The iPhone doesn't issue a warning when the camera is turned on. Like the others though, I've never seen a case where an app took a picture without showing me the camera and hitting a button myself, so I don't know what's going on.
And I doubt permissions would fix anything for most users - users tend to agree to anything.
"there is no indication to the user at all that the camera is in use unless the app provides its own. There is no permission alert, nor any LED indicator like a webcam. An app could secretly be recording your face with the iPhone 4′s front-facing camera and sending it to who knows where."
As a fellow iOS developer, I believe this is true. It's pretty amusing that there's a guy on the Apple Discussions forum claiming that this is impossible. Actually, it's very possible.
This does seem most likely, but the other thing is that this previous image data is from times when no-one was using the camera. So the question is where did the previous image data come from?
My first guess at an explanation would be that the camera is actually a self-contained little image/video engine that's "running" (i.e., capturing images internally) anytime the phone is powered up, and that under certain circumstances tickled by FaceTime, polling the camera engine results in a cached frame getting kicked out of a camera-internal buffer.
Mind you, that's based on absolutely no actual understanding of the hardware, software or APIs involved.
I don't know if this is malware, but I wouldn't be surprised at all.
In fact I'm surprised it isn't happening more often (especially to jailbroken iPhones and Android devices), it seems that smartphones are a perfect target.
Two reasons: Apple's approval process and the paper trail.
The approval process, while not guaranteed to catch malware, serves as a deterrent to evildoers because they know that at least some review will be made of their app, functionally as well as on an API-level.
There is a paper trail from each app to the developer responsible for it. When your app gets caught, you get caught.
It'd take a remarkably stupid evildoer to develop malware and submit it for Apple approval. It's less of a hassle and much less risky to be evil using other traditional channels, with no oversight; like exploiting browser bugs, building native programs that don't require neither the paper trail or an approval process (maybe masking as a "driver" or a "plugin" you need to watch some shady porn or whatever), spam, fraud and other schemes, etc.
For these reasons, it doesn't surprise me that we've seen no malware on iOS.
I know, that's why I said jailbroken iOS and Android.
* Jailbroken users get their apps from third party sources and there are no more guarantees.
* Android Market doesn't do malware checks (yet), and there was an issue with malware recently.
Still, not even the AppStore is perfect: somone snuck in a tethering app disguised as a flashlight, if I remember correctly and there was a problem with a book vendor that was gaming the top lists.
Right, but neither of those hurt users, so not malware without stretching the definition of the word.
I don't think malware on jailbroken iOS or Android happens much because most people who jailbreak are technically savvy. Also, they're a relatively tiny minority.
If the App store approval process didn't catch a friggin tethering app disguised as a flashlight app, it seems highly unlikely it's gonna be any barrier to malware.
If they can't build the permissioning around their apps immediately, it will be a good idea to list the phone resources (camera, voice, speakers, etc) that an app uses on the app store page.
Anyway I also don't have an iPhone 4, but FaceTime for OS X shows the camera view whenever it's on so that you can see yourself whenever starting a call. I imagine FaceTime for iOS does something similar.
If you combine those two things, you get one possible explanation for what's going on. One that's pretty benign, but should probably still be avoided because it obviously spooks users. Oh, and it should probably be at the API level so that the last thing an app saves is never camera data.