发现《蓝牙串口》《TCP连接》的十六进制编辑框在输入时还要自己注意添加空格太不智能了,又容易出错。所以就想着在每输入两个字符后自动加入一个空格(两个字符代表一个十六进制数,刚好可以转成一个BYTE),然后删除字符时,可以自动删除空格(不懂怎么表述,运行一下代码就知道了)。

方法:使用EditText的addTextChangedListener接口,并实现TextWatcher。具体实现代码如下:

TextWatcher autoAddSpaceTextWatcher = new TextWatcher() {
	@Override
	public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
 
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		if (count == 1) {
			if ((s.length() + 1) % 3 == 0) {
				setText(s + " ");
				setSelection(s.length() + 1);
			}
		}  else if (count == 0) {
			if (s.length() > 0 && s.length() % 3 == 0) {
				setText(s.subSequence(0, s.length() - 1));
				setSelection(s.length() - 1);
			}
		}
	}
 
	@Override
	public void afterTextChanged(Editable editable) {}
};

最后调用addTextChangedListener传入autoAddSpaceTextWatcher即可!赶紧去体验新版《蓝牙串口》和《TCP连接》的十六进制输入吧!

最近在更新《轻松编辑》《IP摄像头》的网页服务器部分时,遇到了两个String的问题。

第一个是获取String占用的内存字节数,自己想当然直接用length()函数取得了长度了,可到了socket发送数据的时候总是发送不完整(字符串中包含中文),后面Debug之后才发现length得到的是字符数,而不是内存中的字节数,一个中文在UTF8编码下要占用3个字节,自然得到的长度变短了,所以发送不完整。正确做法是getBytes(),再在返回的数组中取length。

第二个是截取String指定区间的子字符串,函数substring (int start, int end)。比如要取索引2到5这4个字符,直接substring (2, 5)……然后得到的是索引2到4三个字符组成的字符串,索引5的那个字符并没有出现,后面查了一下谷歌,才发现substring (int start, int end)返回的字符串不包含索引end的字符!!!所以正确的应该是substring (2, 6)。

发现了这两个特别注意的地方,就是不知道先前的代码有没出现过这两个错误。

在开发《轻松编辑》5.1版的快速打开文本文件时,遇到了如何快速获取SD卡上所有文本文件的问题。查了API,发现MediaStore可以使用。MediaStore可以获取音乐、视频和图片等,在API level 大于11后还可以获取其它文件,比如文本,或者doc,pdf。

相关代码如下:

@TargetApi(11)
private void refreshList(){
	String[] columns = new String[] {
		MediaStore.Files.FileColumns.TITLE,
		MediaStore.Files.FileColumns.DATA
	};
	Uri uri = MediaStore.Files.getContentUri("external");
	String selection = "(" + MediaStore.Files.FileColumns.MIME_TYPE + "=='text/plain')";
	Cursor c = getContentResolver().query(uri, columns, selection, null, MediaStore.Files.FileColumns.SIZE + " DESC");
	if (c == null) {
		return;
	}
 
	if (c.moveToFirst()) {
		int dataIndex = c.getColumnIndex(MediaStore.Files.FileColumns.DATA);
		int titleIndex = c.getColumnIndex(MediaStore.Files.FileColumns.TITLE);
		do {
 
			c.getString(titleIndex); // 获取文件名,不包含扩展名
			c.getString(dataIndex);  // 获取文件实际路径
 
		} while (c.moveToNext()); // 循环获取文件
	}
}

注意:MediaStore.Files这个类要到API Level 11才能使用,这就是《轻松编辑》在Android 3.0版本以下不能启用快速打开文本的原因。其实这个可以解决的,比如在android 3.0以下用手动来获取,可如果SD卡上文件很多的话,这个时间就很漫长了,所以还是不加好。

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

轻松编辑5.0版可以自动对大于5000个字符的文本文件进行分页,这样你就可以更加流畅地查看文本文件,不再有卡顿感。按照这个版本的设计,每个页面的字符最多为5120个,如果文本文件的字符数量大于这个数,将被自动分页。配合5.0版新增加的底部导航按钮,你可以快速在各个页面之间切换。

《轻松编辑》打开1.5MB的《金瓶梅》 《轻松编辑》打开1.5MB的《金瓶梅》

新版变化
1.优化UI,将大部分文件操作移到左边的菜单,在左边缘向内侧滑动即可打开
2.支持打开1M以上的文本文件
3.增加自动分页,即使大文件也可以流畅查看
4.优化字符串处理效率
5.可以自定义是否启用拼写检查
6.修复打开大文件时应用可能卡死的错误
7.打开文件时如果有空的标签页将会被利用,而不是再打开新的标签页
8.内存占用优化
下载

Google Play  从应用汇下载 安智下载