Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式获取相机原始元数据信息_Java_Android_Android Camera - Fatal编程技术网

Java 如何以编程方式获取相机原始元数据信息

Java 如何以编程方式获取相机原始元数据信息,java,android,android-camera,Java,Android,Android Camera,我有一个应用程序,可以通过编程设置相机的硬件参数 然而,正如我被告知并观察到的,并非所有的芯片组都支持所有参数 例如,Nexus 4(高通公司)有清晰度和清晰度最大参数,Galaxy Note II 3g没有 因此,当我设置锐度参数时,Nexus响应良好,但星系力关闭: java.lang.RuntimeException: setParameters failed at android.hardware.Camera.native_setParameters(Native Method) at

我有一个应用程序,可以通过编程设置相机的硬件参数

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

例如,Nexus 4(高通公司)有清晰度和清晰度最大参数,Galaxy Note II 3g没有

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

java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1452)
我的问题是,如何以编程方式获取原始信息?我需要得到参数,它们的值,以及它们是否存在


我希望获得原始元数据参数,如下所示:

好吧,我想这将是一个有趣的实践。因此,安卓系统没有为这些信息提供公共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;
}
私有静态映射getFullCameraParameters(摄像头){
映射结果=新的HashMap(64);
最终字符串标记=“CameraParametersRetrieval”;
试一试{
类camClass=cam.getClass();
//在内部,Android进入本机代码来检索这个值字符串
方法getNativeParams=camClass.getDeclaredMethod(“native_getParameters”);
getNativeParams.setAccessible(true);
//轰,这是硬件上的原始字符串
字符串rawParamsStr=(字符串)getNativeParams.invoke(cam);
//但是让我们做得更好。下面是Android用来解析
//字符串转换为可用的映射--一个简单的“;”字符串拆分器,后跟
//通过在“=”上拆分
//
//取自Camera.Parameters unflatten()方法
TextUtils.StringSplitter splitter=新的TextUtils.SimpleStringSplitter(“;”);
分离器.设置管柱(rawParamsStr);
用于(串kv:分流器){
int pos=千伏指数('=');
如果(位置==-1){
继续;
}
串k=千伏子串(0,位置);
串v=千伏子串(位置+1);
结果:put(k,v);
}
//瞧,你有一张所有支持参数的地图
返回结果;
}catch(NoSuchMethodException-ex){
Log.e(TAG,例如toString());
}捕获(非法访问例外){
Log.e(TAG,例如toString());
}捕获(调用TargetException ex){
Log.e(TAG,例如toString());
}
//如果有任何错误,只需返回一个空映射
Log.e(标记“无法从照相机检索参数”);
返回结果;
}

Wow!这看起来是一个很好的解决方案。我从未使用过拆分器,也许使用两个数组,一个用于字符串,一个用于值,会更容易些?再次感谢。:)没有问题。:)不用担心拆分器,结果就是得到一个映射——键和值。拆分器只是将半色分隔字符串拆分为各个部分。在我看来,使用映射比保持两个不同步的数组要容易得多;参数不能解析为变量。我需要在一个简单的非活动类中调用它,并获取值。你能告诉我需要什么样的导入和调整来捕捉这些值吗?哦,我在类camClass=cam.getClass()中得到了force close;作为你函数的参数,我已经传递了一个公共静态变量mCamera,它在另一个类中,而mCamera是我应用程序中唯一和主要的摄像头对象。对不起,这远远超出了这个问题的范围。你需要学习如何调试你的应用程序,找出它失败的地方和原因。首先,您有大量的空检查。您正在检查
key1
(您刚刚分配的)是否为null,并且还正在为NPE执行try/catch?整个方法可以更改为
getFullCameraParameters(camera).containsKey(“锐度”)