將學校擺在案頭上-即時更新校內資料的Android案頭組件,校內android
項目地址: https://github.com/hwding/AeolosXDUWidget
求支援(╭ ̄3 ̄)╭♡
本小白所在的學校雖身為某某電子科技大學, 但是網路基礎設施實在是...用於查詢的各個網頁根本用的不是一套系統...也就是說, 如果你想很方便地擷取你的實驗成績\體育打卡次數\校內一卡通的流水情況和餘額以及水電費的使用方式\圖書館借還資訊等等, 你得登入很多不同的網頁使用多套不同的系統輸入不同的賬戶與密碼...(不想吐槽某些系統居然還外包給另外一個某某電子科大...)
所以能不能用一種便捷的方法將重要的資訊及時呈現和重新整理呢?
根據這個需求給自己做了一個小組件放在手機案頭上, 真的很方便! 真的很方便! 真的很方便!
下面放兩張預覽圖
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 這個許可權
緩衝方法:
1 public void getCaptcha(File file) throws IOException { 2 URL url = new URL(HOST + CAPTCHA_SUFFIX); 3 URLConnection urlConnection = url.openConnection(); 4 urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSIONID); 5 urlConnection.connect(); 6 InputStream inputStream = urlConnection.getInputStream(); 7 byte[] bytes = new byte[1024]; 8 FileOutputStream fileOutputStream = new FileOutputStream(file); 9 int LENGTH;10 while ((LENGTH = inputStream.read(bytes)) != -1){11 fileOutputStream.write(bytes, 0, LENGTH);12 }13 inputStream.close();14 fileOutputStream.close();15 }
設定頁面用於Download驗證碼的線程:
1 package xdu.hwding.aeolosxdu; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import java.io.File; 6 import java.io.IOException; 7 import FooPackage.ECard; 8 9 public class CaptchaLoaderThread extends Thread{10 File file;11 ECard eCard;12 Handler handler;13 14 CaptchaLoaderThread(File file, Handler handler) throws IOException {15 this.file = file;16 this.handler = handler;17 }18 19 public void run() {20 try {21 eCard = new ECard();22 eCard.getCaptcha(file);23 Message message = new Message();24 message.obj = eCard;25 handler.sendMessage(message);26 } catch (IOException e) {27 e.printStackTrace();28 }29 }30 }
緩衝成功後通知主線程通過BitMap方式顯示:
1 Handler generateHandler(final ImageView imageView, final File file) { 2 return new Handler() { 3 @Override 4 public void handleMessage(Message msg) { 5 Bitmap bitmap = BitmapFactory.decodeFile(String.valueOf(file)); 6 imageView.setImageBitmap(bitmap); 7 findViewById(R.id.add_button).setEnabled(true); 8 findViewById(R.id.add_button).setOnClickListener(generateOnClickListener((ECard) msg.obj)); 9 }10 };11 }
關於HTML解析:
分析結果頁面抽取有效資訊是最重要的部分, 程式歸根結底是一個爬蟲
JSoup無疑是第一選擇, 參見: Java中解析HTML資料 (利用第三方庫Jsoup)
這裡不做贅述
案頭組件(Widget)的更新周期:
建立案頭組件的時候AndroidStudio會自動產生一個XML設定檔, 裡面定義了組件的某些屬性
1 <?xml version="1.0" encoding="utf-8"?> 2 <appwidget-provider 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:configure="xdu.hwding.aeolosxdu.NewAppWidgetConfigureActivity" 5 android:initialKeyguardLayout="@layout/new_app_widget" 6 android:initialLayout="@layout/new_app_widget" 7 android:minHeight="215dp" 8 android:minWidth="250dp" 9 android:previewImage="@drawable/preview"10 android:resizeMode="vertical"11 android:updatePeriodMillis="1800000"12 android:widgetCategory="home_screen">13 </appwidget-provider>
minHeight 和 minWidth 屬性分別定義了組件的最小尺寸
resizeMode 定義可以縮放的方向
注意這裡最坑的來了!!!
沒有看過文檔的本小白天真的認為這裡可以讓 updatePeriodMillis 低至60000毫秒這樣就可以每分鐘重新整理一次...
然而事實是最低更新周期也得半小時(1800000ms)...如果你想更短只能再跑一個線程然後用廣播通知什麼的
為了這個折騰好長時間的我知道真相眼淚掉下來...