前几天拿老婆充话费送的天语小黄蜂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

最近在条码制作器新版中加入了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版》

很不习惯荣耀3C私自给图标加个边框并私自替换图标,个人比较喜欢Android原生的图标。恢复方法很简单,由于替换的图标都来自于主题文件,自己从在线主题里找一个比较接近Android原生风格的,下载下来,不要应用!然后把主题文件(.hwt结尾的,一般在HWTheme目录下)传到电脑,用WinRAR打开,删除其中的icons文件,这个文件里面存放的就是要私自替换的图标!然后再把修改后的hwt文件传回去覆盖HWTheme文件夹下原先那个文件即可,然后再选择刚刚修改那个主题,应用即可!原生图标就回来了!

荣耀3C上的Android原生图标

想给一张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描边

Android4.0下用Activity作为对话框显示时,为了和让底部的按钮也同样拥有Holo对话框下的风格,只要将底部按钮的代码做如下修改:

 
    <View android:layout_width="fill_parent"
            android:layout_height="1dip"
            android:background="?android:attr/dividerHorizontal" />
    <LinearLayout
            style="?android:attr/buttonBarStyle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:measureWithLargestChild="true"
            >
        <Button
                android:id="@+id/share"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/share"/>
        <Button
                android:id="@+id/edit"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/edit"/>
        <Button
                android:id="@+id/close"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/close"/>
    </LinearLayout>

就OK了!
这是在编写桌面便签的语音播放界面时用到的。

转载注明 http://www.shenyaocn.com/?p=147