●程式說明
(一)DAO與SQLite的教學可參考此篇文章
●程式參考(GitHub):透過Enum選擇Data Storage的方式(SQLite, FileWriter, Memory )
●程式說明
(一)DAO與SQLite的教學可參考此篇文章
●程式參考(GitHub):透過Enum選擇Data Storage的方式(SQLite, FileWriter, Memory )
●程式說明--Android Unit Test
●程式參考(GitHub):Android Unit Test單元測試 (測試程式與DAO和SQLite的程式放在一起)
●補充說明--推播機制
1.不分android或ios,推播是推給系統,是GOOGLE 推給系統,先把要推播的內容給APP的SERVER,APP的SERVER會告訴GOOGLE SERVER要推給誰,GOOGLER SERVER再推給系統,再把APP叫出來
●程式說明:
●程式參考(GitHub):使用Google Firebase Cloud Messaging接收推播訊息
●畫面預覽:
●程式說明:
**有時候建立好廣告後,廣告並沒有正常顯示,看logcast可以看到一段訊息:Ads:Ad fail to load : 0,出現這段訊息代表你的程式沒有問題,是因為廣告單元剛建立google server還沒有立刻提供適合的廣告,要等一段時間(時間不定)就會正常顯示
●程式參考(GitHub):Google Admob--在自己的app中增加google廣告單元
●程式說明:
*注意,在使用內建的Google Maps Activity可能會遇到下面這個問題
(出現訊息:inconvertible types; cannot cast 'android.support.v4.app.fragment' to 'com.google.android.gms.maps.SupportMapFragment' )
=>要把SupportFragmentManger轉為SupportMapFragment時,出現紅線顯示無法轉換type,這是因為在google paly-services-maps:17.0.0中,SupportMapFragmentnow 改為extends androidx.fragment.app.Fragment,而非android.support.v4.app.Fragment
=>解決辦法是把play-services-maps改為16.0.1或是把專案整合為androidX版本,這邊是直接改play service版本
●程式參考(GitHub):使用Android Studio內建Google Maps Activity建立Google Map
●程式說明 --兩個copy資料的方法,和一個讀取sqlLite的內容,最後讓使用者輸入的資料可以加入資料庫
●補充說明--加密
●程式說明--AES加密(代替DES,做完加密以後,還要把程式混亂,可以使用proguard反編譯工具)
●程式參考(GitHub):Android AES加密(使用com.scottyab:aescrypt)
●程式說明--多重執行緒補充
=>run倒數計時
●程式參考(GitHub):多重執行續的補充說明(CountDownTimer、Handler、runOnUiThread、AsynTask)
●程式說明
(一)Firebase Realtime Database
=>使用雲端資料庫交換資料
=>先連結google帳號和firebase
●程式參考(GitHub):透過Android Studio內建機制使用FireBase Realtime Database
●程式說明
**上述兩種做法的缺點:當要載入的圖片很大時,不會出現進度條,要等全部載完才會有反應,但可以使用轉圈圈的方式
●程式參考(GitHub):使用volley ImageRequest和Picasso下載圖片資源
●補充說明
(一)用volley來寫網路的存取程式
=>volley是google官方作的,且為google官方推薦的第三方元件,已經把抓資料的細節都包好了
=>使用volley有四個步驟
1.建立queue(佇列)=>排隊
2.建立request(要求)=>去存取一個網路資源的要求,執行第二個步驟時,要丟三個參數
=>
a.url
b.成功了要做甚麼=>這是在主執行緒上做,所以可以動到ui
c.失敗了要做甚麼
3.把2加入1(讓request排隊)
4. 1.start();(叫隊伍開始動)
=>做之前要先設定權限
●程式說明
(ㄧ)Volley的部分
(二)Json的部分可以分為兩種做法
作法一:使用JSONArray和JSONObject
作法二:利用gson函式庫(https://github.com/google/gson) 也是google的
MainActivity.java
●程式參考(GitHub):
實作透過Volley、JSONArray、JSONObject、GSON取得Open Data資料
●程式說明
=>把抓到的rss新聞標題用listview的方法呈現出來
=>點擊每一個listview就要抓到它的link連出去(丟到下一頁,載入webview)
(二)MyDataHandler
(三)MainActivity.java
●程式參考(GitHub):實作讀取新聞網站的RSS
●畫面預覽
=>點擊SAX按鈕後,下方出現Udn RSS新聞列表
●補充說明
(二)RSS xml的取得
=>以udn新聞網為例,選取上方RSS,再到下方選定要Feed的rss類別
=>開啟RSS XML 的URL位址
●程式參考(GitHub):實作讀取新聞網站的RSS
●程式參考(GitHub):利用HttpURLConnection、InputStream、BufferReader存取網路資源
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
int permission = ActivityCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { //未取得權限,向使用者要求允許權 //因為要辨別使用者允許的是寫入還是讀取所以這邊的string只放write ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE); }else{ //已有權限,可進行檔案存取 sdwrite(); } } @Override public void onRequestPermissionsResult (int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==REQUEST_EXTERNAL_STORAGE){ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //取得權限,進行檔案存取 String str=permissions[0]; //這邊用if判斷時要用equals(),不能用== if(str.equals("android.permission.WRITE_EXTERNAL_STORAGE") ){ sdwrite(); }else { sdread(); } } else { //使用者拒絕權限,停用檔案存取功能 } } } private void sdwrite(){ File f = Environment.getExternalStorageDirectory(); Log.d("FNAME","read"+f.getAbsolutePath()); File f2 = new File(f.getAbsolutePath() + File.separator + "mydata"); f2.mkdir(); File txtFile = new File(f2.getAbsolutePath() + File.separator + "data5.txt"); try { FileWriter fw = new FileWriter(txtFile); BufferedWriter bw = new BufferedWriter(fw); bw.write("this is test"); bw.newLine(); bw.write("This is test2"); bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } public void nolimitread(View view) { int permission = ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { //未取得權限,向使用者要求允許權 ActivityCompat.requestPermissions(this, new String[]{READ_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE); }else{ //已有權限,可進行檔案存取 sdread(); } } private void sdread(){ File f = Environment.getExternalStorageDirectory(); Log.d("FNAME", f.getAbsolutePath()); File f2 = new File(f.getAbsolutePath() + File.separator + "mydata"); File txtFile = new File(f2.getAbsolutePath() + File.separator + "data5.txt"); try { FileReader fr = new FileReader(txtFile); BufferedReader br = new BufferedReader(fr); String str; while ((str=br.readLine()) != null) { Log.d("FNAME", "Read:" + str); } br.close(); fr.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
●程式參考(GitHub):讀寫外部資料與設定讀寫外部資料權限
●補充說明和程式說明
(一) 檔案的讀取使用FileReader比較不好用,因為讀出來會是字元陣列,一般會使用BufferedReader和BufferedWriter=>可以直接處理字串
●補充說明和程式說明---檔案存取
●程式參考(GitHub):使用FileWriter和FileReader做檔案(File)的讀取與寫入