Friday, May 29, 2015

Screen Density 簡介

screen density, 是Android為了支援多屏螢幕所提出的提出的概念, 簡單來說, 描述的就是一定區域(螢幕)範圍內, 有多少個相素(pixel), 單位則是dip (dots per inch).

screen density 劃分為幾種等級, low(ldip), medium(mdip), high(hdip), extra-high(xhdip), extra-extra-high(xxhdip), extra-extra-extra-high(xxxhdip), 

其中並以medium為基礎, 對應的倍數描述如下

low (0.75) , medium(1.0), high(1.5), extra-high(2.0), extra-extra-high(3.0) , extra-extra-extra-high(4.0)

以medium為例, 每單位面積有1個pixel, 而low 則是每單位面積僅有0.75個pixel
可以了解到, 當screen density愈高, 也就是解析度愈高的意思

參考資料

Monday, May 4, 2015

WebView簡介(二) - loadUrl , loadData, loadDataWithBaseUrl

之前已經介紹過loadUrl的使用方式, 接下來繼續介紹WebView提供的其他載入內容的方法
  • loadData
    • Input : 
      • data, string , 將以WebView載入的內容
      • mineType, string, 內容資料格式, 若設定為null則以預設值"text/html"表示
      • encoding, string, 內容編碼方式,
    • 使用方式
      WebView webView = new WebView(getBaseContext());
      webView.loadData("<html><body><h1> Hello World!!</h1> </body></html>","text/html","UTF-8");
    • 範例結果
  • loadDataWithBaseUrl
    • Input : 
      • baseUrl ,string , 所設定的基礎位置, 可設定為各種schema, 包含file, http, https, ftp, etc..,若設定為null時則以預設值'about:blank'表示
      • data, string , 將以WebView載入的內容
      • mineType, string , 內容資料格式, 若設定為null則以預設值"text/html"表示
      • encoding, string , 內容編碼方式
      • historyUrl, string, 用以表示WebView的history, 若設定為null,則以'about:blank'表示
    • 使用方式
      WebView webView = new WebView(getBaseContext());
      webView.loadData("<html><body><img src='mipmap/ic_launcher.png'/></body></html>","text/html","UTF-8");
    • 範例結果
  • 結論
    • loadDataWithBaseUrl當然在使用上屬於較為複雜的方式, 但根據baseUrl不同, 則可以使用asset, res資料夾當中的資源, 相當的好用

※參考資料

Wednesday, April 29, 2015

WebView簡介(一)

簡單來說, WebView是用來顯示網頁頁面的元件

接下來介紹如何使用WebView

首先當然是先建立一個Android的Project, 以Android Studio為例子

並在完成相關設定後,可以看到畫面如下

既然主要用來顯示網頁頁面, 當然要先加入可以連接網路的權限也就是android.permission.INTERNET


開始使用webview的原件

WebView webView = new WebView(getBaseContext());
webView.loadUrl("http://http://developer.android.com/reference/android/webkit/WebView.html");


執行之後就可以看到應用程式上看到網頁資料啦

※參考資料

Monday, October 14, 2013

Gradle簡介(for Android)

Gradle, Gradle 是什麼? 簡單來說, Gradle是種包含ant以及maven概念,並且以groovy的DSL取代傳統XML的來做為設定專案的自動化工具
  • 先針對Android的部分做個簡介
    • 在開始為你的專案導入gradle之前, 必須先準備專案的骨幹(也就是建立一個基本的android 專案), 可以透過命令列指令或者透過你的IDE(如eclipse來完成這項工作),其中命令列的方式如下
      android create project --target 1 --path ./MyGradleAndroidApp --activity MyGradleAndroidActivity --package my.android.gradle.package
    • 接下來在android專案的根目錄下建立build.gradle檔案,用來描述該專案的相關設定
      buildscript {
        repositories {
         mavenCentral()
       }
      dependencies {
        classpath 'org.gradle.api.plugins:gradle-android-plugin:1.2.1'
       }
      }
      apply plugin: 'android'
        repositories {
         mavenCentral()
       }
    • 設定專案的source set
      為了讓android專案不會因為其他工具的需求(如ant),而產生問題,最好自行指定source code的位置
      sourceSets {
       main {
        java {
         srcDir 'src'
        }
       }
      }
  • 設定android sdk位置
    如果第一步驟的android專案,是由eclipse所建立的,那麼,還需要額外進行設定android sdk的動作, 在android專案的根目錄找到local.properties(若找不到,請建立一個新的檔案), 並在其中加入
    sdk.dir=/path/to/android/sdk
    (當然說的是我們安裝android sdk的位置)
    到這邊大概就能說有個初步的概念了

