作者存档
201011 月27

让你不翻书

某天在图书馆上自习,忽然发现书下压了张字条,上书:“我是你旁边的女生,一起吃个晚饭好吗?如果你同意的话,五点半楼下见。”我低头一看表,八点了……有史以来最悲剧的一天,让你不翻书!

201011 月27

IN语:2010-11-27

>>不要感到是生活亏欠了你,其实是时机未到或你还努力不够。
>>只有尝试过,才会懂得自己该选择什么;只有奋斗过,才会知道自己该放弃什么。
>>遇到你之前,我的世界是黑白的。遇到你之后……得,全黑了。
>>唐僧再厉害,也不过是个耍猴的。

201011 月26

镇静剂

医生:“去给准备出院的那位病人注射一针镇静剂。”
护士不解:“都可以出院了,干嘛还打镇静剂?”
医生:“等下要结账,我怕他受不了!”

201011 月25

吃自助餐

有一天我的朋友A君去吃自助餐。等吃得差不多了,餐馆老板出现在A君面前,递给他一张卡片,说:“这是隔壁饭店的VIP卡,他们那里也是自助餐形式,请你以后去那里用餐吧。”

201011 月24

促销mm

晚上超市买速冻饺子 促销mm热情招呼我,还拉扯过去:尝尝吧尝尝吧!! 唉,盛情难却啊,吃了一个。咀嚼时促销mm一直盯着我,待我吃完,她认真地问:熟了么?熟了我就捞起来了…..

201011 月24

我爸是金刚

金正银站在岸上对着韩国士兵高喊着:“对方听好啦,我爸是李刚!”,旁边军师一听急了,忙低声对他说:“将军,您父亲姓金呢。”,金正银一听,连忙改口:“我爸是金刚!”

201011 月24

苹果iOS 4.2正式版成功越狱:附教程

 新浪科技讯 北京时间11月24日凌晨消息,iPhone Dev Team刚刚在其官方网站放出了Redsn0w 0.9.6b4(国内俗称“红雪”),成功为所有iOS 4.2.1设备实现越狱,运行Cydia和MobileSubstrate。此次越狱距苹果正式推出最新iOS 4.2版本操作系统仅24小时不到。

  苹果周一正式推出最新的iOS 4.2版本操作系统,供iPad、iPhone和iPod touch用户下载。与iOS 4.0和4.1版本系统相比,iOS 4.2新增100多项功能,其中包括多任务处理、文件夹、统一收件箱、游戏中心、AirPlay和AirPrint等。

  Redsn0w 0.9.6b4基于知名黑客Geohot的Limera1n(俗称“绿雨”)使用的bootrom漏洞。唯一的问题是,此次放出的越狱软件对于新设备只能实现非完美越狱,用户必须在每次重启的时候将设备载入至“越狱状态”,包括iPhone 3GS(新bootrom)、iPhone 4、iPad、iPod touch二代(MC Model)、iPod touch三代和iPod touch四代。老设备如iPhone 3GS(旧bootrom)、iPhone 3G和iPod touch二代(非MC Model)使用这个版本的Redsn0w已经可以实现完美越狱。

  除非Comex of Spirit和JailbreakMe能够为iOS 4.2.1带来另一种越狱方法,新款设备的越狱只能是非完美的。

  以下为使用Redsn0w 0.9.6b4为iOS 4.2.1越狱教程:

图1图1

  注:需要解锁的用户请勿使用Redsn0w或升级iOS 4.2.1。

  第一步:下载你的设备对应的iOS 4.2.1 IPSW文件。

  第二步:使用刚刚从iTunes 10.1下载到的IPSW文件将设备升级/还原至iOS 4.2.1。

  第三步:启动Redsn0w 0.9.6b4软件,在软件中选择iOS 4.2.1固件IPSW文件。

图2图2
图3图3

  第四步:选择“Install Cydia”,单击“Next”。

