关于手机等移动设备的应用开发
解决Android中文乱码的问题
[
2011/09/30 08:48 | by 袁旭东 ]
2011/09/30 08:48 | by 袁旭东 ]
前几天解决了PHP与Android中DES加密一致性的问题,昨天遇到了访问Web中文乱码的问题。我在服务端编写了一个PHP程序,Android通过http访问。我的网站编码是UTF-8的,而由于Android的编码是iso-8859-1的,所以导致了中文乱码的问题。知道了原因,解决起来就简单了。在获取得到的返回结果后,对数据进行编码转换就可以了。代码如下:
如果你的网站是GB2312或者GBK的,那么就把以上代码中红色的部分改成GBK就可以了,如:
其他编码依此类推。
引用
strResult = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
如果你的网站是GB2312或者GBK的,那么就把以上代码中红色的部分改成GBK就可以了,如:
引用
strResult = EntityUtils.toString(httpResponse.getEntity(), "GBK");
其他编码依此类推。
Android与PHP互通的DES加密解密
[
2011/09/26 00:25 | by 袁旭东 ]
2011/09/26 00:25 | by 袁旭东 ]
正在做一个Android手机的一个小应用,并且需要与网站有信息交互,网站使用PHP开发,所以需要一个Android与PHP互通的DES加密解密代码。
Android代码如下:
Android代码如下:
引用
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import android.util.Base64;
public class DES2
{
public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, String data) throws Exception
{
return encode(key, data.getBytes());
}
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
byte[] bytes = cipher.doFinal(data);
return Base64.encodeToString(bytes, 3);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* DES算法,解密
*
* @param data 待解密字符串
* @param key 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception 异常
*/
public static byte[] decode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
return cipher.doFinal(data);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* 获取编码后的值
* @param key
* @param data
* @return
* @throws Exception
*/
public static String decodeValue(String key,String data)
{
byte[] datas;
String value = null;
try
{
datas = decode(key, Base64.decode(data, 3));
value = new String(datas);
}
catch (Exception e)
{
value = "";
}
return value;
}
}
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import android.util.Base64;
public class DES2
{
public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, String data) throws Exception
{
return encode(key, data.getBytes());
}
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
byte[] bytes = cipher.doFinal(data);
return Base64.encodeToString(bytes, 3);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* DES算法,解密
*
* @param data 待解密字符串
* @param key 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception 异常
*/
public static byte[] decode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
return cipher.doFinal(data);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* 获取编码后的值
* @param key
* @param data
* @return
* @throws Exception
*/
public static String decodeValue(String key,String data)
{
byte[] datas;
String value = null;
try
{
datas = decode(key, Base64.decode(data, 3));
value = new String(datas);
}
catch (Exception e)
{
value = "";
}
return value;
}
}
让你开发的Android程序支持多语言
[
2011/09/21 22:48 | by 袁旭东 ]
2011/09/21 22:48 | by 袁旭东 ]
在开发Android程序时,很可能您想要您的用户群不止是简体中文用户,很可能还有英语用户或者繁体中文用户。这时候,我们就需要让Android程序支持多语言了,并且程序会根据系统的当前语言来自动转换程序的显示语言。
下面我就以创建缺省语言为英语,另外支持简体中文的Android程序为例,说一下Android的多语言支持。
首先,在res目录下建立values-zh-rCN目录,并新建一个名为strings.xml文件。此文件将存储简体中文字符串资源。
然后,将res目录下的values目录下的string.xml中的内容复制出来,假定文件内容为:
复制后,将标签值翻译成简体中文,修改后内容如下:
应该可以注意到,修改的只是红色的部分,标签的name不要修改。
最后,您只要在您的Android程序中使用这些字符串资源id就可以了。例如程序中按返回按键时显示的确认退出对话框,代码如下:
这样,您开发的Android程序就支持多语言了。
下面我就以创建缺省语言为英语,另外支持简体中文的Android程序为例,说一下Android的多语言支持。
首先,在res目录下建立values-zh-rCN目录,并新建一个名为strings.xml文件。此文件将存储简体中文字符串资源。
然后,将res目录下的values目录下的string.xml中的内容复制出来,假定文件内容为:
引用
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Seller Assistant</string>
<string name="exit_msg_title">Tips</string>
<string name="msg_cancel">Cancel</string>
<string name="msg_OK">OK</string>
<string name="msg_exit_content">Do you want to quit Seller Assistant?</string>
</resources>
<resources>
<string name="app_name">Seller Assistant</string>
<string name="exit_msg_title">Tips</string>
<string name="msg_cancel">Cancel</string>
<string name="msg_OK">OK</string>
<string name="msg_exit_content">Do you want to quit Seller Assistant?</string>
</resources>
复制后,将标签值翻译成简体中文,修改后内容如下:
引用
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">淘宝卖家助理</string>
<string name="exit_msg_title">温馨提示</string>
<string name="msg_cancel">取消</string>
<string name="msg_OK">确定</string>
<string name="msg_exit_content">您确认退出卖家助理吗?</string>
</resources>
<resources>
<string name="app_name">淘宝卖家助理</string>
<string name="exit_msg_title">温馨提示</string>
<string name="msg_cancel">取消</string>
<string name="msg_OK">确定</string>
<string name="msg_exit_content">您确认退出卖家助理吗?</string>
</resources>
应该可以注意到,修改的只是红色的部分,标签的name不要修改。
最后,您只要在您的Android程序中使用这些字符串资源id就可以了。例如程序中按返回按键时显示的确认退出对话框,代码如下:
引用
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
// 退出时提示确认是否退出
showExitMessage(R.string.msg_exit_content);
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 退出App时提示窗口
* @param msg 提示文字信息
*/
private void showExitMessage(int msg_id)
{
new AlertDialog.Builder(this)
.setTitle(R.string.exit_msg_title)
.setMessage(msg_id)
.setPositiveButton(R.string.msg_OK, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
finish();
}
})
.setNegativeButton(R.string.msg_cancel, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
//
}
}).show();
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
// 退出时提示确认是否退出
showExitMessage(R.string.msg_exit_content);
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 退出App时提示窗口
* @param msg 提示文字信息
*/
private void showExitMessage(int msg_id)
{
new AlertDialog.Builder(this)
.setTitle(R.string.exit_msg_title)
.setMessage(msg_id)
.setPositiveButton(R.string.msg_OK, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
finish();
}
})
.setNegativeButton(R.string.msg_cancel, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
//
}
}).show();
}
这样,您开发的Android程序就支持多语言了。
Android 获取网页内容
[
2011/09/02 05:53 | by 袁旭东 ]
2011/09/02 05:53 | by 袁旭东 ]
想要开发一个与网站互动的Android程序,首先就是要能访问网页并获取返回的内容。访问网页有两种方式,即GET和POST。首先说一下GET,代码如下:
至于 POST 方式,与 GET 方式类似,只是将 HttpGet 类改为 HttpPost 类即可。不过,单单只有这些访问网络的代码还是不能真正的访问网络,还需要为你的程序设置访问网络的权限。此时就需要在 AndroidManifest.xml 文件中的<manifest>标签内加入下面的代码:
这样,你的程序就能正常访问网络了。而在制作成的安装包apk在安装时,Android系统也会以红色的字提示你,此程序有完全访问网络的权限。
下面是演示程序的完整代码:
下载文件
引用
HttpGet httpRequest = new HttpGet("http://blog.jiqila.com/index.php");
try
{
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == 200)
{
String strResult = EntityUtils.toString(httpResponse.getEntity());
textViewInfo.setText(strResult);
}
else
{
textViewInfo.setText(httpResponse.getStatusLine().toString());
}
}
catch (ClientProtocolException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (IOException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (Exception e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
try
{
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == 200)
{
String strResult = EntityUtils.toString(httpResponse.getEntity());
textViewInfo.setText(strResult);
}
else
{
textViewInfo.setText(httpResponse.getStatusLine().toString());
}
}
catch (ClientProtocolException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (IOException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (Exception e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
至于 POST 方式,与 GET 方式类似,只是将 HttpGet 类改为 HttpPost 类即可。不过,单单只有这些访问网络的代码还是不能真正的访问网络,还需要为你的程序设置访问网络的权限。此时就需要在 AndroidManifest.xml 文件中的<manifest>标签内加入下面的代码:
引用
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
这样,你的程序就能正常访问网络了。而在制作成的安装包apk在安装时,Android系统也会以红色的字提示你,此程序有完全访问网络的权限。
下面是演示程序的完整代码:
下载文件
打算做一个手机小说网站
[
2011/02/20 18:55 | by 袁旭东 ]
2011/02/20 18:55 | by 袁旭东 ]
这个想法的起始原因很简单,老婆喜欢用手机在联通的WO网站上看小说。要知道联通的WO网站看小说是要收T的(一个T要0.2元)。看得多了,花销就不少了,因此我想做一个手机小说网站,我平时在网上收集一些小说,发布到这个网站上,然后老婆用手机访问就可观看了。需求简单,做起来也就没有多高的要求,所以打算用几天时间做出来这个网站。域名都已经设置好了:http://novels.m.jiqila.com/
FringOut通话效果体验
[
2011/01/09 10:50 | by 袁旭东 ]
2011/01/09 10:50 | by 袁旭东 ]
由于我的是联通WCDMA 66元套餐,打电话每分钟是0.2元,而且我的电话比较多,因此电话费是一个不小的开支。所以,我开始寻找合适的网络电话作为替代品。
大家知道,一般的网络电话需要在电脑上安装软件,然后才可以拨打,这样无形中就限制了通话地点。而我的要求是能直接在手机上拨打电话,这样就可以做到随时随地了。而符合这样要求的网络电话,我只找到了一种,那就是FringOut,他的通话费用相当低廉,打国内电话是每分钟1美分,大约相当于6.8分人民币(我在淘宝上代充FringOut话费10美元,花费是68元人民币。),也就是我手机通话费用的三分之一,而每分钟语音电话的流量消耗平均是133KB。我每个月的包月上网流量是450MB,足够打3000分钟以上了,并且如果使用 WIFI 的话,那就没有流量限制了。
现在说说FringOut的通话效果吧。在使用电信 WIFI 的情况下,通话效果非常流畅,在12分钟的通话时间里面,出现3-4次杂音,像是有干扰的样子,总的来说很接近联通3G语音通话效果。而在使用联通3G网络的情况下,通话效果更好,在21分钟的通话时间里面,只出现1次杂音的现象。
总结一下,使用FringOut效果好得超乎我的想象。不论使用WIFI还是联通3G网络都相当好,其中使用联通3G网络的效果好得更是没得说。
大家知道,一般的网络电话需要在电脑上安装软件,然后才可以拨打,这样无形中就限制了通话地点。而我的要求是能直接在手机上拨打电话,这样就可以做到随时随地了。而符合这样要求的网络电话,我只找到了一种,那就是FringOut,他的通话费用相当低廉,打国内电话是每分钟1美分,大约相当于6.8分人民币(我在淘宝上代充FringOut话费10美元,花费是68元人民币。),也就是我手机通话费用的三分之一,而每分钟语音电话的流量消耗平均是133KB。我每个月的包月上网流量是450MB,足够打3000分钟以上了,并且如果使用 WIFI 的话,那就没有流量限制了。
现在说说FringOut的通话效果吧。在使用电信 WIFI 的情况下,通话效果非常流畅,在12分钟的通话时间里面,出现3-4次杂音,像是有干扰的样子,总的来说很接近联通3G语音通话效果。而在使用联通3G网络的情况下,通话效果更好,在21分钟的通话时间里面,只出现1次杂音的现象。
总结一下,使用FringOut效果好得超乎我的想象。不论使用WIFI还是联通3G网络都相当好,其中使用联通3G网络的效果好得更是没得说。
PuTTY for Symbian,SSH手机客户端
[
2010/07/11 11:07 | by 袁旭东 ]
2010/07/11 11:07 | by 袁旭东 ]
最近几天一直在维护服务器,长时间坐在电脑旁感觉有点儿累。于是就想,要是能躺在床上,用手机维护就好了。马上google了一下,还真有人在做这个,并且还是一个开源项目。
引用
项目网址:http://s2putty.sourceforge.net/
for Symbian OS v2:http://sourceforge.net/projects/s2putty/files/s2putty/1.5.2/putty_s80v2_1.5.2.zip/download
for Symbian OS v3:http://sourceforge.net/projects/s2putty/files/s2putty/1.5.2/putty_s60v3_1.5.2.zip/download
for Symbian OS v5:http://bd.kicks-ass.net/koodaus/putty/s60v5/putty.touch_UI_v0.8.4.sisx
for Symbian OS v2:http://sourceforge.net/projects/s2putty/files/s2putty/1.5.2/putty_s80v2_1.5.2.zip/download
for Symbian OS v3:http://sourceforge.net/projects/s2putty/files/s2putty/1.5.2/putty_s60v3_1.5.2.zip/download
for Symbian OS v5:http://bd.kicks-ass.net/koodaus/putty/s60v5/putty.touch_UI_v0.8.4.sisx
Windows Mobile下不支持TStringList的DelimitedText,及解决方法
[
2009/10/25 18:34 | by 袁旭东 ]
2009/10/25 18:34 | by 袁旭东 ]
今天在做手机版程序的时候,遇到这样一个问题,对字符串进行拆分,为了省事,就使用了TStringList中的DelimitedText属性,大致代码如下:
procedure TForm1.Button1Click(Sender: PObj);
var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Delimiter := '|';
sl.DelimitedText := 'aa|中文|cc';
MessageBox(0, PWideChar(sl.Strings[1]), '', MB_OK);
end;
procedure TForm1.Button1Click(Sender: PObj);
var
sl: TStringList;
begin
sl := TStringList.Create;
sl.Delimiter := '|';
sl.DelimitedText := 'aa|中文|cc';
MessageBox(0, PWideChar(sl.Strings[1]), '', MB_OK);
end;
Lazarus结合KOLCE进行Windows Mobile开发
[
2009/10/12 01:06 | by 袁旭东 ]
2009/10/12 01:06 | by 袁旭东 ]
我曾经写过一篇关于Lazarus开发Windows CE程序的文章,讲了最基本的开发。按照,以前的方法开发普通的Windows CE程序没有问题,但是开发基于WinCE的Windows Mobile程序就显得比较费力一些,因为那样做出来的程序界面很难与Windows Mobile配合完美。而安装KOLCE控件包后,使用此控件开发的Windows Mobile程序,界面显得很专业了,不用再费力去模拟了。
下面这张图就是使用KOLCE开发的界面,与Windows Mobile结合很完美,界面都是标准的WM界面。
下面这张图就是使用KOLCE开发的界面,与Windows Mobile结合很完美,界面都是标准的WM界面。
使用Lazarus进行Windows CE开发
[
2009/08/18 11:47 | by 袁旭东 ]
2009/08/18 11:47 | by 袁旭东 ]
前两天通过将Lazarus编译文件的减肥,介绍了Lazarus的大概情况,其中提高了跨平台的交叉编译。那么下面我就说说如何在Windows 9x/2000/XP/2003/Vista/2008/7系统下开发Windows CE程序。
假设您已经安装了Lazarus,当前最新的版本为0.9.27。要想编译Windows CE程序,就必须再安装一个扩展,名字叫lazarus-cross-arm-wince-win32,下载地址可以去Lazarus官网找找,我在这里就不贴了。
假设您已经安装了Lazarus,当前最新的版本为0.9.27。要想编译Windows CE程序,就必须再安装一个扩展,名字叫lazarus-cross-arm-wince-win32,下载地址可以去Lazarus官网找找,我在这里就不贴了。




