2010年4月26日 星期一

Android學習筆記 - 震動(Vibrator)

1. 若要在應用程式內使用到震動這個服務,需先在AndroidManifest.xml允許存取android.permission.VIBRATE這個權限。


2. MainActivity.java
package org.me.android_vibrate;
import android.app.Activity;
import android.app.Service;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        Spinner spinner = (Spinner) findViewById(R.id.spinnner);
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,new String[]{"長震動","短震動","連續短震動"});
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
            public void onItemSelected(AdapterView adapterView, View view, int position, long id){
                //取得震動服務
                Vibrator myVibrator = (Vibrator) getApplication().getSystemService(Service.VIBRATOR_SERVICE);
                switch(position) {
                    case 0:
                        //震動3秒
                        myVibrator.vibrate(3000);
                        break;
                    case 1:
                        //震動0.1秒
                        myVibrator.vibrate(100);
                        break;
                    case 2:
                        //停0.01秒之後震動0.1秒(重覆三次)
                        myVibrator.vibrate(new long[]{10, 100, 10, 100, 10, 100}, -1);
                        break;
                    default:
                        break;
                }
            }
            public void onNothingSelected(AdapterView arg0) {
                Toast.makeText(MainActivity.this, "您沒有選擇任何項目", Toast.LENGTH_LONG).show();
            }
        });
    }
}



3. main.xml(Layout)
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">" 
    <Spinner
        android:id="@+id/spinnner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Spinner>
</LinearLayout>


4. AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.me.android_vibrate">
    <application>
         <activity android:name=".MainActivity" android:label="Vibrate">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.VIBRATE" />
</manifest>



5. 執行之後的畫面。


Android學習筆記 - 背景執行服務(Service)

1. 大部分使用者在手機上看到的畫面都是前端的程式(Activity),但是還是要有很多的服務需在背景執行。
如果是要在背景執行的程式,則需要寫成Service並繼承android.app.Service,由於是在背景執行所以是
要寫成Service而不是Activity,因此需在AndroidManifest新增一個Service。以下範例是按下Start Service之後會
在背景每隔一秒Log目前的時間,按下Stop Service後會停止Log的動作。



2. MainActivity.java
package org.me.android_service;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private Button startButton;
    private Button stopButton;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        startButton = (Button) findViewById(R.id.startButton);
        stopButton = (Button) findViewById(R.id.stopButton);
        startButton.setOnClickListener(startClickListener);
        stopButton.setOnClickListener(stopClickListener);
    }

    private Button.OnClickListener startClickListener = new Button.OnClickListener() {
        public void onClick(View arg0) {
            //啟動服務
            Intent intent = new Intent(MainActivity.this, NickyService.class);
            startService(intent);
        }
    };

    private Button.OnClickListener stopClickListener = new Button.OnClickListener() {
        public void onClick(View arg0) {
            //停止服務
            Intent intent = new Intent(MainActivity.this, NickyService.class);
            stopService(intent);
        }
    };
}


3. NickyService.java
package org.me.android_service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import java.util.Date;

//繼承android.app.Service
public class NickyService extends Service {
    private Handler handler = new Handler();

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        handler.postDelayed(showTime, 1000);
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        handler.removeCallbacks(showTime);
        super.onDestroy();
    }
    
    private Runnable showTime = new Runnable() {
        public void run() {
            //log目前時間
            Log.i("time:", new Date().toString());
            handler.postDelayed(this, 1000);
        }
    };
}


4. main.xml(Layout)
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Service"
android:layout_x="40px"
android:layout_y="67px"
>
</Button>
<Button
android:id="@+id/stopButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Service"
android:layout_x="140px"
android:layout_y="67px"
>
</Button>
</AbsoluteLayout>


5. AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.me.android_spinner">
    <application>
         <activity android:name=".MainActivity" android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <service android:name=".NickyService"/>
    </application>
</manifest>



6. 執行之後的畫面。


2010年4月23日 星期五

Android 必裝軟體-應用程式分類(Apps Organizer)

你是不是常常因為安裝太多軟體,而導致常常找不到你要的軟體…
介紹一個軟體分類的工作Apps Organizer…
它可以將所有已安裝的軟體依照你的喜好進行分類…


  • QR Code


  • 安裝後的畫面


  • 直接點選要歸類的應用程式,並選擇要歸類的標籤


  • 也可以透過點選標籤Tab再按下Menu鍵並選擇New Label新增標籤


  • 再透過新增捷徑將你要標籤新增到桌面


  • 之後只要點選此標籤,就能秀出所有該標籤的應用程式

Apps Organizer


Android 必裝軟體-批次解除安裝軟體(AppManager)

如果你覺得一個一個解除已安裝的軟體太浪費時間…
可以試試AppManager,它可以讓你一次選擇所有要解除安裝的軟體…

  • QR Code


  • 安裝完後的畫面


  • 執行之後直接點選所有要解除安裝的軟體


  • 點選Menu並選擇Batch uninstall,進行批次解除安裝