图4图4
图5图5

  第五步:确保设备关机并已经插入电脑,然后点击“Next”。

  图6图6

  此时,屏幕指示用户按住电源键,然后在按住电源键的同时,按住Home键。几秒钟之后,松开电源键,但仍然按住Home键,直到安装过程开始。

  图7图7

  第六步:喝杯咖啡等待一会儿,redsn0w将完成剩余的工作。一旦完成,你的iPhone或iPod touch将自动重启,设备已经在最新的iOS 4.2.1上完成越狱。

  以下步骤仅用于iPhone 4、3GS(新Bootrom)、iPod touch四代/三代/二代和iPad:

  第七步:现在,在你想做任何与越狱有关的操作如SSHing或运行Cydia之前,你必须在每次重启的时候,使用Redsn0w的“Just boot tethered right now”选项(如图所示),将你的设备进入到所谓的“越狱状态”

  图8图8

201011 月22

一个不敢有敌人的王朝:富甲全球依然丧权辱国!

    细检中国几千年封建社会,几十个大大小小长长短短的朝代,要数宋朝时期的经济、文化和社会最为发达。据史载,自太祖时代始,铸币叠增到年500万的数量,其两年的铸币数就要超过400年后明朝276年所铸之总和,而唐朝极盛的玄宗朝年铸币也不过32万贯;中国的四大发明有三项产生在宋代,唐宋八大家中有六家属于宋。  

    不过不要忘了,大宋王朝也是中国历史上最为窝囊的朝代,一直是汉民族一道无法愈合的“伤口”。这里不妨翻一下老账:靖康二年开春,也就是1127年正月,金兵攻陷汴梁,四月将徽、钦两帝及3000余名皇室人员作为战俘带回,一年后到达金上京。第二天,金太宗吴乞买即下令让徽、钦二帝去祭拜金太祖完颜阿骨打的陵寝。先是让他爷俩脱下衣服,袒露上身,然后现宰两只绵羊,剥下血淋淋的羊皮披在两位皇帝的身上。以这种极尽侮辱的装束让徽、钦两帝一步一叩首,绕着完颜阿骨打的坟墓转了三圈。礼毕,两位皇帝又去乾元殿拜见金太宗吴乞买,徽宗被封为“昏德公”,钦宗被封为“重昏侯”。

    溯源究由,原因很多,致命的还是不敢有敌人的王朝心理一直在作祟。

    世上之事,常常是“怕处有鬼,痒处有虱”。宋朝不敢有敌人,但偏偏没有碰上世界大同的好运气,敌人不但客观存在,而且虎视眈眈。千年之前,在中国辽阔的版图上,除了建都于汴京的大宋之外,还出现过三个国号:一个是建都于内蒙古近郊的辽,另一个是建都于西北地区的西夏,再一个是建都于会宁的大金。上述三个政权的掌门人体内流淌的是惯于纵马奔腾的民族的血液。广阔无垠的草原铸就了游牧民族兼容、多变、简朴、动态的品格,冒险、勇猛、善战、扩张等特征也似乎是与生俱来的。或许是为了更好地生存,或许是游牧民族身上留下来的那种原始野性,他们情感罗盘的指针总是蛮横地指向大宋所在的南方。因此,他们总是以宋朝为敌,绝不因对方不敢有敌而手软过。他们所作的这一切完全是为了试一下马刀的锋利吗?当然不是的!

    史载,北宋与北方的辽政权和西北的夏政权长期对峙,景德元年(1004年)澶渊之盟,不仅承认契丹占有幽云十六州的合法性,还每年送银20万两、绢十万匹,开创了岁币的恶例。每次议和都要拿出如此之巨的钱财物作为贡品,不是要把宋朝的财政压垮吗,或者搞得连年赤字吗?对此,我要负责任地指出:不!我们用不着为大宋王朝杞人忧天。

    追溯千年,宋朝在当时可谓超级富国了,这一点贡品只是九牛一毛了。当时,中国就与南太平洋、中东、非洲、欧洲等50多个国家通商贸易。清明上河图描绘的繁华景象千年后仍让世人惊叹不已。但富不简单地等同于强。落后就要挨打,而一个没有尚武精神、没有强大国防作后盾的民族,即使经济再强大繁荣,也同样会挨打,会丧权辱国。

    幽云十六州是后晋之后包括宋代在内的汉族子民心头的一个痛处。公元936年,后唐河东节度使石敬瑭反唐自立,向契丹求援。契丹出兵扶植其建立晋国,辽太宗与石敬瑭约为父子。作为条件,两年后,即公元938年,石敬瑭把幽云十六州之地献出来,使得辽国的疆域扩展到长城一线。宋朝的统治者多次想收复幽云十六州,但几次准备或攻打未果后不得不放弃了。“宫梅粉淡,岸柳金匀,皇州乍庆春回。凤阙端门,棚山彩建蓬莱。”赵佶的这首《声声慢》,字里行间渗透了奢华、渗透了脂粉、渗透了优雅。这种优雅舒坦的生活实在太惬意了,宋王朝的大小官员哪里舍得去打破呢?收复的事只能放一边去了。后来,宋朝干脆承认外族对幽云十六州拥有主权的合法性,而宋王朝的子民们,称辽兵为“虎狼之师”,可见全国上下惧怕之深。

    日子越安逸,统治者越不敢有敌人。既然不敢有敌人,就没有必要保持强大的军队了。这是宋朝最高统治者的治国逻辑,也是其推行的“重文教,抑武事”的基本国策的心理基础。最高统治者关注的焦点通常是社会力量的汇聚点。宋时,文化发展到空前高度,欧阳修、范仲淹、苏东坡、王安石、司马光、柳永、辛弃疾、李清照等大家灿若星河。陈寅恪先生评价说:“华夏民族的文化,历数千载之演进,造极于赵宋之世”。就连那些大小官员平时也对咬文嚼字,卖弄文采,风花雪月,浅斟低唱等乐此不疲,以附庸风雅为能事,而一遇国家危机却推诿扯皮,束手无策,甚至奴颜婢膝,卑躬屈节。由于文气过重,很多文人和官员只有借酒消愁,到那花红柳绿处、同是天涯沦落人的歌妓那里寻求理解和安慰;或是寄托老庄,心死抽身,退避入山崖林薮孤芳自赏。天寒翠袖薄,日暮倚修竹,成为中国历史上一个精神木讷的萎靡王朝。

    宋朝拥有上百万常备军,宋神宗登基前禁军、厢军达到140万人,人数不可谓不多,并且开创了人类史上最早使用热兵器的新纪元,把指南针用于军队布阵作战,装备不可谓不先进。但是,基本国策的设计对社会精英的导向作用很大。但由于军人的社会地位一直不高,导致许多人不想从军,不想当军人。文人很多,杰出的军人却很少,名将更是凤毛麟角。由于缺乏军事战略人才,作为国之大事的军事思想、战略、战术就很难得到提高。缺乏决断,选择了抱薪救火,以致外敌气焰日胜,东吞一地,西割一城,后来又因为太过天真同金一起灭辽,妄想分得一城半镇,不想却丢了半壁江山,连皇帝都被掳去,剩了个南宋,落得千古笑柄。以后的故事,就是大家熟知了。

    在残酷竞争的世界,武功与文治是一个孪生体。国家对武功建设的思路和手段的调整,文治迟早会作出相应的反映。不论武功与文治方略调整孰先孰后,文治依赖于武功是一个不争的事实。从一定意义上讲,一个国家与民族的发展和进步与自己的敌人是分不开的。因为有敌人,看到了努力的方向;因为有敌人,产生了前进的动力;因为有敌人,就有了追赶的对象。

    敢有敌人,不是为了主动拥有敌人。在这个世界上,只要有竞争存在,优胜劣汰是亘古不变定律。一个民族要生存发展下去,必须有敌情意识,并且不断培育善于战斗的勇气和禀性,否则经济与文化无以依附。一个民族保家卫国的军事才能,是一个民族的立身之本、生存之本。

    子在川上曰:逝者如斯夫,不舍昼夜。千年过去了,大宋王朝风花雪月的岁月残废了,没有底力的繁荣早已蒸腾为覆灭的哀曲,不敢有敌人的王朝心理正躺在历史的教科书里呻吟着……

