如何以编程方式获取Camera RAW元数据信息Android

我有一个应用程序,它以编程方式设置相机的硬件参数。

但是,正如我所知,并且已经开始观察,并非所有芯片组都支持所有参数。

例如,Nexus 4(Qualcomm)具有清晰度和sharpness-max参数,Galaxy Note II 3g没有任何。

因此,当我设置锐度参数时,Nexus响应良好,但Galaxy力量关闭:

java.lang.RuntimeException: setParameters failed at android.hardware.Camera.native_setParameters(Native Method) at android.hardware.Camera.setParameters(Camera.java:1452) 

我的问题是,如何以编程方式获取RAW信息? 我需要获取参数,它们的值以及它们是否存在。

我希望得到RAW-Metadata参数,如下所示: 数据库

好吧,认为这将是一个有趣的练习。 因此,Android不会将此公共API提供给此信息。 为什么? 我不知道。 看起来你可以做一个Camera.Parameters#get(String)来检查你感兴趣的任何特定参数,但是让我们说你很贪婪并想要整个列表给自己。 在这种情况下,我们可以深入使用Reflection,但请注意, 这很可能不适用于所有Android版本,或者可能会在未来版本中出现问题 。 话虽如此,这是你如何做到这一点:

 private static Map getFullCameraParameters (Camera cam) { Map result = new HashMap(64); final String TAG = "CameraParametersRetrieval"; try { Class camClass = cam.getClass(); //Internally, Android goes into native code to retrieve this String of values Method getNativeParams = camClass.getDeclaredMethod("native_getParameters"); getNativeParams.setAccessible(true); //Boom. Here's the raw String from the hardware String rawParamsStr = (String) getNativeParams.invoke(cam); //But let's do better. Here's what Android uses to parse the //String into a usable Map -- a simple ';' StringSplitter, followed //by splitting on '=' // //Taken from Camera.Parameters unflatten() method TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(';'); splitter.setString(rawParamsStr); for (String kv : splitter) { int pos = kv.indexOf('='); if (pos == -1) { continue; } String k = kv.substring(0, pos); String v = kv.substring(pos + 1); result.put(k, v); } //And voila, you have a map of ALL supported parameters return result; } catch (NoSuchMethodException ex) { Log.e(TAG, ex.toString()); } catch (IllegalAccessException ex) { Log.e(TAG, ex.toString()); } catch (InvocationTargetException ex) { Log.e(TAG, ex.toString()); } //If there was any error, just return an empty Map Log.e(TAG, "Unable to retrieve parameters from Camera."); return result; }