Tuesday, September 3, 2013

Memory Analyzer (MAT)


Tuesday, May 14, 2013

About the AdMobs


  1. 申請加入AdMobs
    打開瀏覽器進入 AdMobs 就可以看到下面的畫面

    畫面上就說明了可以用兩種方法來登入, 新建一個AdMobs的帳號, 或者直接以google的帳號來登入。這次以google帳號進行登入,

    輸入密碼,後跳轉到手機號碼驗證的部分

    完成這些程序後,就可以看到AdMobs的首頁
  2. 新增網站/應用程式
    點選首頁中的"新增網站/應用程式"如下

    接下來可以看到可以新增的種類

    這次選擇"Android應用程式",跟著出現需要填寫的資料表單

    填寫完成後就可以佈署廣告來試試看嚕


參考資料

Tuesday, March 12, 2013

Web Workers@HTML5

通常在執行一般的網頁語言,在完整的敘述被讀取完成,並執行完之前,網頁通常都會處於暫停的情況,且無法繼續被執行, 而web workers 則是自html5之後被發表的新的API允許javascript在不影響前景效能的情況下在背景運行的一種新的功能


如何使用Web Workers


最簡單的使用方法就是宣告一個,


  • var worker = new Worker('worker.js');
然後透過 postMessage的方法來呼叫它
  • worker.postMessage();



※ 參考資料


  1. Web Workers@W3C
  2. THE BASICS OF WEB WORKERS@Html5Rocks
  3. Web Works@W3C School
  4. [HTML5試試看-27] 多工 - WebWorkers

Thursday, January 31, 2013

繼續使用map view (Google Maps Android v2)

開始使用Google Maps for Android v2之前,得先處理好下列兩件事情


  1. 下載google play service lib
    google play service已經整合在android sdk當中,透過Android SDK Manager可以看到相關的套件下載如下圖所描述

    完成下載後,將可以在{ANDROID_SDK_HOME}/extra/google/libproject/ 的目錄底下找到google-play-services_lib的project,以eclipse為例,以"Import Existing Android Code Into workspace",作為lib project來使用
  2. 持有並使用google map v2 api key
    ※由於Google Maps v2與Google Maps v1完全是不相同的系統,因此過去在v1所申請,並使用於MapView的api key並不適用於v2的系統
    申請google map v2 api key之前,需要準備SHA-1簽章,請參照前一篇文章開始使用map view (Google Maps Android v1)的方式來製作。
    準備好SHA-1的簽章後,接下來就是建立API Project,透過網頁瀏覽Google APIs console,並建立專屬服務的API專案(如果不曾建立過API專案的話..)。建立專案之後,瀏覽所提供的API服務當中可以找到Google Maps Android API v2

    將它打開(過程中會出現服務使用條款,如果要繼續使用的話當然要同意....不然呢...還能不同意嗎???)。最後,到左側的選單中,找尋"API Access"的選項,點選進入後,可以看到在各種服務管道中需要使用的api key(包含瀏覽器, android,javascript...etc.)找到"Create new Android key"後輸入方才所取得的SHA-1簽章,而格式為"{SHA-1};{your.packagename}"就會產生專屬於你服務的API Key了
再來在我們的專案中將前述所取得的API KEY以及相關的應用程式權限如下







  1.  加入API KEY@meta-data
  2. 加入所需要的權限
  3. 加上硬體加速的描述 

最後,可以直接引用google play service所提供的MapFragment就大功告成了





















※參考資料

  1. Google Maps Android API v2 @Google Developer
  2. Google Play Service @Android Developer