摘自:http://club.mil.news.sina.com.cn/thread-285572-1-1.html

201011 月22

占位置

有人发帖:大学时候,我一同学早上用包子占位置,结果包子被人吃了,位置也没了……
有人回复评论:大学时候,我一同学早上让女友占位置,结果女友被人抢了,位置也没了……

201011 月21

清华女人就是专业

清华女人就是专业,今儿在C楼听见一个女的打电话:“刚开始你把我当氧气,后来当空气,再后来当二氧化碳,现在已经把我当一氧化碳了,你什么意思!”

201011 月21

世上什么最坚强

一个女子对一个男子说:“你知道世上什么最坚强?”
男的答:“不知道。”
女的说:“你的胡子。”
男的问:“为什么?”
女的说:“因为你的脸皮这么厚它还能破茧而出……”

201011 月21

七星瓢虫

昨天我拔完火罐后去游泳,正游得高兴的时候,忽然听到身后有个小女孩大声说:“七星瓢虫!”我不知道发生了什么事,就回头看了她一下,结果她马上哭着对妈妈说“妈妈,瓢虫精……”

201011 月20

卖糖葫芦

一天,一理发师把一卖糖葫芦的给打伤了,警察问起原因,理发师生气地说:”这个土包子!!我正在给客人烫头发,他就在外面大声叫嚷:烫糊喽~!烫糊喽~!“