Android 必裝軟體-安裝記憶卡上的apk檔(appInstaller)

如果你從網路上下載了一個apk檔…
或是你自己寫了一隻程式想要安裝在自己的手機上…
如果你有以上的需求,可以透過appInstaller直接安裝apk檔…

  • QR Code


  • 安裝完之後的畫面


  • 開啟後會自動搜尋記憶卡所有的apk檔


  • 直接點選欲安裝的程式進行安裝


Android必裝軟體-快速開關3G/2G網路(APNdroid)

APNdroid能夠讓你在不需使用網路的時候快速關閉網路,以延長電池待機時間。

  • QR Code



  • 安裝完後的畫面



  • 可以透過在桌面新增小工具來達到一鍵開關網路


2010年4月15日 星期四

Android學習筆記 - 計時器(Timer)

1. 由於若不是Main Thread則無法去變更畫面的Widget內容,需透過android.os.Handler來達到此效果。

2. MainActivity.java
package org.me.android_timer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {
    private Long startTime;
    private Handler handler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //取得目前時間
        startTime = System.currentTimeMillis();
        //設定定時要執行的方法
        handler.removeCallbacks(updateTimer);
        //設定Delay的時間
        handler.postDelayed(updateTimer, 1000);
    }

    //固定要執行的方法
    private Runnable updateTimer = new Runnable() {
        public void run() {
            final TextView time = (TextView) findViewById(R.id.timer);
            Long spentTime = System.currentTimeMillis() - startTime;
            //計算目前已過分鐘數
            Long minius = (spentTime/1000)/60;
            //計算目前已過秒數
            Long seconds = (spentTime/1000) % 60;
            time.setText(minius+":"+seconds);
            handler.postDelayed(this, 1000);
        }
    };
}


3. main.xml(Layout)
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <TextView
        android:id="@+id/timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0:0"
        android:textSize="70sp"
        android:layout_x="90px"
        android:layout_y="160px"
        >
    </TextView>
</AbsoluteLayout>


4. 執行之後的畫面。


2010年4月14日 星期三

Android學習筆記 - 儲存偏好設定(Preference)

1. 此範例是利用SharedPreferences來儲存使用者在某個程式內的偏好設定。

2. MainActivity.java
package org.me.android_preference;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
    private EditText nameEditText;
    private Button saveButton;
    private Button restoreButton;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        nameEditText = (EditText) findViewById(R.id.nameEditText);
        saveButton = (Button) findViewById(R.id.saveButton);
        restoreButton = (Button) findViewById(R.id.restoreButton);
        saveButton.setOnClickListener(saveClickListener);
        restoreButton.setOnClickListener(restoreClickListener);
    }

    //按下Save按鈕
    private Button.OnClickListener saveClickListener = new Button.OnClickListener() {

        public void onClick(View arg0) {
            //取得SharedPreference設定("Preference"為設定檔的名稱)
            SharedPreferences settings = getSharedPreferences("Preference", 0);
            //置入name屬性的字串
            settings.edit().putString("name", nameEditText.getText().toString()).commit();
        }
    };

    //按下Restore按鈕
    private Button.OnClickListener restoreClickListener = new Button.OnClickListener() {

        public void onClick(View arg0) {
            //取得SharedPreference設定("Preference"為設定檔的名稱)
            SharedPreferences settings = getSharedPreferences("Preference", 0);
            //取出name屬性的字串
            String name = settings.getString("name", "");
            nameEditText.setText(name);
        }
    };
}


3. main.xml(Layout)
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TextView
android:id="@+id/nameView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name:"
android:layout_x="22px"
android:layout_y="34px"
>
</TextView>
<EditText
android:id="@+id/nameEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="90px"
android:layout_y="20px"
>
</EditText>
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save"
android:layout_x="20px"
android:layout_y="86px"
>
</Button>
<Button
android:id="@+id/restoreButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Restore"
android:layout_x="98px"
android:layout_y="84px"
>
</Button>
</AbsoluteLayout>


4. 執行之後的畫面。(按下Store將Name的值儲存在偏好設定,按下Restore會將儲存在偏好設定的值取回)


2010年4月10日 星期六

Web Service SSL雙向驗證

1. 在Service端需先設定走SSL雙向驗證,可參考Tomcat上設定 SSL雙向驗證

2. 在Client端有二個部分必需設定
   a. 第一部分要先讓Client端能信任Service端的憑證,所以需將Service端憑證的CA匯入到你的trustStore(也就是Java key store)。
       之後再將系統的trustStroe位址指到你的trustStore位置。
       如:System.setProperty("javax.net.ssl.trustStore", "C:\\trustStroe.jks");
            System.setProperty("javax.net.ssl.trustStorePassword", "admin123");

   b. 第二部分是要指定存放Client端憑證的keystore位置,好讓Service能夠做身份確認。
       如:System.setProperty("javax.net.ssl.keyStore", "C:\\keyStore.jks");
            System.setProperty("javax.net.ssl.keyStorePassword", "admin123");