2010年5月27日 星期四

建立Facebook應用程式 Java API (8) - 取得「張貼訊息到塗鴨牆」的權限

1. 如果你想要張貼訊息到使用者的塗鴨牆,則需要先取得使用者的同意才能夠張貼。

    2. 要取得這個權限也不難,只要將網頁導到權限同意頁面而使用者按下同意的按鈕即可。

      3. 至於怎麼取得「權限同意頁面」的網址,做法如下:
        //API_KEY為App的KEY
        //FB_APP_ADDRESS即是使用者按下同意後要導到的網址
        String url = Permission.authorizationUrl(API_KEY, Permission.PUBLISH_STREAM) + "&next=" + FB_APP_ADDRESS;
        //利用Javascript導到權限同意頁面
        response.getWriter().println("<script type='text/javascript'>
        parent.location.href='" + url + "'
        </script>");
        


        2010年5月18日 星期二

        Android Market線上搜尋(AndroSeek)

        • AndroSeek是利用關鍵字查詢,即時的從Android Market上搜尋你所要的App。


        • 在搜尋結果頁面上會呈現每個App的名稱、圖示、下載量、評比、費用…等資訊。


        • 再點進行其中一個App,則可以看到此App的縮圖、描述以及QR Code。


        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檔


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