201011 月19

你们什么时候打回来的

某剧组在村庄外拍戏。间歇期间,一群扮演国民党军官和士兵的演员未卸装进村找厕所,在村口碰到一老农,向其打听厕所。老农激动地握着演员的手说:你们什么时候打回来的?先别上厕所了,我带你们去抓村干部,太贪了。

201011 月19

Can you speak Chinese?

前段时间,我去家易出莲花购物,结账台上有两个外国友人在我前面结账,当时店员问:”Can you speak Chinese?”,两个外国友人用中文回答”如果你讲慢一点的话,我们可以听懂!”,店员接着说:”Can……you……speak……Chinese?”

201011 月19

明年今日

香港一男孩和北京一MM在陈奕迅的演唱会上相遇,一见钟情,迅速相恋。后来,男孩参加了无国界医生要去非洲工作,临行前他送女孩一个音乐盒,里面的曲子是《明年今日》。一年后,男孩回国,女孩已嫁人。女孩对来找她的男孩说,“对不起,我以为你是要我等《十年》……@吹神

201011 月18

市场经济

沪市,沪市,我是深市,我方损失惨重,收到请回答,收到请回答……
深市,深市,我是沪市,我方已全部阵亡,这是自动留言,无需回答……
沪市沪市,深市深市,我是菜市我是菜市,我们这里涨个不停
菜市,菜市,我是楼市,你那点鸡毛蒜皮的也算是涨啊
楼市,楼市, 我是人事,今年工资再降工资再降
人事 ,人事, 我是董事,工资不能降,要涨起来,把人留住,但不要给他们发工资
董事董事,我是西红柿,工资再不发,我就烂在菜市……

201011 月18

MyCity 我的城市街拍,新浪微博街拍Android客户端 1.0发布

MyCity —我的城市街拍 1.0

是Android上的一个新浪微博的客户端,目的是实现手机上街拍发布图片和地理位置信息到微博的功能。
现阶段主要实现以下功能:
1. 通过MyCity拍照,可以把图片发布到微博
2. 通过MyCity获得GPS地理位置,分享到微博(通过google地图展示)
3. 用户可以附加100字以内的说明文字

下载地址: /MyCity.apk

使用说明:
按MENU键或第一次按发布键绑定微博帐号,进行拍照后附加文字发布微博,若在室外空旷处运行获得GPS地理位置信息后程序会自动在微博内容中添加google地图链接。

更新日志:
1、2010-11-18 9:00 修改位置信息未添加到微博中的bug,囧,我的错。

应用效果

201011 月17

新浪微博Android 客户端通过HTTP POST发布图片和文字源代码(作废)

1、发送图片+文字

