Android调用camera错误setParameters failed深层解析
1. Camera
Camera是Android framework里面支持的,同意你拍照和拍摄视频的设备,那么,在使用camera开发中总是会遇到一些问题,比例如以下面这样子的:
E/AndroidRuntime(1542): java.lang.RuntimeException: setParameters failed
E/AndroidRuntime(1542): at android.hardware.Camera.native_setParameters(Native Method)
E/AndroidRuntime(1542): at android.hardware.Camera.setParameters(Camera.java:914)
出现这样的错误。依据错误提示我们能够知道是android的setParameters方法出错了。
2、那该怎样解决呢?
我们知道camera的parameters中也有非常多參数设置的,是哪个出错了呢?非常多人不知所以然就上网開始找,找不到就開始各种推測,一个个參数设置过去,事实上最有效的方式是究竟层找原因。ok,让我们打开android代码找到camera类。然后查找setParameters方法。
private native final void native_setParameters(String params);
/**
* Changes the settings for this Camera service.
*
* @param params the Parameters to use for this Camera service
* @throws RuntimeException if any parameter is invalid or not supported.
* @see #getParameters()
*/
public void setParameters(Parameters params) {
native_setParameters(params.flatten());
}
从这段代码中代码中。我们能够得到什么信息呢,setParameters方法是调用jni方法native_setParameters的方法,事实上看到这里就差并不多了,由于再去查看jni方法是非常麻烦的。毕竟我们日常开发使用大部分是java代码。我们能够发现传输进来的是Parameters參数,调用了Parameters的flatten方法。
我们查找flatten的代码进行查看。
/**
* Creates a single string with all the parameters set in
* this Parameters object.
* <p>The {@link #unflatten(String)} method does the reverse.</p>
*
* @return a String with all values from this Parameters object, in
* semi-colon delimited key-value pairs
*/
public String flatten() {
StringBuilder flattened = new StringBuilder();
for (String k : mMap.keySet()) {
flattened.append(k);
flattened.append("=");
flattened.append(mMap.get(k));
flattened.append(";");
}
// chop off the extra semicolon at the end
flattened.deleteCharAt(flattened.length()-1);
return flattened.toString();
}
从这段代码中,我们又能得到什么信息呢。我们能够看到提供数据的时候,数据都是从mMap中获取的。ok,接下来,我们查看一下mMap是有几个方法对其进行了赋值呢。
/**
* Takes a flattened string of parameters and adds each one to
* this Parameters object.
* <p>The {@link #flatten()} method does the reverse.</p>
*
* @param flattened a String of parameters (key-value paired) that
* are semi-colon delimited
*/
public void unflatten(String flattened) {
mMap.clear(); StringTokenizer tokenizer = new StringTokenizer(flattened, ";");
while (tokenizer.hasMoreElements()) {
String kv = tokenizer.nextToken();
int pos = kv.indexOf('=');
if (pos == -1) {
continue;
}
String k = kv.substring(0, pos);
String v = kv.substring(pos + 1);
mMap.put(k, v);
}
} /**
* Sets a String parameter.
*
* @param key the key name for the parameter
* @param value the String value of the parameter
*/
public void set(String key, String value) {
if (key.indexOf('=') != -1 || key.indexOf(';') != -1) {
Log.e(TAG, "Key \"" + key + "\" contains invalid character (= or ;)");
return;
}
if (value.indexOf('=') != -1 || value.indexOf(';') != -1) {
Log.e(TAG, "Value \"" + value + "\" contains invalid character (= or ;)");
return;
} mMap.put(key, value);
} /**
* Sets an integer parameter.
*
* @param key the key name for the parameter
* @param value the int value of the parameter
*/
public void set(String key, int value) {
mMap.put(key, Integer.toString(value));
} private void set(String key, List<Area> areas) {
if (areas == null) {
set(key, "(0,0,0,0,0)");
} else {
StringBuilder buffer = new StringBuilder();
for (int i = 0; i < areas.size(); i++) {
Area area = areas.get(i);
Rect rect = area.rect;
buffer.append('(');
buffer.append(rect.left);
buffer.append(',');
buffer.append(rect.top);
buffer.append(',');
buffer.append(rect.right);
buffer.append(',');
buffer.append(rect.bottom);
buffer.append(',');
buffer.append(area.weight);
buffer.append(')');
if (i != areas.size() - 1) buffer.append(',');
}
set(key, buffer.toString());
}
} /**
* Returns the value of a String parameter.
*
* @param key the key name for the parameter
* @return the String value of the parameter
*/
public String get(String key) {
return mMap.get(key);
} /**
* Sets the dimensions for preview pictures. If the preview has already
* started, applications should stop the preview first before changing
* preview size.
*
* The sides of width and height are based on camera orientation. That
* is, the preview size is the size before it is rotated by display
* orientation. So applications need to consider the display orientation
* while setting preview size. For example, suppose the camera supports
* both 480x320 and 320x480 preview sizes. The application wants a 3:2
* preview ratio. If the display orientation is set to 0 or 180, preview
* size should be set to 480x320. If the display orientation is set to
* 90 or 270, preview size should be set to 320x480. The display
* orientation should also be considered while setting picture size and
* thumbnail size.
*
* @param width the width of the pictures, in pixels
* @param height the height of the pictures, in pixels
* @see #setDisplayOrientation(int)
* @see #getCameraInfo(int, CameraInfo)
* @see #setPictureSize(int, int)
* @see #setJpegThumbnailSize(int, int)
*/
public void setPreviewSize(int width, int height) {
String v = Integer.toString(width) + "x" + Integer.toString(height);
set(KEY_PREVIEW_SIZE, v);
}
/**
* <p>Sets the dimensions for EXIF thumbnail in Jpeg picture. If
* applications set both width and height to 0, EXIF will not contain
* thumbnail.</p>
*
* <p>Applications need to consider the display orientation. See {@link
* #setPreviewSize(int,int)} for reference.</p>
*
* @param width the width of the thumbnail, in pixels
* @param height the height of the thumbnail, in pixels
* @see #setPreviewSize(int,int)
*/
public void setJpegThumbnailSize(int width, int height) {
set(KEY_JPEG_THUMBNAIL_WIDTH, width);
set(KEY_JPEG_THUMBNAIL_HEIGHT, height);
} /**
* Sets the quality of the EXIF thumbnail in Jpeg picture.
*
* @param quality the JPEG quality of the EXIF thumbnail. The range is 1
* to 100, with 100 being the best.
*/
public void setJpegThumbnailQuality(int quality) {
set(KEY_JPEG_THUMBNAIL_QUALITY, quality);
} /**
* Sets Jpeg quality of captured picture.
*
* @param quality the JPEG quality of captured picture. The range is 1
* to 100, with 100 being the best.
*/
public void setJpegQuality(int quality) {
set(KEY_JPEG_QUALITY, quality);
} /**
* Sets the rate at which preview frames are received. This is the
* target frame rate. The actual frame rate depends on the driver.
*
* @param fps the frame rate (frames per second)
* @deprecated replaced by {@link #setPreviewFpsRange(int,int)}
*/
@Deprecated
public void setPreviewFrameRate(int fps) {
set(KEY_PREVIEW_FRAME_RATE, fps);
} /**
* Sets the maximum and maximum preview fps. This controls the rate of
* preview frames received in {@link PreviewCallback}. The minimum and
* maximum preview fps must be one of the elements from {@link
* #getSupportedPreviewFpsRange}.
*
* @param min the minimum preview fps (scaled by 1000).
* @param max the maximum preview fps (scaled by 1000).
* @throws RuntimeException if fps range is invalid.
* @see #setPreviewCallbackWithBuffer(Camera.PreviewCallback)
* @see #getSupportedPreviewFpsRange()
*/
public void setPreviewFpsRange(int min, int max) {
set(KEY_PREVIEW_FPS_RANGE, "" + min + "," + max);
} /**
* Sets the image format for preview pictures.
* <p>If this is never called, the default format will be
* {@link android.graphics.ImageFormat#NV21}, which
* uses the NV21 encoding format.</p>
*
* @param pixel_format the desired preview picture format, defined
* by one of the {@link android.graphics.ImageFormat} constants.
* (E.g., <var>ImageFormat.NV21</var> (default),
* <var>ImageFormat.RGB_565</var>, or
* <var>ImageFormat.JPEG</var>)
* @see android.graphics.ImageFormat
*/
public void setPreviewFormat(int pixel_format) {
String s = cameraFormatForPixelFormat(pixel_format);
if (s == null) {
throw new IllegalArgumentException(
"Invalid pixel_format=" + pixel_format);
} set(KEY_PREVIEW_FORMAT, s);
} /**
* <p>Sets the dimensions for pictures.</p>
*
* <p>Applications need to consider the display orientation. See {@link
* #setPreviewSize(int,int)} for reference.</p>
*
* @param width the width for pictures, in pixels
* @param height the height for pictures, in pixels
* @see #setPreviewSize(int,int)
*
*/
public void setPictureSize(int width, int height) {
String v = Integer.toString(width) + "x" + Integer.toString(height);
set(KEY_PICTURE_SIZE, v);
} /**
* Sets the image format for pictures.
*
* @param pixel_format the desired picture format
* (<var>ImageFormat.NV21</var>,
* <var>ImageFormat.RGB_565</var>, or
* <var>ImageFormat.JPEG</var>)
* @see android.graphics.ImageFormat
*/
public void setPictureFormat(int pixel_format) {
String s = cameraFormatForPixelFormat(pixel_format);
if (s == null) {
throw new IllegalArgumentException(
"Invalid pixel_format=" + pixel_format);
} set(KEY_PICTURE_FORMAT, s);
}
ok,错误的地方。我们就定位在这么几个地方了。在自己写的代码里面,查看一下是否调用了这几个方法~~~。android源代码还是凝视得比較清晰的,看看方法英文说明,看是否參数有出现了错误。
当时我的是使用setPictureSize时出现了错误,依据方法说明,我简单解释下。为什么会出错。由于parameters.setPictureSize(320,
480)(设置分辨率)的參数有误,假设不清楚分辨率能够却掉这句话。再执行就OK了。
注:最后找了一下原因,感觉非常easy,在实际 开发中。有时候一个小问题。就让人忙乎一个下午也是正常滴。
Android调用camera错误setParameters failed深层解析的更多相关文章
- Android调用 .Net Core WebApi 返回数据,用FastJSON解析一直报错。
问题描述:.Net Core WebApi中用Newtonsoft.Json 把datatable转成json字符串,如:JsonConvert.SerializeObject(table,Forma ...
- 介绍 Android 的 Camera 框架
总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...
- android camera setParameters failed 类问题分析总结
在 monkey test 测试中出现了一例 RuntimeException ,即 setParameters failed. LOG显示为:09-01 18:47:17.348 15656 156 ...
- 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题
使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...
- Android 自定义Camera 随笔
一.权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-permiss ...
- Android调用系统相机以及自定义相机
0.综述 自定义相机,此处展示简单的相机功能,官方文档中还有相应关于视频拍摄的内容,此处不提 1.添加权限 <!--相机权限,数据存储--> <uses-permission and ...
- Android开发常见错误汇总
[错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requireme ...
- Android图片加载框架最全解析(四),玩转Glide的回调与监听
大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...
随机推荐
- 解析浏览器和nodejs环境下console.log()的区别
写在前面的 在开发调试过程中,我们经常需要调用console.log 方法来打印出当前变量的值,然而,console.log在浏览器环境下 有时会出现一些异常的现象 开撸代码 在浏览器和nodejs环 ...
- 路飞学城Python-Day7
Moudle 2 1.鸡汤中国人均阅读4.35本:日本40本:韩国17本:法国20本:以色列60本成长的路上需要读书,坚持读书内心会得到升华的想法不要太多,尽量多读书,多充电多读书,多看报,少吃零食, ...
- 使用VUE开发微信小程序
使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 彻底的组件化开发能力:提高代码复用性完整的 Vue.js 开发体验方便的 Vuex 数据管理方案:方便构建复杂应用快捷的 ...
- 紫书 例题8-12 UVa 12627 (找规律 + 递归)
紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...
- 紫书 例题 11-5 UVa 10048 (Floyd求最大权值最小的路径)
这道题是Floyd的变形 改成d[i][j] = min(d[i][j], max(d[i][k], d[k][j]))就好了. #include<cstdio> #include< ...
- [luogu] P2787 语文1(chin1)- 理理思维(分块)
P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...
- Android群英传-拼图游戏puzzle-6点吐槽
一.缘由 经常写文章,混了一些C币.最近在深入学习Android应用开发,就从商城里买了一本<Android群英传>.这本书的内容,不是纯粹的入门那种,分几个章节,重点讲解Activit ...
- C语言过程活动记录
C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等.解决这个问题的经典机制是堆栈中的活动记录. 当每个函数被调用时,都会产生一个过程记 ...
- HDU 5297 Y sequence Y数列
题意:给定正整数n和r.定义Y数列为从正整数序列中删除全部能表示成a^b(2 ≤ b ≤ r)的数后的数列,求Y数列的第n个数是多少. 比如n = 10. r = 3,则Y数列为2 3 5 6 7 1 ...
- android:为TextView加入样式——下划线,颜色,设置链接样式及前背景色
实现下划线及颜色设置: public class AtActivity extends Activity { LinearLayout ll; /** Called when the acti ...