Camera: Prevent crash with prebuilt camera metadata
* Some devices need prebuilt camera metadata along with
prebuilt libcameraservice for propreitary interfaces
implemented by OEM.
* However, Prebuilt camera metadata of 12.0 crashed on 12.1
since exceptions weren't handled properly. Fix it.
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 53c6868..9523c2c 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -592,31 +592,35 @@
}
private <T> T getBase(Key<T> key) {
- int tag;
- if (key.hasTag()) {
- tag = key.getTag();
- } else {
- tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName());
- key.cacheTag(tag);
- }
- byte[] values = readValues(tag);
- if (values == null) {
- // If the key returns null, use the fallback key if exists.
- // This is to support old key names for the newly published keys.
- if (key.mFallbackName == null) {
- return null;
+ try {
+ int tag;
+ if (key.hasTag()) {
+ tag = key.getTag();
+ } else {
+ tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName());
+ key.cacheTag(tag);
}
- tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName);
- values = readValues(tag);
+ byte[] values = readValues(tag);
if (values == null) {
- return null;
+ // If the key returns null, use the fallback key if exists.
+ // This is to support old key names for the newly published keys.
+ if (key.mFallbackName == null) {
+ return null;
+ }
+ tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName);
+ values = readValues(tag);
+ if (values == null) {
+ return null;
+ }
}
- }
- int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag);
- Marshaler<T> marshaler = getMarshalerForKey(key, nativeType);
- ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
- return marshaler.unmarshal(buffer);
+ int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag);
+ Marshaler<T> marshaler = getMarshalerForKey(key, nativeType);
+ ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());
+ return marshaler.unmarshal(buffer);
+ } catch (Exception e) {
+ return null;
+ }
}
// Use Command pattern here to avoid lots of expensive if/equals checks in get for overridden