要特别注意,图片的文件名要为 pic 才会被新浪接收。

              Map map = new HashMap();
	   map.put("source", "appkey");//改成自己的key
	   map.put("status", txt);
	   postImg("http://api.t.sina.com.cn/statuses/upload.json",map,Environment.getExternalStorageDirectory()+ "/temp.jpg"
								,"帐号名字","密码");
              /**
	 * 直接通过HTTP协议提交数据到服务器,实现表单提交功能
	 * @param actionUrl 上传路径
	 * @param params 请求参数 key为参数名,value为参数值
	 * @param filename 上传文件
	 * @param username 用户名
	 * @param password 密码
	 */
	private void postImg(String actionUrl,Map<String, String> params, String  filename,String username,String password) {
		try {
			String BOUNDARY = "--------------et567z"; //数据分隔线
			String MULTIPART_FORM_DATA = "Multipart/form-data";  

			URL url = new URL(actionUrl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

			conn.setDoInput(true);//允许输入
			conn.setDoOutput(true);//允许输出
			conn.setUseCaches(false);//不使用Cache
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Charset", "UTF-8");
			conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + ";boundary=" + BOUNDARY);
			String usernamePassword=username+":"+password;
			conn.setRequestProperty("Authorization","Basic "+new String(SecBase64.encode(usernamePassword.getBytes())));

			StringBuilder sb = new StringBuilder();  

			//上传的表单参数部分,格式请参考文章
			for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容
				sb.append("--");
				sb.append(BOUNDARY);
				sb.append("\r\n");
				sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
				sb.append(entry.getValue());
				sb.append("\r\n");
			}
			//            System.out.println(sb.toString());
			DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
			outStream.write(sb.toString().getBytes());//发送表单字段数据
			byte[] content = readFileImage(filename);
			//上传的文件部分,格式请参考文章
			//System.out.println("content:"+content.toString());
			StringBuilder split = new StringBuilder();
			split.append("--");
			split.append(BOUNDARY);
			split.append("\r\n");
			split.append("Content-Disposition: form-data;name=\"pic\";filename=\"temp.jpg\"\r\n");
			split.append("Content-Type: image/jpg\r\n\r\n");
			System.out.println(split.toString());
			outStream.write(split.toString().getBytes());
			outStream.write(content, 0, content.length);
			outStream.write("\r\n".getBytes());  

			byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();//数据结束标志
			outStream.write(end_data);
			outStream.flush();
			int cah = conn.getResponseCode();
			//            if (cah != 200) throw new RuntimeException("请求url失败:"+cah);
			if(cah == 200)//如果发布成功则提示成功
			{
				/*读返回数据*/
				//String strResult = EntityUtils.toString(httpResponse.getEntity()); 

				new AlertDialog.Builder(Main.this)
				// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
				.setTitle("")// 设置对话框的标题
				.setPositiveButton("确定",// 设置对话框的确认按钮
						new DialogInterface.OnClickListener() {// 设置确认按钮的事件
					public void onClick(DialogInterface dialog, int which) {

					}})
					.setMessage(" 发布成功 ")// 设置对话框的内容
					.show();
			}
			else if(cah == 400)
			{
				new AlertDialog.Builder(Main.this)
				// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
				.setTitle("")// 设置对话框的标题
				.setPositiveButton("确定",// 设置对话框的确认按钮
						new DialogInterface.OnClickListener() {// 设置确认按钮的事件
					public void onClick(DialogInterface dialog, int which) {

					}})
					.setMessage(" 发布失败  \n 不可连续发布相同内容 ")// 设置对话框的内容
					.show();
			}else{
				throw new RuntimeException("请求url失败:"+cah);
			} 

			//            InputStream is = conn.getInputStream();
			//            int ch;
			//            StringBuilder b = new StringBuilder();
			//            while( (ch = is.read()) != -1 ){
			//                b.append((char)ch);
			//            }
			outStream.close();
			conn.disconnect();
		}
		catch (IOException e)
		{
			e.printStackTrace(); 

		}
		catch (Exception e)
		{
			e.printStackTrace();  

		}  

	}

             public static byte[] readFileImage(String filename) throws IOException {
		BufferedInputStream bufferedInputStream = new BufferedInputStream(
				new FileInputStream(filename));
		int len = bufferedInputStream.available();
		byte[] bytes = new byte[len];
		int r = bufferedInputStream.read(bytes);
		if (len != r) {
			bytes = null;
			throw new IOException("读取文件不正确");
		}
		bufferedInputStream.close();
		return bytes;
	}

