2

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

然而,正如我被告知并观察到的那样,并非所有芯片组都支持所有参数。

例如,Nexus 4 (Qualcomm) 有锐度和锐度-max 参数,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 参数,如下所示:数据库

4

1 回答 1

2

好吧,认为这将是一个有趣的练习。因此,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;
}
于 2013-09-08T04:06:51.810 回答