2017年10月16日 星期一

繼續在Eclipse上使用推播功能

2016年以後,GCM開始被停止更新和支援,推播功能也被重新命名為FCM,並使用Firebase做為後台運作的機制。

要使用Firebase的Library,就一定要使用Gradlle並且搭配Android Studio的檔案讀取、解壓縮功能,Maven的Library導入功能並不支援AndroidSDK中的新檔案類型。

解決辦法(第一步)是去Android Studio下建立一個專案後,從這個專案中取出相對應的各種Library。

如果不想這樣做,這裡有人(外國網友:dandar3)幫忙把所有專案都上傳到Github。(同時他也有說明其他步驟...)

(專案中有些AndroidManifest.xml的內容需要被註解起來,因為它的內容是要在APP project的AndroidManifest.xml中完成,而不是在library中。)


接著到Firebase的Console中,建立一個新專案,(原則跟在Google Cloud Plateform下建立新專案並增加一份權限很像。)

建立完成後,Console會提供一份Json檔讓開發者下載,(同時有提供導引讓使用者知道要在Android Studio下如何使用這份檔案。)

但Maven環境不能使用這份檔案,必須要使用XML檔轉複製這份Json的內容。

先在APP Project下建立一份XML檔,附檔名如下、路徑也如下。
res\values\google-services.xml
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="default_web_client_id" translatable="false">{YOUR_CLIENT}/oauth_client/[first client_type 3]</string>
    <string name="gcm_defaultSenderId"   translatable="false">project_info/project_number</string>
    <string name="firebase_database_url" translatable="false">project_info/firebase_url</string>
    <string name="google_app_id"         translatable="false">{YOUR_CLIENT}/client_info/mobilesdk_app_id</string>
    <string name="google_api_key"        translatable="false">{YOUR_CLIENT}/services/api_key/current_key</string>
    <string name="google_storage_bucket" translatable="false">project_info/storage_bucket</string>
</resources>
作者(DanDar3)在後面寫入值的地方留下的指引。

(或是到官方說明文件下看指引。)

例如「{YOUR)CLIENT}/oauth_client/[first client _type 3]」的意思是「在JSON物件的root層找到client參數,然後再往下找到oauth_client參數,接著會發現一個陣列,在陣列第一筆資料中找到client_type,就是要寫入這裡的值。




以下的原則就跟官方指引的內容其實大同小異。

【2017/10/16 19:42 確實可以成功取得FCM的Token,只是還沒被驗證過是否可用或正確。】

【2018/04/09 14:08 getToken如果一直取得Null,要改用需要傳入兩個字串參數值的getToken。兩個字串參數分別是使用getId取得的字串和固定字串「FCM」。】

【2018/04/20 16:33 取得Token時會獲得Invalid_Sender。】



Android的OAuth

要使用Google官方Guide上說明的OAuth2Service,其實有幾個細節要注意。

1.Guide中少了一項uses-permission:android.permission.GET_ACCOUNTS

2.需要到API管理Console中幫這個Android項目建立一筆權限。(任何一個API Project都可以用來建立權限。)

3.一般來說,都是使用「com.google」作為預設的AccountType。(但使用者也可以客製化自己的帳號類別,但我沒做過。)



除此以外,就按照文件做就可以了。

2017年9月25日 星期一

【Android Intent】用Intent啟動Share選項將文章分享給其他APP

關鍵在於將Intent送給Activity Chooser。

程式碼如下:

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "要分享的內容");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, [範例...分享標題...]));
點此看Google Guide文件


如果要分享圖片,使用........

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

uriToImage是指Uri物件可以讀取檔案。

2017年9月22日 星期五

使用Meta-data的方式。PackagetManager、ActivityInfo、ComponentName

AndroidManifest檔中,Application跟Activity下可以加入<meta-data>這個標籤。

這個標籤有兩大類屬性,一個是name,另一個就是value。


可以使用(加入)<meta-data>標籤的類別除了Application和Activity外,Service和Reciever也可以。

主要取得方式是在加入了<meta-data>標籤的類別實作下呼叫getPackageManager,然後再用PackageManager取得ApplicationInfo/ActivityInfo/ServiceInfo/RecieverInfo。

取得各種Info需要搭配ComponentName,不同的狀況下取得ComponentName的方式也都不同。

 Activity有自帶getComponentName()。

 Service和Reciever下要使用ComponentName這個類別,它需要傳入一個Context,和Service或Reciever的Class。

Application則是用getPackageName取得的資料即可。

取得Info後,裏頭有個參數物件「meta」,下面有各種取得資料的函數。只要找到相對應的函數(例如meta-data是字串,就找getString..以此類推),然後輸入名稱(<meta-data>標籤中的name)即可。



========================================================

應用上,這應種是種將程式的邏輯/功能的控制參數分散到AndroidManufest中去設定的技巧。

例如將「連線網址」寫成一個<meta-data>,就可以用一個父類別快速大量複製出連線到不同網站但有相似行為的Activity甚至是APP。

2017年9月20日 星期三

中國大陸的長城擋連線,無法分享檔案

如標題。

大陸內的硬碟空間(微信、百度、QQ)註冊非常繁瑣,都要有個手機門號才能使用,而國外國際間慣用的網路空間幾個有名的大站都被一律封鎖。

如果要知道國外空間能否讓大陸內部取得,可以使用測試網站看看能否連線.......


這次使用的是WEBKAKA....


 這是它的首頁...選擇「國內網站測速」。


選好了往下滑,可以看到這個頁面,右邊的輸入欄就是用來要測速/可否連線的網址輸入欄。




可以看到OpenDrive網站可以連通。