Thursday, January 24, 2013

Google Analytics for Android

功能說明

  1. 透過google analytics可得知使用應用程式的使用者數目
  2. 使用者的地區資料(全世界國碼分析)
  3. 觀察特定的功能使用率
  4. 用來記錄錯誤(crash/exception)
  5. 記錄應用程式內的交易(in-application purchase / transaction)
  6. 以及其他面相的記錄方式
下載及安裝
※日前(2013/1/22)所提供的版本為2.0beta4
※既然是給android所使用的服務,在使用之前當然要先準備好Android的SDK
  1. 下載完成後,將上述的zip解壓縮,並將內容的libGoogleAnalyticsV2.jar準備於build path最為lib來使用
  2. 建立所要追蹤的特性,並取得Tracking ID
接下來修訂android應用程式當中所細節
  1. 修訂AndroidManifest.xml
    為了確保tracking機制能正常的運作,需要加入下述兩項權限給應用程式
  2. 加入Easy Tracker的方法

    在使用Easy Tracker之前需要設定所需要的context給Tracker如上圖所描述
    接下來就可以繼續使用相關的方法(如下圖所述)
  3. 建立應用程式專屬的analytics.xml檔案
    在res/values的目錄底下建立一個xml檔案命名為analytics.xml如下圖(包含TrackingID、以及是否記錄Activity的啟動、是否記錄相關的exception

    接下來,為lint增加設定,以免產生檢查錯誤
完成上述的步驟,就可以開始觀察使用者-應用程式間的記錄,
還有更多的進階設定如下:
  • Advanced Configuration – Learn more about advanced configuration options, including using multiple trackers.
  • Measuring Campaigns – Learn how to implement campaign measurement to understand which channels and campaigns are driving app installs.
  • Measuring Events – Learn how to measure user engagement with interactive content like buttons, videos, and other media using Events.
  • Measuring In-App Payments – Learn how to measure in-app payments and transactions.
  • User timings – Learn how to measure user timings in your app to measure load times, engagement with media, and more.
Google Analytics 報表介面一覽
※參考資料




















Tuesday, January 22, 2013

WebStorage@HTML5

簡單來說幾個概念是
  1. Web Storage是種可讓本地端的瀏覽器儲存資料的技術
  2. 同cookie一樣, 是以key-pair的方式呈現資料
  3. 不同於cookie僅有4K的限制,web storage的容量可達5M(視瀏覽器廠商實作而定)
  4. web storage的資料並不會夾帶於http-header當中,因此較不會影響頻寬的使用
  5. web storage以兩種方式呈現; localStorage以及sessionStorage,分別表示其生命週期
  6. 不同網域的storage是分開的,無法交換來使用(即同源策略; 也就是說,只有源自相同網站的網頁才能共享同一塊 local storage。

如何使用web storage
由於localStorage以及sessionStorage都是繼承自Storage物件,因此儲存資料的方式可使用setItem的方法如下
  • window.localStorage.setItem("MyKeyName","MyDataValue");
  • localStorage.setItem("MyKeyName","MyDataValue");
  • localStorage["MyKeyName"]="MyDataValue";
  • localStorage.MyKeyName="MyDataValue";
※上述的設定方式皆相同。
相對的,取得所儲存資料的方式當然就是使用getItem
  • var value1 = window.localStorage.getItem("MyKeyName");
  • var value2 = localStorage.getItem("MyKeyName");
  • var value3 = localStorage.MyKeyName;
當然也提供了移除的方法
  • window.localStorage.removeItem("MyKeyName");
  • localStorage.removeItem("MyKeyName");
最後,clear方法則是可移除storage當中所有的物件資料

※參考資料
  1. HTML5 Web Storage@Huan-Lin學習筆記
  2. Web Storage使用經驗@石頭閒語
  3. HTML5 Web Storage@W3C School
  4. Web Storage@W3C
  5. Web Storage@Wiki
  6. Introduction of WebStorage@MSDN
  7. Web Storage Security


Tuesday, July 17, 2012

about daily scrum

daily scrum在scrum like專案中算是非常基本的動作。
主要用來對所有的專案成員簡報過去一天(不然怎麼稱之為daily scrum)所完成的工作、困難等等
更重要的是簡報本日將會完成的工作項目(不然只報告過去的工作進度,大家怎麼會知道專案啥時間能交付)。
執行daily scrum的時間每人以不超過10分鐘為基礎,如果會有這樣的情況,則不應該在daily scrum的會議上提出,應該另外召集專案成員另外進行討論。

參考資料 Back to Basic : Daily Scrum

Thursday, July 5, 2012

Timer-倒數計時

倒數計時, 除了簡單之外...實在想不出其他的形容詞~
直接進入程式碼看看(下文程式參考於CountDownTimer)


public class TimerDemoActivity extends Activity {

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        tv = (TextView)findViewById(R.id.timer);
     
        // CountDownTimer(倒數計時總長,倒數計時間隔)
        new CountDownTimer(30000, 1000) {

            public void onTick(long millisUntilFinished) {
                tv.setText("seconds remaining: " + millisUntilFinished / 1000);
            }

            public void onFinish() {
                tv.setText("done!");
            }
         }.start();
    }
 
    // 用來呈現的TextView
    private TextView tv = null;
}








MediaPlayer隨寫

總之,Android所提供關於媒體的API都可以在android.media這個package找到
直接進入重點
看看如何用這些個API來撰寫可以播放影音的應用程式
先利用VideoView來簡單的達成這次的目的


先進行layout的準備



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


接下來進行程式的撰寫


private VideoView vv = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        vv = (VideoView)findViewById(R.id.videoView1);
     
        vv.setVideoURI(Uri.parse(VIDEO_PATH));
     
        dialog = new ProgressDialog(this);
    }
