2013年6月27日 星期四

[Android] Intent用法

● 呼叫電話(call a dial screen)
這裡要注意的是,"tel:"是必要的,不然會有錯誤
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("tel:1234567890"));
        startActivity(intent);


● 直接撥打電話(make a phone call)
如果不想要顯示撥號畫面,想直接撥打電話,則需要使用ACTION_CALL
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:0123456789"));
        startActivity(intent);
因為有使用到ACTION_CALL,所以要在manifest加入權限
<uses-permission android:name="android.permission.CALL_PHONE" />


● 呼叫瀏覽器(Browser)
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.acer.com"));
        startActivity(intent);

加入搜尋字串
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_WEB_SEARCH);
        // 設定搜尋的字串
        intent.putExtra(SearchManager.QUERY, "acer");
        startActivity(intent);


● 呼叫相機(Camera)
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 1);
取得拍攝後的照片
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != RESULT_OK) {
            // 無法得到正確結果時會跑到這裡
            return;
        }

        if (requestCode == 1) {
            // 這個bitmap是拍攝之照片的資料
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            // 在LAYOUT拉一個ImageView,來顯示照片
            ImageView imageView = (ImageView) findViewById(R.id.image);
            imageView.setImageBitmap(bitmap);

        }
}


● 呼叫錄音機(Recorder)
        Intent intent = new Intent();
        intent.setAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
        startActivity(intent);


● 呼叫Market應用程式(call market application)
       Intent intent = new Intent(Intent.ACTION_VIEW);
       intent.setData(Uri.parse("market://details?id=comq.android.autoRedial"));
       startActivity(intent);


● 顯示聯絡人清單
    Intent intent  = new Intent(Intent.ACTION_VIEW, People.CONTENT_URI);  
    startActivity(intent );  
顯示第3筆聯絡人的詳細資料
Uri uriContact = ContentUris.withAppendedId(People.CONTENT_URI, 3); //3 是聯絡人ID  
Intent intent   = new Intent(Intent.ACTION_VIEW, uriContact );  
startActivity(intent   );


● 顯示地圖
Uri uri = Uri.parse("geo:25.718058,-100.279487");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
//其他geo的用法 
//geo:latitude,longitude <--上面例子是這個
//geo:latitude,longitude?z=zoom    
//geo:0,0?q=business+near+city  
//google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom 
//geo:0,0?q=my+street+address 
路徑規劃
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 
Intent intent  = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent ); 


延伸閱讀: 傳送郵件(Send mail)

2013年6月24日 星期一

[Android] 傳送郵件(Send mail)

● 傳送郵件(Send mail)
      Intent intent = new Intent();
      intent.setAction(Intent.ACTION_SENDTO);
      intent.setData(Uri.parse("mailto:chenkanzo@gmail.com"));
      intent.putExtra(Intent.EXTRA_SUBJECT, "這裡是主旨。");
      intent.putExtra(Intent.EXTRA_TEXT, "這是本文內容。");
      startActivity(intent);

● 傳送附件(Send mail with enclosed file)
和傳送郵件不同的利用Intent.ACTION_SEND,
而附件檔案必須利用Uri型別指定。
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        String[] to = {"hoge@example.com"};
        intent.putExtra(Intent.EXTRA_EMAIL, to);
        intent.putExtra(Intent.EXTRA_SUBJECT, "這是主旨。");
        intent.putExtra(Intent.EXTRA_TEXT, "這是本文內容。");
        
        // 選擇一張圖片來加入附件
        // 取得的SD卡資料夾
        File sdcard = Environment.getExternalStorageDirectory();
        File file = new File(sdcard, "test.jpg");
        intent.putExtra(Intent.EXTRA_STREAM,
                        Uri.parse("file://"+ file.getAbsolutePath()));
        intent.setType("image/jpeg");
        //呼叫應用程式列表
        startActivity(Intent.createChooser(intent,"請選擇郵件應用程式,例如GMAIL"));

延伸閱讀 Intent大全

[Android] 判斷網路連線的狀況(ConnectivityManager)

● 要判斷網路連線狀態很簡單,
1.利用ConnectivityManager類別。
2.接著利用getSystemService方法,並指定引數CONNECTIVITY_SERVICE即可。
 ConnectivityManager cm;
 cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);   

● 呼叫getACtiveNetworkInfo方法來取得目前的網路資訊,
回傳值null則表示離線狀態。
NetworkInfo NetInfo = cm.getActiveNetworkInfo();

        if (NetInfo == null) {
            Toast.makeText(getApplicationContext(), "離線狀態", Toast.LENGTH_SHORT).show();
        } else {
            if (NetInfo.isConnected()) {
                Toast.makeText(getApplicationContext(), "連線", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "離線", Toast.LENGTH_SHORT).show();
            }
        }

● 使用ConnectivityManager,別忘了要加權限到manifest裡
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2013年6月17日 星期一

[Android] 避免螢幕自動關閉(FLAG_KEEP_SCREEN_ON)

當我們一段時間沒有觸碰螢幕時,畫面就會自動關閉。
這對一些應用程式,例如影片播放、相機來說,畫面自動關掉就一整個糗了。