2、只发文字

  //POST发布文本信息
	    public  void sendMsg(String status,String username,String password){
			HttpClient httpclient = new DefaultHttpClient();
	        HttpPost httppost = new HttpPost("http://api.t.sina.com.cn/statuses/update.json");
		        //NameValuePair实现请求参数的封装

		        List  params = new ArrayList ();
		        params.add(new BasicNameValuePair("source", "4016954419"));
		        params.add(new BasicNameValuePair("status", status));
		        try
		        { 

		          //添加请求参数到请求对象

		        	httppost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
		        	httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); 

		        	String data=username+":"+password;
		        	httppost.addHeader("Authorization","Basic "+new String(SecBase64.encode(data.getBytes())));
		        	httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");

		          //发送请求并等待响应
		          HttpResponse httpResponse = new DefaultHttpClient().execute(httppost);
		          //若状态码为200 ok
		          if(httpResponse.getStatusLine().getStatusCode() == 200)
		          {
		            //读返回数据
		            //String strResult = EntityUtils.toString(httpResponse.getEntity()); 

		            new AlertDialog.Builder(Main.this)
					// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
					.setTitle("")// 设置对话框的标题
					.setPositiveButton("确定",// 设置对话框的确认按钮
				    new DialogInterface.OnClickListener() {// 设置确认按钮的事件
				        public void onClick(DialogInterface dialog, int which) {

				    }})
					.setMessage(" 发布成功 ")// 设置对话框的内容
					.show();
		          }
		          else if(httpResponse.getStatusLine().getStatusCode() == 400)
		          {
		        	  new AlertDialog.Builder(Main.this)
						// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
						.setTitle("")// 设置对话框的标题
						.setPositiveButton("确定",// 设置对话框的确认按钮
				    new DialogInterface.OnClickListener() {// 设置确认按钮的事件
				        public void onClick(DialogInterface dialog, int which) {

				    }})
						.setMessage(" 发布失败  \n 不可连续发布相同内容 ")// 设置对话框的内容
						.show();
		          } 

		        }
		        catch (ClientProtocolException e)
		        {
		          e.printStackTrace();
		          et.setText(et.getText()+" Error1:"+e.getMessage());
		        }
		        catch (IOException e)
		        {
		          e.printStackTrace();
		          et.setText(et.getText()+" Error2:"+e.getMessage());
		        }
		        catch (Exception e)
		        {
		          e.printStackTrace();
		          et.setText(et.getText()+" Error3:"+e.getMessage());
		        }  

		 }

3、加密类 SecBase64.java

package wizzer.cn.app;

