diff options
| author | 2017-03-24 17:28:54 +0000 | |
|---|---|---|
| committer | 2017-03-24 17:28:59 +0000 | |
| commit | d81542cef49b152f0505a5d537cac68b40aa6259 (patch) | |
| tree | 54f3b1fd4bd1637dfec1d9bad99dac56dc0bed29 | |
| parent | 3c9d3bc99b043cabbcab67c62159195da7e164e6 (diff) | |
| parent | 5da9e9495daf0cd1d353f1cdb9983908997bdfe3 (diff) | |
Merge "Partially return NEW_PICTURE and NEW_VIDEO."
| -rw-r--r-- | api/current.txt | 2 | ||||
| -rw-r--r-- | api/system-current.txt | 2 | ||||
| -rw-r--r-- | api/test-current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/hardware/Camera.java | 29 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 27 |
5 files changed, 32 insertions, 30 deletions
diff --git a/api/current.txt b/api/current.txt index b400b34170de..f8c1c6a2ca30 100644 --- a/api/current.txt +++ b/api/current.txt @@ -14463,7 +14463,7 @@ package android.hardware { method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void unlock(); - field public static final deprecated java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; + field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO"; field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2 field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64 diff --git a/api/system-current.txt b/api/system-current.txt index 844b897e4507..65588fb7a9a1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -15188,7 +15188,7 @@ package android.hardware { method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void unlock(); - field public static final deprecated java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; + field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO"; field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2 field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64 diff --git a/api/test-current.txt b/api/test-current.txt index a73ac18ac0c7..8262223c033c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -14512,7 +14512,7 @@ package android.hardware { method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback); method public final void unlock(); - field public static final deprecated java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; + field public static final java.lang.String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; field public static final deprecated java.lang.String ACTION_NEW_VIDEO = "android.hardware.action.NEW_VIDEO"; field public static final int CAMERA_ERROR_EVICTED = 2; // 0x2 field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64 diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index acf0677559fd..061346c18bbe 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -178,24 +178,39 @@ public class Camera { private static final int NO_ERROR = 0; /** - * @deprecated This broadcast is no longer delivered by the system; use - * {@link android.app.job.JobInfo.Builder JobInfo.Builder}.{@link android.app.job.JobInfo.Builder#addTriggerContentUri} - * instead. * Broadcast Action: A new picture is taken by the camera, and the entry of * the picture has been added to the media store. * {@link android.content.Intent#getData} is URI of the picture. + * + * <p>In {@link android.os.Build.VERSION_CODES#N Android N} this broadcast was removed, and + * applications are recommended to use + * {@link android.app.job.JobInfo.Builder JobInfo.Builder}.{@link android.app.job.JobInfo.Builder#addTriggerContentUri} + * instead.</p> + * + * <p>In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought + * back, but only for <em>registered</em> receivers. Apps that are actively running can + * against listen to the broadcast if they want an immediate clear signal about a picture + * being taken, however anything doing heavy work (or needing to be launched) as a result of + * this should still use JobScheduler.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - @Deprecated public static final String ACTION_NEW_PICTURE = "android.hardware.action.NEW_PICTURE"; /** - * @deprecated This broadcast is no longer delivered by the system; use - * {@link android.app.job.JobInfo.Builder JobInfo.Builder}.{@link android.app.job.JobInfo.Builder#addTriggerContentUri} - * instead. * Broadcast Action: A new video is recorded by the camera, and the entry * of the video has been added to the media store. * {@link android.content.Intent#getData} is URI of the video. + * + * <p>In {@link android.os.Build.VERSION_CODES#N Android N} this broadcast was removed, and + * applications are recommended to use + * {@link android.app.job.JobInfo.Builder JobInfo.Builder}.{@link android.app.job.JobInfo.Builder#addTriggerContentUri} + * instead.</p> + * + * <p>In {@link android.os.Build.VERSION_CODES#O Android O} this broadcast has been brought + * back, but only for <em>registered</em> receivers. Apps that are actively running can + * against listen to the broadcast if they want an immediate clear signal about a video + * being taken, however anything doing heavy work (or needing to be launched) as a result of + * this should still use JobScheduler.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @Deprecated diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 34375125d7aa..4fc60f9e0c43 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19032,26 +19032,13 @@ public class ActivityManagerService extends IActivityManager.Stub break; case android.hardware.Camera.ACTION_NEW_PICTURE: case android.hardware.Camera.ACTION_NEW_VIDEO: - // These broadcasts are no longer allowed by the system, since they can - // cause significant thrashing at a crictical point (using the camera). - // Apps should use JobScehduler to monitor for media provider changes. - Slog.w(TAG, action + " no longer allowed; dropping from " - + UserHandle.formatUid(callingUid)); - if (resultTo != null) { - final BroadcastQueue queue = broadcastQueueForIntent(intent); - try { - queue.performReceiveLocked(callerApp, resultTo, intent, - Activity.RESULT_CANCELED, null, null, - false, false, userId); - } catch (RemoteException e) { - Slog.w(TAG, "Failure [" - + queue.mQueueName + "] sending broadcast result of " - + intent, e); - - } - } - // Lie; we don't want to crash the app. - return ActivityManager.BROADCAST_SUCCESS; + // In N we just turned these off; in O we are turing them back on partly, + // only for registered receivers. This will still address the main problem + // (a spam of apps waking up when a picture is taken putting significant + // memory pressure on the system at a bad point), while still allowing apps + // that are already actively running to know about this happening. + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + break; case android.security.KeyChain.ACTION_TRUST_STORE_CHANGED: mHandler.sendEmptyMessage(HANDLE_TRUST_STORAGE_UPDATE_MSG); break; |