要讓螢幕不要自動關閉的方法,只要利用Window class裡的addFlag方法,
並指定FLAG_KEEP_SCREEN_ON,就可以達到目的了。
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }


如果要回復的話,則可利用clearFlag這個方法,清掉之前設定即可。
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

2013年6月14日 星期五

[Android] WebView

●WebView一般是用來顯示URL,但也可以用來顯示本地端的HTML資料。
首先我們先制定一個test.html,並放到assets\資料夾下。

assets/test.html
<!DOCTYPE HTML>
<html>
<body>

<p>WebView</p>
<b>This is a test page</b> 
<p>Thanks</p>

</body>
</html>

資料夾存放路徑


●主程式中,我們會利用下列的路徑格式讀取assets裡的html
file:///android_asset/檔名
下面程式會在程式啟動後,使用WebView顯示assets目錄下的test.html
MainActivity.java
import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  WebView webView = (WebView)findViewById(R.id.webView1);
  webView.loadUrl("file:///android_asset/test.html");
 }
}
這裡補充一點,假如您需要多國的版本,如test_eng.html或test_tw.html
則可以先在strings.xml裡做相對應的字串
<string name="url_to_load">file:///android_asset/test_eng.html</string>
然後在程式裡利用webView.loadUrl(getString(R.string.url_to_load));讀出來。

●在layout裡加入一個webView就完成啦
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

●最後在AndroidManifest.xml加入INTERNET存取的權限
   <uses-permission android:name="android.permission.INTERNET" />

●結果

2013年6月13日 星期四

[Android] Eclipse亂碼解決方法

剛get了一個source code,載入eclipse發現中文都變成亂碼,
google一下solution,在這裡記錄下來,順便分享。

其實很簡單只需將Text file encoding從MS950(繁體中文 MS Windows 作業系統的編碼),
改成UTF-8

設定路徑,從上方選單進入Window->Preferences ->General->Workspace->UTF-8
有圖有真相 


2013年6月12日 星期三

[Android] NumberPicker

 NumberPicker如左圖所示,
 先設定一個範圍,
 然後讓使用者來挑選一個數值。
 
 








這個實作方法很簡單,先設定最大最小的範圍,還有一開始的預設值
        numPicker.setMaxValue(50);  
        numPicker.setMinValue(0);    
        numPicker.setValue(10);
接著利用setOnValueChangedListener來監看使用者選擇的值
int oldValue表示調整前的值
int newValue表示調整後的值
numPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener (){
             public void onValueChange(NumberPicker view, int oldValue, int newValue) {
               
                 tv.setText("pick number is " + String.valueOf(newValue));
               
             }
        });

完整source code如下
MainActivity.java
import android.os.Bundle;
import android.app.Activity;
import android.widget.NumberPicker;
import android.widget.TextView;

public class MainActivity extends Activity {

    public NumberPicker numPicker;
    public TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv=(TextView)findViewById(R.id.textView1);
       
        numPicker=(NumberPicker) findViewById(R.id.numberPicker1);
        numPicker.setMaxValue(50);  
        numPicker.setMinValue(0);    
        numPicker.setValue(10); 

        //取得使用者選擇的值
        numPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener (){
             public void onValueChange(NumberPicker view, int oldValue, int newValue) {
                 
                 tv.setText("pick number is " + String.valueOf(newValue));
               
             }
        });
       
    }

}

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="35dp"
        android:text="pick number is 10"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp" />

</RelativeLayout>
結果
android 4.1跑出來NumberPicker是長這樣

[Android] 寫檔/將資料存入Preference裡

假如我們有資料在應用程式結束後還要繼續保留,就要存放在手機裡。
一般來說,要將資料存放在手機裡,有幾個方法,如輸出到檔案,資料庫(SQL),或是Preference。

我們今天來看如何將值存放至Preference:
儲存:
       // 取得Preference
        SharedPreferences sp;
        sp = getPreferences(MODE_PRIVATE);

        // 取得用來編輯的Editor
        Editor editor = sp.edit();

        // 利用put方法設定Key and value
        editor.putBoolean("key_boolean", true);
        editor.putString("key_string", "aaa");
        editor.putFloat("key_float", 0.01F);
        editor.putInt("key_int", 8888);
        editor.putLong("key_long", 1234L);

        // 儲存
        editor.commit();

取得儲存的值:
        // 取得Preference
        SharedPreferences sp;
        sp = getPreferences(MODE_PRIVATE);

        // 根據不同的型別,使用不同的get方法
        // 第二個參數是用來,當讀取的KEY值不在時,指定要回傳的預值即寫在這裡
        boolean m_boolean = sp.getBoolean("key_boolean", false);
        String m_string = sp.getString("key_string", "");
        float m_float = sp.getFloat("key_float", 0);
        int m_int = sp.getInt("key_int", 0);
        long m_long = sp.getLong("key_long", 0);

補充:
getPreferences方法的第二個參數,可以設定資料存取的權限
常數
描述
MODE_PRIVATE
私有的,其它應用程式無法使用
MODE_WORLD_READABLE
其它應用程式可以讀取
MODE_WORLD_WRITABLE
其它應用程式可以寫入


下面是一個完整例子
http://pianovv510.blogspot.tw/2013/04/andriod-sharedpreferences.html