Java 如何以编程方式获取相机原始元数据信息
我有一个应用程序,可以通过编程设置相机的硬件参数 然而,正如我被告知并观察到的,并非所有的芯片组都支持所有参数 例如,Nexus 4(高通公司)有清晰度和清晰度最大参数,Galaxy Note II 3g没有 因此,当我设置锐度参数时,Nexus响应良好,但星系力关闭: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
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(“锐度”)代码>