發表文章

目前顯示的是有「android memo」標籤的文章

Android 自動產生 VIEW ID

動態產生 Layout 時一定會遇到 ID配置的問題。 在API > 17後有提供一個  View.generateViewId(),只要在新增的LAYOUT物件設定即可 Button btn = new Button(this); btn.setId(View.generateViewId()); 如果需要API<17要如何是好?我們深入View.generateViewId()看看。 private static final AtomicInteger sNextGeneratedId = new AtomicInteger( 1 ); public static int generateViewId () { for (;;) { final int result = sNextGeneratedId.get(); // aapt-generated IDs have the high byte nonzero; clamp to the range under that. int newValue = result + 1 ; if (newValue > 0x00FFFFFF ) newValue = 1 ; // Roll over to 1, not 0. if (sNextGeneratedId.compareAndSet(result, newValue)) { return result; } } } 看樣子,是用AtomicInteger來增加ID。利用compareAndSet(CAS)來查newValue是否可以置入result的記憶體位址中。另外我們也看到,newValue最高到0x00FFFFFF,0x00FFFFFF以上就會從1再開始。也代表0x00FFFFFF以上是保留給系統工具使用。 所以,g

Notification 改新寫法

Notification Noti=new Notification(); Intent i = new Intent(this, MainActivity.class);    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);               Noti.icon =   R . drawable . notification_icon ; // notification icon id Noti.tickerText=mc.getResources().getString(R.string.app_name); Noti.when=System.currentTimeMillis();      Noti.flags=Notification.FLAG_ONGOING_EVENT;     // setLatestEventInfo 已被放棄 Noti.setLatestEventInfo( mc, mc.getResources().getString( "My notification" ), mc.getResources().getString( "Hello World!" ) , PendingIntent.getActivity(this, 0,i, 0) ); NotificationManager myNM = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE); myNM.notify(0,Noti); 改成如下 NotificationCompat . Builder mBuilder =         new NotificationCompat . Builder ( this )         . setSmallIcon ( R . drawable . notification_icon )         . setCont

Firebase 與 AdMob

圖片
啊!平台跟通路真的是王道啊!叫你往東,就得往東。 從eclipse轉到android studio看樣子是在所難免。連analytics, admob也都跟firebase整合了。也就是說未來轉到firebase也是在所難免。不過也有好處,整合的功能不少。有空就一一來寫。 如果是要結合admob https://firebase.google.com/docs/admob/android/quick-start 我們重點的跑一遍 第一點改 App - level build.gradle 第二點改 Project-level build.gradle       第三點找出 本來ADMOB的廣告單元編號,記得要先跟firebase連結,就會出現最下方的廣告單元編號與舊版發佈商編號。 在參閱設定操作說明中有 應用程式編號 ,我們可以看到後面xxxxxx~nnnnnnnn有一個 ~ 的符號。 廣告單元編號 是xxxxxxx/nnnnnnn有一個 / 的符號。不要搞混了。 提醒使用者要一個activity就申請一個廣告單元。  貼心提示使用者可以把很多的id都放在resource中,如下  第三點,程式跟之前大同小異 重點是呼叫廣告前要先執行  MobileAds.initialize....如下,記得後面的編號是  應用程式編號!! 然後在xml中,廣告編號可xml中加,也可以在 activity 中  A dView.setAdUnitId( "ca-app-pub-2831471Xxxxxxx/9nnnnnnnn" );    或從resource中 ADView.setAdUnitId(getString(R.string.XXXXX)); 主程式 這樣就可以了…我還有遺漏什麼…咦… 對…json 先到 firebase console     https://console.firebase.google.com/ 照指示新增,或是匯入google應用,就可以看到如下 選擇紅框中->管理 下載google-services.json, 將

finished with non-zero exit value

又來了... finished with non-zero exit value 1 這個容易解,從錯誤訊習中可以找到問題。 finished with non-zero exit value 2 從eclipse轉到android studio容易發生,這個是jar的衝突。即然用了gradle來編譯程式,就要把libs中的jar通通砍了。 finished with non-zero exit value 3 記憶體不足。用這個 android { // Other stuffs dexOptions { javaMaxHeapSize "4g" } }

討厭… ADB not responding. You can wait more,or kill “adb.exe” process manually and click 'Restart'

圖片
google 今年又發表了很多新東西,使得原本使用eclipse的人慢慢的要轉移平台到android studio來。一開始就遇 adb 的問題,然後android studio提示要kill adb,如下 看過網路上的諸多作法,adb kill-server,然後 adb start-server。只要看到出現訊息 daemon started successfully,就成功了。 如果不是呢?出現 WSAPOLL找不到輸入點之類的,就找一版舊的adb.exe來把android studio所使用的 adb.exe 取代掉即可。 突然想到在c糟中還有一份android-adk,趕快去找 android-sdk 底下的 platform-tools底下的adb.exe。直接copy,然後取代了android studio的adb.exe… 終於解決。

android google map 使用

圖片
整個流程就是安裝 Google Play Service 的過程。 第一步 到 Android SDK Manager,把Tools更新到最新版吧! 主要更新的有 Android SDK Tools Android SDK Platform-tools Android SDK Build-tools PS. 如果這一步發生版本衝突無法安裝,請參考這一篇( Eclipse 移除 Plugin ),把衝突的版本移除。個人是在ADT上出現了問題,所以把舊ADT 2.0 移除。 移除後,從Help -> Install New Software,再次從  https://dl-ssl.google.com/android/eclipse/ 安裝即可。 第二步: 更新完,會在<android-sdk>/extras/google/底下長出一個 google_play_services, 如果沒有,請重開Eclipse -> Window -> Android SDK Manager 查看 Package 中的 extra 是否存在 google_play_services。如果存在,即可以安裝。 如果還是不存在,請將<android-sdk>/extras/google底下的資料都刪除,再一次重開Eclipse -> Window -> Android SDK Manager 此時extra就會出現google_play_services了。 PS. 我們可能忘了<android-sdk>的位置。沒關係,Eclipse -> Window -> Preferences -> Android 就會看到了。 第2步之1: 安裝完,在Eclipse 中 import -> Existing Android Code Into Workspace ,位置在<android-sdk>/extras/google/google_play_services/libproject/google-play-services_lib,記得複制一份到workspace下,再從workspace下的google-play-servic

AdMod 廣告改版方式

圖片
現在Google不讓 APP 挾帶 GoogleAdMobAdsSdk.jar了。要從 Google Play Service 上要取得服務。因為忙碌的生活一直沒有去改善這一部份。從Google所限定的更改時間到現在,其實舊版還是可以使用的。但為了小心哪一天Google又大刀一揮,我們還是跟著改版吧! 整個流程就是安裝 Google Play Service 的過程。 第一步 到 Android SDK Manager,把Tools更新到最新版吧! 主要更新的有 Android SDK Tools Android SDK Platform-tools Android SDK Build-tools PS. 如果這一步發生版本衝突無法安裝,請參考這一篇( Eclipse 移除 Plugin ),把衝突的版本移除。個人是在ADT上出現了問題,所以把舊ADT 2.0 移除。 移除後,從Help -> Install New Software,再次從  https://dl-ssl.google.com/android/eclipse/ 安裝即可。 第二步: 更新完,會在<android-sdk>/extras/google/底下長出一個 google_play_services, 如果沒有,請重開Eclipse -> Window -> Android SDK Manager 查看 Package 中的 extra 是否存在 google_play_services。如果存在,即可以安裝。 如果還是不存在,請將<android-sdk>/extras/google底下的資料都刪除,再一次重開Eclipse -> Window -> Android SDK Manager 此時extra就會出現google_play_services了。 PS. 我們可能忘了<android-sdk>的位置。沒關係,Eclipse -> Window -> Preferences -> Android 就會看到了。 第2步之1: 安裝完,在Eclipse 中 import -> Existing Android Code Into Wo

Eclipse 移除 Plugin

圖片
Eclipse 的 Plugin 越來越多後,整體就變慢了,還會出現許多升級過程的問題。怎麼移除Plugin? 從 Help -> About Eclipse 出現如下的視窗 點擊 Installtion Details  出現如下視窗。  選擇要移除的Plugin,再點擊Uninstall 確定有打勾,點擊 Finish。 點擊 Restart Now,從開一次Eclipse,完成。

使用 Dropbox 當 Git 伺服器

DropBox 端 1、建立一個資料匣 2、在資料匣中執行 git init --bare -->產生.git目錄,記錄版本,但不會包含來源檔案的拷貝。 本地端 A 電腦 1、建立一個資料匣 2、在資料匣中執行 git init    --> 產生.git資料匣,專為記錄版本用 3、git remote add XXX YYYYYYYY  --> XXX 為自已取的名字,YYYYYYYY 是dropbox中要用來當伺服的資料匣,如 git remote add example /user/abc/dropbox/example,這個意思是說,我要建立一個遠端的伺服資料匣,名字為example,位置在/user/abc/dropbox/example。 到此,基本工作完成。 試著在本地端的資料匣內,建立一個文字檔。建立完成可以先commit 如下 git add abc.txt -->告訴git開始追縱abc.txt這個檔 git commit -m "create abc.txt" -->建立一個節點 git push example master -> example 是一開始我們取的代號,master 代表當下的分支。這意思是說,把本地的master支線推到example去。 這樣就把伺服端更新了。 現在,在B電腦這一端,也想要有相同的檔案且想要直接從example拉下來B電腦。做法 1、先在B電腦建立一個資料匣 2、在資料匣中執行 git init    --> 產生.git資料匣,專為記錄版本用 3、git pull example master  --> example 是一開始我們取的代號,master 代表當下的分支。 注意 如果在A電腦上我修改了文件,由本來的節點 x1 commit 成 x2,丟到dropbox上。然後到B電腦端,B電腦端如果還在節點x1,將文件pull下來,B電腦就會變成在節點x2了。但如果,B電腦端在x1節點下,曾經修改過文件(尚未commit新節點),此時,pull就會失敗。 解決的方法, 1.再開一個新資料匣來pull。 2.就是放棄所有在B電腦上的修改,回復到原始的x1。指令如下 git r

In App Billing 學習 I

圖片
要學習Google的In App Billing可以從他的範例來學,也可以直接套用,即方便又不容易出錯。要學習之前我們先做一下基本的準備。在Android developer中,提供了一個車子買油的小範例 TrivialDrive 。 TrivialDrive 這個範例就在 android的sdk 下的 /extras/google/play_billing/sample 。我們方便些,把sample下的src的裡的java都複製到我們的project的src下吧。有如下幾個檔名: IabHelper.java IabResult.java IabException.java Inventory.java Purchase.java Security.java SkuDetails.java Base64.java Base64DecoderException.java 第一步: 先在 AndroidManifest.xml 加入 <uses-permission android:name = "com.android.vending.BILLING" /> 第二步 :   在src底下創建一個新的package, 名為 com.android.vending.billing,再把 IInAppBillingService.aidl(也是在 android的sdk 下的 /extras/google/play_billing/ 可找到) 複製到 src目錄下的package-> com.android.vending.billing底下 。 第三步: 建立商品。 進入自已的market->應用程式內產品  點擊新增產品 產品ID只能有小寫(a-z)、數字(0-9)、底線(_)和小數點(.)。 不管是不是納入管理產品,其實google都有管理,所以就選納入管理吧。訂閱是指一個固定周期的付費,像是雜誌每個月的付費之類。 第四步: 找出public key。進入自已的market 複製public key後,就存放在程式裡吧。如下在 onCreate 中 @Override public void onCreate(Bundle s

Scoreloop 使用法 android I

圖片
  1.先下載新版的 scoreloop ,但要先註冊。 註冊成功後,登入後在網頁上選擇            1.download SDK 然後找 Title: Core Social SDK (Android) 點擊下載。會下載一個Scoreloop_core_social_android_3.1.tar.gz 在網頁上選擇            2.Create Game & Integrate SDK 可以看到下圖,填上APP的名字,選Android  點擊Add Game後,會出現下圖,圖中的Game Secret 就是程式要用的 秘 密 碼 。 點擊Submit Game 之後,會要求填寫APP的描述,上傳APP Image之類,就不多做說明。 2.  解壓縮後可以在 Scoreloop_core_social_android_3.1 看到一個 ScoreloopUI的目錄,這個就是我們要的了。(最簡易的使用法,從 ScoreloopUI 下手。內已包含 Scoreloop所提供的UI介面。) 3.開啟eclipse 將ScoreloopUI import 進來,這時 eclipse 會出現一個 ScoreloopUI 的project,如下圖。 接下來Add Library,至 property -> Android->Add  選ScoreloopUI  如下圖就完成了。 4.建一個新的Class,讓我們取名為 DummyApplication吧!把下面的碼直接貼上。記得Game Secret要貼上第一步中的 秘密碼 。 import com.scoreloop.client.android.core.model.Client; import com.scoreloop.client.android.ui.ScoreloopManagerSingleton; import android.content.Context; public class DummyApplication extends android.app.Application {         private static Client clie

字串處理 String

一些常用的字串的處理 如果有一個字串為 ss String ss = " 天地玄黃宇宙洪荒 日月盈昃 辰宿列張 "; //試試看是否包含字串 "宇宙" Boolean ans = ss.contains( "宇宙");  //如果有包含會反回true, 如果沒有包含會反回false. int ans = ss.indexOf("宇宙") ; //如果有包含會反回"宇宙"在ss中的位置,所以ans=4,如果沒有包含ans=-1。 //試試看字中是否為"宇宙"開頭 Boolean ans = ss.startsWith( "宇宙" );// 如果是"宇宙",反回true,如果不是反回false。 //試試看字中是否為"宇宙"結尾 Boolean ans = ss.endsWith( "宇宙" ); // 如果是"宇宙"結尾,反回true,如果不是反回false。 //試試看以宇宙來分段字串 String[] ans=ss.split(" 宇宙 ");  //反回兩個字串 ans[0]= " 天地玄黃 "  ans[1] = " 洪荒 日月盈昃 辰宿列張 "   //使用正則表示式 ans = ss.matches(".* 宇宙 .*"); //.*表示任何字元,也就是"宇宙"前後包任何字元都反回true。 ans = ss.matches(" 宇宙 .*");  //等同於宇宙開頭的字串,所以反回false。 ---------------------------------------------------------------------- 說明一下正則表示 (regular expression) ,是一種尋找字串的代碼系統。學會它,在處理字串時會可怕的方便。 例如英文中 cat locate monkey apple. 我們如果想找cat這個字,以人的大腦來說很容易就找到