我有一个应用程序,它以编程方式设置相机的硬件参数。
然而,据我所知,并且观察到,并非所有芯片组都支持所有参数。
例如,Nexus 4(高通)具有清晰度和清晰度最大参数,而 Galaxy Note II 3g 则没有。
因此,当我设置清晰度参数时,Nexus 响应良好,但 Galaxy Force 关闭:
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1452)
我的问题是,如何以编程方式获取 RAW 信息?我需要获取参数、它们的值以及它们是否存在。
我希望获取 RAW-Metadata 参数,如下所示:database http://androidfragmentation.com/database/v/dr/622899/oem/HTC/dm/HTC%20Explorer%20A310e/carrier/TATA%20DOCOMO
好吧,我想这会是一次有趣的练习。因此,Android 并未提供此信息的公共 API。为什么?我不知道。看起来你可以做一个Camera.Parameters#get(String)
检查您感兴趣的任何特定参数,但假设您很贪婪并且想要自己拥有整个列表。在这种情况下,我们可以深入使用反射,但要注意这很有可能不适用于所有版本的 Android,或者可能会在未来版本中崩溃。话虽如此,您可以这样做:
private static Map<String, String> getFullCameraParameters (Camera cam) {
Map<String, String> result = new HashMap<String, String>(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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)