它终于回来了.我的QQ机器人
KVB android beta版 发布了!
本文已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
为princehaku原创 如果您忘了我的地址 请使用google搜索 “Android开发日志”
这个耗时很久的东西终于弄完了..
白天在公司php..
晚上java…
先说说kvb是什么.
kvb呢 准确的说是cdutkvb
专门用于成都市理工大学的程序
它会根据你提供的教务处登陆账号和密码自动从教务处抓取到课表信息
然后解析成手机的日程 存入手机
也就是说 你只需要运行它一次 就可以把当学期的所有课程存入手机
附上一个流程说明图
以下是演示视频 (4M)
这个是android 的 beta版..
因为模拟器上没有日程…所以不知道真机的效果如何..
所有源码都是公开的
您可以访问这里可以获取源码以及更新
android版下载地址 AndroidKVB-beta(点击下载)
(BETA版因服务器不能访问..现不提供下载 已经更新至正式版 请点击进入)
另外 ..j2me版会尽量在开学前完成…
关键字:
发现很多老图..站票,校庆,猝死..
上次开复博士来理工的票…当然不是我的票..我是工作人员.嗷嗷..两年了…时间真快啊….
这个是西北80校庆的…可惜当时我也没去
女朋友写的…当然..当时还不是我女朋友…也一年多了..时间真快啊.~
关键字:
Android开发日志 线程安全 小总结
本文已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
为princehaku原创 如果您忘了我的地址 请使用google搜索 “Android开发日志”
今天弄了一天的这个软件…
最大的感受就是..
线程安全..既可靠又可恨,,
可恨的是每次都得重新写了Handler..不然不能调用..
比如alert
如果我在线程中直接调用了个alert..将会报错..
下面这个类是一个alert框体.
/**
* Copyright (c) 2010 princehaku
* All right reserved.
* Author princehaku
* Site http://3haku.net
* Created on : 2010-8-8, 10:12:28
*/
package org.me.androidkvb;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
/**消息提示类
*
* @author princehaku
*/
public class Alert {
/**资源
*
*/
private static Context res;
Dialog alert;
/**从上级资源中构建
* res一般是当前活动的Activity
* @param res
*/
Alert(Context res) {
this.res = res;
}
/**显示对话框
*
* @param title
* @param message
*/
public void show(String title,String message) {
Message msg = new Message();
Bundle ble = new Bundle();
ble.putString("title", title);
ble.putString("msg", message);
msg.setData(ble);
this.alertHandler.sendMessage(msg);
}
/**隐藏对话框
*
*/
public void destory() {
if(alert!=null){
alert.dismiss();
}
}
/**隐含的方法
* 显示对话框
* @param info
*/
private void alert(String title,String info) {
if (alert != null) {
alert.dismiss();
}
alert = new AlertDialog.Builder(res).setIcon(android.R.drawable.ic_dialog_alert).setTitle(title).setMessage(info).show();
}
/**Hander
* 保证线程安全
*/
public Handler alertHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
alert(msg.getData().getString("title"),msg.getData().getString("msg"));
super.handleMessage(msg);
}
};
}
使用的时候如下
/** * * @author princehaku */ public class MainActivity extends Activity implements OnClickListener{ Alert alert; public Alert getAlert(){ if(alert==null)alert=new Alert(this); return alert; } public void onCreate(Bundle icicle) { super.onCreate(icicle); Thread t=new Thread(){ @Override public void run() { getAlert().show("Please Wait","开始联网获取课表信息"); } }; t.start(); }
不仅仅是这个…只要非安全线程调用都得用Handler去处理
=================================================
哎…看来还得写很多…因为多线程的用户体验比单线程好..
如果超过5秒就会提示退出了..
so…coding…
另外…进度展示
已经可以解释出序列化的课表了..
也可以显示出来…还有具体解析时的进度 自己弄了个假的条形的进度条…
关键字:
Android开发日志 HTTP联网下载
本文已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
为princehaku原创 如果您忘了我的地址 请使用google搜索 “Android开发日志”
最开始看到Android的参考文档..发现有java.net.HttpURLConnection一阵狂喜..
之前有用HttpURLConnection封装了HTTP的GET和POST两个方法..于是直接将以前的类放入
但是出问题了..什么都没有返回..去掉final..跳出了警告…
过多的重定向?..什么意思…找啊找…看到某论坛上的一位和我的差不多.
只是少了很多的setRequestProperty
难道是因为这个?..
于是乎..去掉所有的setRequestProperty
然后正常了…
好了..得到GAE上返回的数据了…接下来就是在手机再次解析这些数据..然后存入日程..
还有就是得新加个进程…服务器上的数据也要改..中间得加缓存机制..不然超时很容易….希望明天能搞定…
最后放上下载的类 ..去掉了POST..去掉了cookie…基本只能用来单下载了…
package VirtualBroser; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /** * 下载网页内容 * * @author princehaku */ public class VB { /** * url * * @param url * 提交地址 * @param encode * 编码 */ @SuppressWarnings("finally") public String get(String url, String encode) throws Exception { String line = ""; String content = ""; HttpURLConnection httpConn = null; try { URL turl = new URL(url); // System.out.println(url); httpConn = (HttpURLConnection) turl.openConnection(); httpConn.setRequestMethod("GET"); httpConn.connect(); InputStream uurl=null; uurl = httpConn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(uurl, encode)); while (line != null) { line = br.readLine(); if (line != null) content = content.toString() + line.toString() + "\n"; } // 关闭连接 httpConn.disconnect(); // System.out.println(content); return content; } catch (Exception e) { // 关闭连接 httpConn.disconnect(); // System.out.println(e.getMessage()); throw e; } } }
关键字:
Android开发日志 日程处理
本文已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
为princehaku原创 如果您忘了我的地址 请使用google搜索 “Android开发日志”
最近制作的KVB – 全自动课表生成器..android版快要接近尾声了…
这个是系统流图..
抓取课表和产生日程部分..都是由服务器进行处理
目前已经放置到GAE..由google app engine进行处理
返回的结果比原有数据少很多..极大的减轻了手机的资源耗尽..
现在在手机部分还有个问题.就是将服务器返回的结果以日程的方式存入手机.
记得j2me上可以使用jsr75规范进行PIM的各种处理
google了一下..发现android也是可以操作日程的
使用前需要在manifest.xml中加入
<uses-permission android:name="android.permission.READ_CALENDAR"> </uses-permission> <uses-permission android:name="android.permission.WRITE_CALENDAR"> </uses-permission>
private void addEvent() { ContentValues event = new ContentValues(); event.put("calendar_id", 1);//唯一的标识符 event.put("title", "Event Title");//标题 event.put("description", "Event Desc");//描述 event.put("eventLocation", "Event Location");//地点 long startTime = 120000000; long endTime = 120010200; event.put("dtstart", startTime);//开始的时间 event.put("dtend", endTime);//结束的时间 Uri eventsUri = Uri.parse("content://calendar/events"); Uri url = getContentResolver().insert(eventsUri, event);//存入 }
但是呢..模拟器不能用…哎…
这个暂时留到最后测试..
先把GAE上的那个给弄好
———————————————-
Update
To access the Corporate Calendar on Motorola devices, use “content://calendarEx” in place of “content://calendar”.
Update 2
For Android devices using 2.2 (Froyo) or greater, where previously you had content://calendar you should write content://com.android.calendar
以上是最近才找到的…加不起日程的原因..2.2 以及摩托罗拉系列改变了uri..需要注意啊!
关键字:
Android开发日志 UI(2) 事件绑定
本文已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
为princehaku原创 如果您忘了我的地址 请使用google搜索 “Android开发日志”
Android里面
常用的事件分为如下几个
这些事件的用法呢?..
其实也很简单
看如下这段代码(来自KVB)
public class MainActivity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); bt=(Button)findViewById(R.id.button); bt.setOnClickListener(this); } /**点击按钮的事件 * */ public void onClick(View arg0) { //To Do } }
这里我将主类实现OnClickListener的方法onClick(View arg0);
关键字:
Android开发日志 UI设计工具
本文为princehaku原创 已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
如果您忘了我的地址 请使用google搜索 “Android开发日志”
今天找到个好东西Android的UI设计工具
其实官方也有个appinventor
不过呢..我没得到批准..而且貌似要用手机才行..
我也没手机..
找到了这个..
这个是它的界面
看不清楚请点一下..
这个工具的功能挺强的..
布局 啊..完全用它没问题..
点Generate可以生成XML..
然后用之前提到的方法即可生成应用的界面..
关键字:
Android开发日志 UI (1)
本文为princehaku原创 已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
如果您忘了我的地址 请使用google搜索 “Android开发日志”
要在android里面设置布局..
setContentView(R.layout.main);
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">" <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello Android from NetBeans"/> </LinearLayout>
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">" <ImageView android:id="@+id/imageview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/bg" /> </LinearLayout>
话说真的很丑么?..
关键字:
Android开发日志 资源文件
本文为princehaku原创 已经参加 “首届 Google 暑期大学生博客分享大赛——2010 Android 篇”
如果您忘了我的地址 请使用google搜索 “Android开发日志”
之前的kvb..
因为有课表的数据..
只是做了小小的测试..
没想到直接把全部的html插入的话..
string会溢出..constant string too long
那就只好用资源文件了!
在android里面的资源文件定义是很方便的
只需要在资源文件夹加入即可
调用的方式如下
InputStream fs =this.getResources().openRawResource(R.raw.kb);
这个是我kvb的详细的例子..读取的kb.html是我的课表html文件..
/** * Copyright (c) 2010 princehaku * All right reserved. * Author princehaku * Site http://3haku.net * Created on : 2010-8-1, 22:31:48 */ package org.me.androidkvb; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import net._3haku.kvb.CourseTable.CourseTable; import net._3haku.kvb.util.Parser; /** * * @author princehaku */ public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); // ToDo add your GUI initialization code here TextView tv = new TextView(this); setContentView(tv); try { tv.setText("please wait"); InputStream fs =this.getResources().openRawResource(R.raw.kb); InputStreamReader read = new InputStreamReader (fs,"gb2312"); BufferedReader in = new BufferedReader(read); String kbhtml="";//FileInputStream fs; tv.setText("step1"); int i=0; while(in.ready()&&i++<1000) { kbhtml +=in.readLine(); } fs.close(); CourseTable Tb=Parser.parseTable(kbhtml); tv.setText("step2"); String res=Tb.getRowNums()+"周\r\n"+Tb.getCoursesNums()+"个课程\r\n"; tv.setText(res); } catch (Exception ex) { tv.setText(ex.getMessage()); } } }
关于i那个地方…
之前没有加..一直不知道是什么原因..
加i是限制读取的长度..
虽然说只读取了1k行..
但是还是不得行…
总共有2800+行…
算了..解析放服务器上去..
就让手机解析XML文件..然后生成日程把!
关键字:



![d708f3cdb323b1700eb345da[1]](http://3haku.net/wp-content/uploads/2010/08/d708f3cdb323b1700eb345da1.jpg)
![347ac13f6dea5de17c1e71f1[1]](http://3haku.net/wp-content/uploads/2010/08/347ac13f6dea5de17c1e71f11.jpg)
![737db5ec427ba81e279791fc[1]](http://3haku.net/wp-content/uploads/2010/08/737db5ec427ba81e279791fc1.jpg)