public class SecBase64 {
private static final byte[] encodingTable = { (byte) 'A', (byte) 'B',
    (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',
    (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L',
    (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q',
    (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V',
    (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a',
    (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f',
    (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k',
    (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p',
    (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u',
    (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z',
    (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4',
    (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9',
    (byte) '+', (byte) '/' };
private static final byte[] decodingTable;
static {
   decodingTable = new byte[128];
   for (int i = 0; i < 128; i++) {
    decodingTable[i] = (byte) -1;
   }
   for (int i = 'A'; i <= 'Z'; i++) {
    decodingTable[i] = (byte) (i - 'A');
   }
   for (int i = 'a'; i <= 'z'; i++) {
    decodingTable[i] = (byte) (i - 'a' + 26);
   }
   for (int i = '0'; i <= '9'; i++) {
    decodingTable[i] = (byte) (i - '0' + 52);
   }
   decodingTable['+'] = 62;
   decodingTable['/'] = 63;
}

//加密

public static byte[] encode(byte[] data) {
   byte[] bytes;
   int modulus = data.length % 3;
   if (modulus == 0) {
    bytes = new byte[(4 * data.length) / 3];
   } else {
    bytes = new byte[4 * ((data.length / 3) + 1)];
   }
   int dataLength = (data.length - modulus);
   int a1;
   int a2;
   int a3;
   for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) {
    a1 = data[i] & 0xff;
    a2 = data[i + 1] & 0xff;
    a3 = data[i + 2] & 0xff;
    bytes[j] = encodingTable[(a1 >>> 2) & 0x3f];
    bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f];
    bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f];
    bytes[j + 3] = encodingTable[a3 & 0x3f];
   }
   int b1;
   int b2;
   int b3;
   int d1;
   int d2;
   switch (modulus) {
   case 0: 
    break;
   case 1:
    d1 = data[data.length - 1] & 0xff;
    b1 = (d1 >>> 2) & 0x3f;
    b2 = (d1 << 4) & 0x3f;
    bytes[bytes.length - 4] = encodingTable[b1];
    bytes[bytes.length - 3] = encodingTable[b2];
    bytes[bytes.length - 2] = (byte) '=';
    bytes[bytes.length - 1] = (byte) '=';
    break;
   case 2:
    d1 = data[data.length - 2] & 0xff;
    d2 = data[data.length - 1] & 0xff;
    b1 = (d1 >>> 2) & 0x3f;
    b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;
    b3 = (d2 << 2) & 0x3f;
    bytes[bytes.length - 4] = encodingTable[b1];
    bytes[bytes.length - 3] = encodingTable[b2];
    bytes[bytes.length - 2] = encodingTable[b3];
    bytes[bytes.length - 1] = (byte) '=';
    break;
   }
   return bytes;
}

//解密

public static byte[] decode(byte[] data) {
   byte[] bytes;
   byte b1;
   byte b2;
   byte b3;
   byte b4;
   data = discardNonBase64Bytes(data);
   if (data[data.length - 2] == '=') {
    bytes = new byte[(((data.length / 4) - 1) * 3) + 1];
   } else if (data[data.length - 1] == '=') {
    bytes = new byte[(((data.length / 4) - 1) * 3) + 2];
   } else {
    bytes = new byte[((data.length / 4) * 3)];
   }
   for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) {
    b1 = decodingTable[data[i]];
    b2 = decodingTable[data[i + 1]];
    b3 = decodingTable[data[i + 2]];
    b4 = decodingTable[data[i + 3]];
    bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
    bytes[j + 2] = (byte) ((b3 << 6) | b4);
   }
   if (data[data.length - 2] == '=') {
    b1 = decodingTable[data[data.length - 4]];
    b2 = decodingTable[data[data.length - 3]];
    bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
   } else if (data[data.length - 1] == '=') {
    b1 = decodingTable[data[data.length - 4]];
    b2 = decodingTable[data[data.length - 3]];
    b3 = decodingTable[data[data.length - 2]];
    bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
   } else {
    b1 = decodingTable[data[data.length - 4]];
    b2 = decodingTable[data[data.length - 3]];
    b3 = decodingTable[data[data.length - 2]];
    b4 = decodingTable[data[data.length - 1]];
    bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
    bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
   }
   return bytes;
}

//解密

public static byte[] decode(String data) {
   byte[] bytes;
   byte b1;
   byte b2;
   byte b3;
   byte b4;
   data = discardNonBase64Chars(data);
   if (data.charAt(data.length() - 2) == '=') {
    bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];
   } else if (data.charAt(data.length() - 1) == '=') {
    bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];
   } else {
    bytes = new byte[((data.length() / 4) * 3)];
   }
   for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) {
    b1 = decodingTable[data.charAt(i)];
    b2 = decodingTable[data.charAt(i + 1)];
    b3 = decodingTable[data.charAt(i + 2)];
    b4 = decodingTable[data.charAt(i + 3)];
    bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
    bytes[j + 2] = (byte) ((b3 << 6) | b4);
   }
   if (data.charAt(data.length() - 2) == '=') {
    b1 = decodingTable[data.charAt(data.length() - 4)];
    b2 = decodingTable[data.charAt(data.length() - 3)];
    bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
   } else if (data.charAt(data.length() - 1) == '=') {
    b1 = decodingTable[data.charAt(data.length() - 4)];
    b2 = decodingTable[data.charAt(data.length() - 3)];
    b3 = decodingTable[data.charAt(data.length() - 2)];
    bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
   } else {
    b1 = decodingTable[data.charAt(data.length() - 4)];
    b2 = decodingTable[data.charAt(data.length() - 3)];
    b3 = decodingTable[data.charAt(data.length() - 2)];
    b4 = decodingTable[data.charAt(data.length() - 1)];
    bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
    bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
    bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
   }
   return bytes;
}

private static byte[] discardNonBase64Bytes(byte[] data) {
   byte[] temp = new byte[data.length];
   int bytesCopied = 0;
   for (int i = 0; i < data.length; i++) {
    if (isValidBase64Byte(data[i])) {
     temp[bytesCopied++] = data[i];
    }
   }
   byte[] newData = new byte[bytesCopied];
   System.arraycopy(temp, 0, newData, 0, bytesCopied);
   return newData;
}

private static String discardNonBase64Chars(String data) {
   StringBuffer sb = new StringBuffer();
   int length = data.length();
   for (int i = 0; i < length; i++) {
    if (isValidBase64Byte((byte) (data.charAt(i)))) {
     sb.append(data.charAt(i));
    }
   }
   return sb.toString();
}

private static boolean isValidBase64Byte(byte b) {
   if (b == '=') {
    return true;
   } else if ((b < 0) || (b >= 128)) {
    return false;
   } else if (decodingTable[b] == -1) {
    return false;
   }
   return true;
}

//测试类
public static void main(String[] args) {
   String data = "wizzer@qq.com:etpass";
   byte[] result = SecBase64.encode(data.getBytes());// 加密
   System.out.println("Basic "+data);
   System.out.println("Basic "+new String(result));
   System.out.println(new String(SecBase64.decode(new String(result))));// 解密
   }
}
201011 月16

Android 2.1 GPS定位和拍照功能代码

1、GPS功能代码

private void getLocation()
	{
		LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
				 200, 0, locationListener);

	}
	private final LocationListener locationListener = new LocationListener() {
	    public void onLocationChanged(Location location) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
	        // log it when the location changes
	        if (location != null) {
	        	Lat.setText(String.valueOf(location.getLatitude()));
	        	Lon.setText(String.valueOf(location.getLongitude()));

	        }
	    }

	    public void onProviderDisabled(String provider) {
	    // Provider被disable时触发此函数,比如GPS被关闭
	    }

	    public void onProviderEnabled(String provider) {
	    //  Provider被enable时触发此函数,比如GPS被打开
	    }

	    public void onStatusChanged(String provider, int status, Bundle extras) {
	    // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
	    }
	};

2、拍照功能代码

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     // Hide the window title.
		requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main);
        imageView = (ImageView) this.findViewById(R.id.iv1);
		Button button = (Button) this.findViewById(R.id.bt1);
		button.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
				intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
						.fromFile(new File(Environment
								.getExternalStorageDirectory(), "temp.jpg")));
				intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
				startActivityForResult(intent, 0);
			}
		});

    }
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
			this.imageView.setImageDrawable(Drawable.createFromPath(new File(
					Environment.getExternalStorageDirectory(), "temp.jpg")
					.getAbsolutePath()));

		}
	}

3、退出程序确认

public boolean onKeyDown(int keyCode, KeyEvent event) {

		//按下键盘上返回按钮
		if(keyCode == KeyEvent.KEYCODE_BACK){
			new AlertDialog.Builder(Main.this)
			// Main.this视情况而定,这个一般是指当前显示的Activity对应的XML视窗。
			.setTitle("")// 设置对话框的标题
			.setMessage(" 确定退出? ")// 设置对话框的内容
			.setPositiveButton("确定",// 设置对话框的确认按钮
			    new DialogInterface.OnClickListener() {// 设置确认按钮的事件
			        public void onClick(DialogInterface dialog, int which) {
			            //退出程序
			            android.os.Process.killProcess(android.os.Process.myPid());
			    }})
			.setNegativeButton("取消",// 设置对话框的取消按钮
			    new DialogInterface.OnClickListener() {// 设置取消按钮的事件
			        public void onClick(DialogInterface dialog, int which) {
			            // 如果你什么操作都不做,可以选择不写入任何代码
			            dialog.cancel();
			    }}
			).show();

			return true;
		}else{		
			return super.onKeyDown(keyCode, event);
		}
	}