@Override
protected void onStart() {
super.onStart();
vv.setOnPreparedListener(this);

dialog.show();
vv.start();
}

private ProgressDialog dialog = null;

@Override
public void onPrepared(MediaPlayer mp) {
dialog.dismiss();
}


執行之後就可以看如下的畫面



關於Contacts API

在使用Contacts API之前,首先得設定application的權限
也就是讀取連絡人,就像下面這樣
<uses-permission android:name="android.permission.READ_CONTACTS"/>


接下來讀取ContentProvider當中的連絡人資訊

Cursor cursor = getContentResolver().query(Contacts.CONTENT_URI, null, null, null, null);

最後, 將讀取出的資料放到ListView進行呈現


listView.setAdapter(new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, cursor,
new String[] { ContactsContract.Contacts.DISPLAY_NAME },
new int[] { android.R.id.text1 }));






Wednesday, April 25, 2012

Android 支援套件

針對各式各樣的作業系統版本,Android本身也在2011三月份左右,推出了所謂的支援套件。
Android Support Package
大意是,讓開發者們在支援舊版本的作業系統,(如Android 1.5 :sdk level3)的同時也可以使用其他高階作業系統的功能(如 sdk level4以上)。

非常簡單的使用方式,接下來就一步一步的為大家進行說明。

  1. 下載支援套件
    透過Android SDK Manager,並在下載資料夾中找到Android Support Package,_
  2. 設定支援套件
    其實就是設定build path的ext-lib位置。
這樣就能讓你的同時支援暨有的使用者,同時也使用較新作業系統的功能。
這部分用下面這張圖來說最適當了。



Monday, April 2, 2012

Menus

Menus on Android Devices
  
話說在Android 3.0出現之前,Android手機原則上都可以看到一個按鈕"Menu",算是有別於其他作業系統的設計。

總之,就先玩玩看該如何建立一個Android的Menu按鈕功能。

1. 先在res當中定義 menu/mymenu.xml 檔案如下
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu1"       
        android:title="@string/label_menu1"/>
    <item
        android:id="@+id/menu2"
         android:title="@string/label_menu2"/>
    <item
        android:id="@+id/menu3"
          android:title="@string/label_menu3"/>

</menu>


2. 接著在Activity當中覆寫onCreateOptionsMenu方法如下
        @Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub

MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.mymenu, menu);

return super.onCreateOptionsMenu(menu);
}
3. 執行之後就可以看到結果如附圖~