前几天拿老婆充话费送的天语小黄蜂T619来(Android2.3.5版的OS)测试《IP摄像头》,发现图像出不来,跟踪程序后发现是在startPreview时throw出startPreview failed错误,可在Android4.0以上版本没有,图像正常。谷歌了一番,网上也有很多类似的,说是Android2.3版本时要对SurfaceHolder调用setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);才行。自己弄了两天还是解决不了,还是会出现startPreview failed错误而没有图像。今晚把setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);调用放在了Activity的onCreate中,发现问题立马解决了!

部分代码如下:

surfaceView = (SurfaceView) findViewById(R.id.preview_view);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
if(Build.VERSION.SDK_INT < 11)
	surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

这个语句在API level 11时被标注为了deprecated,所以加了一个判断,如果OS版本小于11才调用。
增加后《IP摄像头》在如此低端的大黄蜂上也跑起来了!如下图:

IMG_20140421_204719

最后发现《条码制作器》的摄像头扫描也有这个问题,添加上述代码后问题完美解决,在小黄蜂上也能扫条码了!两个APP将在下次更新中解决这个BUGS

《条码制作器》6.3版增加了扫描名片二维码后直接添加到联系人中的功能。原本想直接用代码实现添加,发现这样太繁琐了,而且Android的联系人本身就有导入的功能,于是问题就变简单了,生成vCard文件(即后缀名为vcf)然后通过Intent调用联系人导入就OK了!

发现一个问题,调用后会弹出一个选择对话框而不是直接调用联系人导入,这样用户操作时候就麻烦了不少,那可以直接调用联系人导入不?可以!代码如下:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setPackage("com.android.contacts");  // 关键是这句
intent.setDataAndType(Uri.fromFile(new File(stringFile)),"text/x-vcard");
startActivity(intent);

条码制作器6.3版的变化
1.优化摄像头热切换性能
2.支持扫描并添加名片
3.修复扫描器显示变形
4.优化Android 4.0下UI显示
5.优化列表字符串显示
6.内存效率优化

下载

Google Play  从应用汇下载

最近在条码制作器新版中加入了EAN8,EAN13和UPC-A的校验位自动计算功能,实现的算法如下:

/* 不含校验位的EAN8,EAN13编码 */
public static int getEANCheckSUM(String EAN8orEAN13) {
	if(EAN8orEAN13.length() != 12) {
		EAN8orEAN13 = "00000" + EAN8orEAN13; //如果是EAN8条码,自动在前面补足5个0凑成EAN13来计算
	}
	if(EAN8orEAN13.length() != 12) {
		return 0;
	}
 
	int c1 = 0;
	int c2 = 0;
	for(int i = 0; i<EAN8orEAN13.length(); i++) {
		int c = EAN8orEAN13.charAt(EAN8orEAN13.length() - i - 1) - '0';
		if(i % 2 == 0)
			c1+=c;
		else
			c2+=c;
	}
	int cc = 10 - (c1 * 3 + c2)%10;
	if(cc==10)
		return 0;
	else
		return cc;
}
 
public static int getUPCACheckSUM(String UPCA) {
	if(UPCA.length() != 11) {
		return 0;
	}
 
	int c1 = 0;
	int c2 = 0;
	for(int i = 0; i<UPCA.length(); i++) {
		int c = UPCA.charAt(UPCA.length() - i - 1) - '0';
		if(i % 2 == 0)
			c1+=c;
		else
			c2+=c;
	}
	int cc = 10 - (c1 * 3 + c2)%10;
	if(cc==10)
		return 0;
	else
		return cc;
}

《支持扫描条码,条码制作器6.2版》

想给一张PNG图标用Android代码描边,找不到思路,Google也搜不到方法,只有给文字描边的那种。无奈,网上找到用C#实现的,自己修改了一下,发现工作很完美!

// 这是我的条码制作器的一段函数
public static Bitmap addCenterImage(Bitmap SrcBmp, Bitmap bitmap) {
 
	int width = SrcBmp.getWidth() / 5;
 
	int offsetX = (SrcBmp.getWidth() - bitmap.getWidth()) / 2;
	int offsetY = (SrcBmp.getHeight() - bitmap.getHeight()) / 2;
 
	int bmpW = bitmap.getWidth();
	int bmpH = bitmap.getHeight();
 
	Canvas ca = new Canvas(bitmap);
	Path path = new Path();
 
	for (int i = 0; i &lt; bmpW; i++)
		for (int j = 0; j &lt; bmpH; j++) 			// 这点不透明而且左右上下四点至少有一点是透明的,那这点就是边缘 			if (bitmap.getPixel(i, j) != Color.TRANSPARENT 					&amp;&amp; (i &gt; 0 &amp;&amp; bitmap.getPixel(i - 1, j) == Color.TRANSPARENT
					|| i &lt; bmpW - 1 &amp;&amp; bitmap.getPixel(i + 1, j) == Color.TRANSPARENT 					|| j &gt; 0 &amp;&amp; bitmap.getPixel(i, j - 1) == Color.TRANSPARENT
					|| j &lt; bmpH - 1 &amp;&amp; bitmap.getPixel(i, j + 1) == Color.TRANSPARENT))
				path.addRect(i - 1, j - 1, i, j, Path.Direction.CCW); // 搜集边缘
	Paint paint = new Paint();
	paint.setAntiAlias(true);
	paint.setColor(Color.WHITE);
	paint.setStyle(Paint.Style.FILL_AND_STROKE);
	paint.setStrokeWidth(4.0f);
 
	ca.drawPath(path, paint); // 画出边缘
	Canvas canvas = new Canvas(SrcBmp);
 
	canvas.drawBitmap(bitmap, offsetX, offsetY, null);
 
	return SrcBmp;
}

以上代码的效果如下!

条码制作器的描边函数演示

条码制作器的描边函数演示

下一版本的《条码制作器》将提供此功能,并修复PNG小图片添加后造成背景变黑的问题!

Android给PNG描边

在C# WebBrowser控件插入JS代码,并执行!亲测可用!

	HtmlElement script = webBrowser.Document.CreateElement("script");
	script.SetAttribute("type", "text/javascript");
	script.SetAttribute("text", "function _func(){alert('OK')}");
	HtmlElement head = webBrowser.Document.Body.AppendChild(script);
	webBrowser.Document.InvokeScript("_func");

附赠一段javascript清除当前站点cookies的代码:

function _cleancookies() {
	var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
	if (keys) {
		for (var i = keys.length; i--;) document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString()
	}
}