2016年1月28日 星期四

[Mac] 消除重覆的副檔名

今日請求神人肥佳洛幫忙,賜小弟一道神Command,可以消除重覆的副檔名,

今日得到的圖片中,有些許是副檔名重覆的,例如 xxx.png.png,這個餵給Android,

包你編譯出錯,又懶得手一張一張改檔名。





求得神指令一則


rename 's/\.png\.png$/.png/' *

興奮之餘,開啟Mac OS 的終端機一試,杯具了,Mac OS沒有 rename這個指令

Google 到這一篇 可以透過HomeBrew 來安裝 rename 。


brew install rename








之後就可以正常執行啦







參考來源:

http://superuser.com/questions/152627/renaming-many-files-in-mac-os-x-batch-processing

http://figaro.neo-info.net/

2016年1月27日 星期三

「Mac」ping 廣播位置並取得回應的IP位置

ping 廣播封包並取得回應的IP位置

ping -c 3 192.168.x.255 | grep 'bytes from' | awk '{ print $4 }' | sort | uniq

x 改成subnet的位置,例如.0 或.1 之類的。

[LinkIt Samrt 7688] 初始化設定


前言


小弟買的是7688 Duo 搭配Arduino Breakout for LinkIt Smart7688 Duo 

















所以可以直接對擴充版上的micro USB進行供電(上面寫很清楚的寫了PWR),




如果要直接對7688供電,請注意只能對有缺角那一邊的USB供電7688才可以WORK



初始化


打開Wi-Fi選單會看到LinkIT_Smart_7688_XXXXXX,連上它。










連上之後你會看到7688上的WI-FI 橘色燈閃爍

























打開Chrome輸入http://192.168.100.1/,會出現要求你設定一個密碼後按下SUBMIT










































之後會再出一次輸入密碼畫面,輸入剛才改的新密碼後按下Sign IN






































首先是一些基本資訊



































切到NetWork這邊,會看到目前是AP mode,也就是這塊版只能由

切換SSID來連入,而無法與InterNet連線。































SSH連線


接下來透過SSH來連入7688,開啟終端機或是putty ,輸入 ssh root@192.168.100.1  ,

密碼剛是上述所設定的。






















看到這個畫面代表你己經成功了。




參考資料:

http://blog.cavedu.com/%E7%89%A9%E8%81%AF%E7%B6%B2/linkit/linkit-smart-7688-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A%E8%88%87ssh%E7%99%BB%E5%85%A5/

[LinkIt Samrt 7688] 切換成Station mode



切換成STA Mode



也可以把它切換成Station Mode 就可以連上家裡的Router上Intenet
輸入密碼

 之後你就看不到它的SSID了。












找到7688的IP


方法1 . 連進家裡的Router找一下被配到那一個IP,看起來只有一個Unknown最有可能了。












方法2.  ping 廣播封包位置 ,例如你的網段為 192.168.0.x

則 ping 192.168.0.255 ,但這個方法可能會被Router禁用,

最後就會變成只有本機回應你。

方法3. 透過nmap  這種軟體來找尋區網內的裝置。


真的找不到的話,按著7688 DUO 上面的Wi-Fi按鈕(3顆鈕中間那顆)五秒鐘,

就會回復成AP MODE了。


2016年1月24日 星期日

[名詞定義] 藍芽 Master , Slave

藍芽協定中主要有兩個角色,MasterSlave。兩個角色的分界並沒有一定的規則, 一個藍芽裝置可以同時扮演兩者,或是在兩者之間切換。

發出要求的一端是Master,而接收端是Slave。


參考資料:

http://www.shs.edu.tw/works/essay/2007/10/2007103014160859.pdf

[Arduino] HC-05進入AT Mode

AT Mode 簡單來講就是讓我們進入可以設定藍芽模組的指令模式,

例如把預設的HC-05改成自己喜歡的名字,修改鮑率等等。

因為我沒有USB -> TTL 轉換的套件,我採取另一種方式,透過Arduino來達成。

        Usb to TTL                                    Tx/Rx
PC ------------------------ -> Arduino -------------> HC-05
          9600                                           38400




接角對應如下:

HC-05 GND --- Arduino GND Pin
HC-05 VCC (5V) --- Arduino 5V
HC-05 TX --- Arduino Pin 10 (soft RX)
HC-05 RX --- Arduino Pin11 (soft TX)
HC-05 Key (PIN 34) --- Arduino Pin 9

接好線後,先將VCC拔掉,等待把下列程式燒進Arduino後再插上。
(接線時先將Arduino斷電)


#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);  // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}

void loop()
{

  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}

上傳程式後,把VCC接上,此時HC-05上的紅燈會以每2秒鐘閃爍一次,代表己進入

AT Mode,接下來打開arduino IDE 右上的序列埠監控視窗。




會先看到顯示如下















此時便可以打AT按Enter進行測試是否會回應OK,有就代表成功了。















指令的內詳可以找到本篇參考資料的最後一篇網址有詳細的介紹,

在這裡我先示範一個AT+NAME 指令,輸入AT+NAME後按下Enter。







會出現以結果(每個預設名字都不一樣)







接下來要改名字,輸入AT+NAME=自己喜歡的英文名字 ,按Enter。





我們再打一次AT+NAME來查詢,就改變成功了。







參考資料:

http://www.techbitar.com/modify-the-hc-05-bluetooth-module-defaults-using-at-commands.html

http://jackedu.blogspot.tw/2015/01/hc-05.html

http://swf.com.tw/?p=712

HT-03/HT-05 Command

http://www.linotux.ch/arduino/HC-0305_serial_module_AT_commamd_set_201104_revised.pdf

2016年1月23日 星期六

[Android] 模擬一個播放前載入的動畫

先來看效果




主要有3個元件組成:

進度環

撥放icon

半透明罩



layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.boywhychen.drawabletest.MainActivity"
    tools:showIn="@layout/activity_main">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerInParent="true"
        android:max="500"
        android:progress="0"
        android:progressDrawable="@drawable/mybackground" />
    <ImageView
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerInParent="true"
        android:background="@drawable/play_background"
        android:src="@android:drawable/ic_media_play"
        />
    <View
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerInParent="true"
        android:background="@drawable/play_marsk"
        android:id="@+id/marsk"
        />

</RelativeLayout>

mybackground.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:innerRadiusRatio="2.3"
    android:shape="ring"
    android:useLevel="true"
    android:thickness="3.8sp">
    <solid android:color="@android:color/holo_green_dark" />
</shape>

play_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="#666666"/>

    <size
        android:width="120dp"
        android:height="120dp"/>
</shape>


play_marsk.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="#44000000"/>

    <size
        android:width="150dp"
        android:height="150dp"/>
</shape>


code
final View marsk=(View)findViewById(R.id.marsk);

        ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
        ObjectAnimator animation = ObjectAnimator.ofInt (progressBar, "progress", 0, 500);
        // 設定進度條要由0~跑到500 ( 500 ProgressBar 的Max,設大一點跑起來會比較順,設100, 會感覺有點卡卡的)
        animation.setDuration (5000); //in milliseconds
        animation.setInterpolator(new DecelerateInterpolator());
        animation.start();
        animation.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                marsk.setVisibility(INVISIBLE);
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });


參考來源:
http://stackoverflow.com/questions/27213381/how-to-create-circular-progressbar-in-android

[Android] Animation.setInterpolator

Interpolator 描述動畫的速率:

Android內建的幾個Interpolator:
AccelerateInterpolator:動畫開始時較慢,然候慢慢加速。
DecelerateInterpolator:動畫開始時較快,然候慢慢滅速。
AccelerateDecelerateInterpolator:動畫開始與結束時較慢,中間過程加速。
LinearInterpolator:動畫等速進行。
CycleInterpolator:可以是一個動畫反覆播放,,或是動畫左右、垂直或是其他斜線方向運動(擺動)DecelerateInterpolator代码:主要實現getInterpolation ,也可以自定義。

參考資料

[名詞定義]APNS

APNS 全名為 Apple Push Notification Service,也就是大家常說的 Push Notification 或者是 Server Push 技術,簡單說就是主動由 Server 發送訊息到 Client 的方法,而通常這樣的技術都會實作穿越防火牆的能力。

參考資料:

http://blog.toright.com/posts/2806/ios-apns-%E8%A8%8A%E6%81%AF%E6%8E%A8%E6%92%A5-apple-push-notification-service-%E4%BB%8B%E7%B4%B9.html

「Android」用XML 來畫虛線外框

首先我們在drawable中建立一個background.xml


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <!-- 填滿的頻色 -->
    <solid android:color="#ffffff"/>
    <!-- 描邊 -->
    <stroke
        android:width="2dp"
        android:color="#000000"
        android:dashGap="10dp"
        android:dashWidth="10dp"
        />
    <!-- 圓角 -->
    <corners
        android:radius="2dp" />
</shape>

畫虛線主要有二個地方


















參考來源:

自己亂玩時發現的




[名詞定義]BlueTooth AT Mode V.S Transparent Mode

BlueTooth (藍芽)有二種模式

  • 自動連線(automatic connection),又稱為透通模式( transparent communication):
    時使用的「自動連線」模式只是把RxD腳傳入的資料,轉成藍牙無線訊號傳遞出去;或者將接收到的無線資料,從TxD腳傳給Arduino,模組本身不會解讀資料,也不接受控制。
  • 命令回應(order-response),又稱為AT模式(AT mode)
    控藍牙模組的指令統稱AT命令(AT-command)。AT命令並非透過藍牙無線傳輸,而是模組的TxD和RxD接腳。藍牙模組只有在AT模式,才能接收AT命令。


資料來源:

2016年1月17日 星期日

[Mac]錄制ios螢幕畫面

要錄制ios螢幕的操作影片,發現有一個新的方法。

只要利用Mac 內的Quick time 就可以達成。

首先把你的傳輸線接上iPhone / iPad ,然候開啟Quick time,

接著按下右鍵---》新增影片錄製



















接著點擊畫面中紅色圈圈處















勾選iPhone/iPad即可顯示iPad畫面






















按下錄影即可開始錄制iPad畫面

[Android]Google Account 取得基本資料

透過選取手機內紀錄的Google帳號,再向GOOGLE取得Token,

接著取得其他基本資料。

程式分成2個畫面:

MainActivity.java是用來做選取帳號以及取得Token。






































HomeActivity.java是用來顯示取得的基本資料。






































以及取得資料所用的AsyncTask 

GetUsernameTask.java


首先確認把google Play Service加入到專案build.gradle(Module: app )


dependencies {
    compile 'com.google.android.gms:play-services-auth:8.4.0'
}

接下來是Layout

activity_main.xml 


<?xml version="1.0" encoding="utf-8"?>
<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"
    android:layout_margin="7dp" >

    <TextView
        android:id="@+id/textViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="Home Page"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textViewNameLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textViewTitle"
        android:layout_marginTop="15dp"
        android:text="Name:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewNameValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textViewTitle"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/textViewNameLabel"
        android:text="Name:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewEmailLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/textViewNameLabel"
        android:layout_marginTop="15dp"
        android:text="Email:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewEmailValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textViewNameValue"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/textViewEmailLabel"
        android:text="Email:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewGenderLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/textViewEmailLabel"
        android:layout_marginTop="15dp"
        android:text="Gender:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewGenderValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textViewGenderLabel"
        android:layout_alignLeft="@+id/textViewNameValue"
        android:text="Gender:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewBirthdayLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/textViewGenderLabel"
        android:layout_marginTop="15dp"
        android:text="Birthday:"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/textViewBirthdayValue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textViewBirthdayLabel"
        android:layout_alignBottom="@+id/textViewBirthdayLabel"
        android:layout_toRightOf="@+id/textViewBirthdayLabel"
        android:text="Birthday:"
        android:textSize="18sp" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/textViewTitle"/>

</RelativeLayout>

context_main.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.boywhychen.googleaccountsignin.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Please wait..."
        android:textSize="25sp" />

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

activity_home.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.boywhychen.googleaccountsignin.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Please wait..."
        android:textSize="25sp" />

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

程式碼:

MainActivity.java
package com.example.boywhychen.googleaccountsignin;

import android.accounts.AccountManager;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.AccountPicker;
import com.google.android.gms.common.GooglePlayServicesUtil;


public class MainActivity extends AppCompatActivity {

    Context mContext = MainActivity.this;
    AccountManager mAccountManager;
    String token;
    int serverCode;
    String SCOPE = "oauth2:https://www.googleapis.com/auth/userinfo.profile";
    static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
    static final int REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1001;
    static final int REQUEST_CODE_RECOVER_FROM_AUTH_ERROR = 1002;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        pickUserAccount();
    }

    String mEmail; // Received from newChooseAccountIntent(); passed to getToken()

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
            // Receiving a result from the AccountPicker
            if (resultCode == RESULT_OK) {
                mEmail = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                getUsername();
                // With the account name acquired, go get the auth token

            } else if (resultCode == RESULT_CANCELED) {
                // The account picker dialog closed without selecting an account.
                // Notify users that they must pick an account to proceed.
                Toast.makeText(this, R.string.pick_account, Toast.LENGTH_SHORT).show();
            } else if ((requestCode == REQUEST_CODE_RECOVER_FROM_AUTH_ERROR ||
                    requestCode == REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR)
                    && resultCode == RESULT_OK) {
                // Receiving a result that follows a GoogleAuthException, try auth again
                getUsername();
            }
        }

    }

    private void pickUserAccount() {
        String[] accountTypes = new String[]{"com.google"};
        Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                accountTypes, false, null, null, null, null);
        startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
    }

    /**
     * Attempts to retrieve the username.
     * If the account is not yet known, invoke the picker. Once the account is known,
     * start an instance of the AsyncTask to get the auth token and do work with it.
     */
    private void getUsername() {
        if (mEmail == null) {
            pickUserAccount();
        } else {
            if (checkInternetConnection()) {
                new GetUsernameTask(MainActivity.this, mEmail, SCOPE).execute();
            } else {
                Toast.makeText(this, R.string.not_online, Toast.LENGTH_LONG).show();
            }
        }
    }

    /**
     * This method is a hook for background threads and async tasks that need to
     * provide the user a response UI when an exception occurs.
     */
    public void handleException(final Exception e) {
        // Because this call comes from the AsyncTask, we must ensure that the following
        // code instead executes on the UI thread.
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (e instanceof GooglePlayServicesAvailabilityException) {
                    // The Google Play services APK is old, disabled, or not present.
                    // Show a dialog created by Google Play services that allows
                    // the user to update the APK
                    int statusCode = ((GooglePlayServicesAvailabilityException) e)
                            .getConnectionStatusCode();
                    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(statusCode,
                            MainActivity.this,
                            REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR);
                    dialog.show();
                } else if (e instanceof UserRecoverableAuthException) {
                    // Unable to authenticate, such as when the user has not yet granted
                    // the app access to the account, but the user can fix this.
                    // Forward the user to an activity in Google Play services.
                    Intent intent = ((UserRecoverableAuthException) e).getIntent();
                    startActivityForResult(intent,
                            REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR);
                }
            }
        });
    }

    //check internet connetion
    public boolean checkInternetConnection() {
        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.isConnected()) {
            return ni.isConnected();
        } else {
            return false;
        }
    }

}

HomeActivity.java



package com.example.boywhychen.googleaccountsignin;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @author manish
 *
 */
public class HomeActivity extends Activity {
    ImageView imageProfile;
    TextView textViewName, textViewEmail, textViewGender, textViewBirthday;
    String textName, textEmail, textGender, textBirthday, userImageUrl;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        imageProfile = (ImageView) findViewById(R.id.imageView1);
        textViewName = (TextView) findViewById(R.id.textViewNameValue);
        textViewEmail = (TextView) findViewById(R.id.textViewEmailValue);
        textViewGender = (TextView) findViewById(R.id.textViewGenderValue);
        textViewBirthday = (TextView) findViewById(R.id.textViewBirthdayValue);

        /**
         * get user email using intent
         */

        Intent intent = getIntent();
        textEmail = intent.getStringExtra("email_id");
        System.out.println(textEmail);
        textViewEmail.setText(textEmail);

        /**
         * get user data from google account
         */

        try {
            System.out.println("On Home Page***"
                    + GetUsernameTask.GOOGLE_USER_DATA);
            JSONObject profileData = new JSONObject(
                    GetUsernameTask.GOOGLE_USER_DATA);

            if (profileData.has("picture")) {
                userImageUrl = profileData.getString("picture");
                new GetImageFromUrl().execute(userImageUrl);
            }
            if (profileData.has("name")) {
                textName = profileData.getString("name");
                textViewName.setText(textName);
            }
            if (profileData.has("gender")) {
                textGender = profileData.getString("gender");
                textViewGender.setText(textGender);
            }
            if (profileData.has("birthday")) {
                textBirthday = profileData.getString("birthday");
                textViewBirthday.setText(textBirthday);
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public class GetImageFromUrl extends AsyncTask<String, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(String... urls) {
            Bitmap map = null;
            for (String url : urls) {
                map = downloadImage(url);
            }
            return map;
        }

        // Sets the Bitmap returned by doInBackground
        @Override
        protected void onPostExecute(Bitmap result) {
            imageProfile.setImageBitmap(result);
        }

        // Creates Bitmap from InputStream and returns it
        private Bitmap downloadImage(String url) {
            Bitmap bitmap = null;
            InputStream stream = null;
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inSampleSize = 1;

            try {
                stream = getHttpConnection(url);
                bitmap = BitmapFactory.decodeStream(stream, null, bmOptions);
                stream.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return bitmap;
        }

        // Makes HttpURLConnection and returns InputStream
        private InputStream getHttpConnection(String urlString)
                throws IOException {
            InputStream stream = null;
            URL url = new URL(urlString);
            URLConnection connection = url.openConnection();

            try {
                HttpURLConnection httpConnection = (HttpURLConnection) connection;
                httpConnection.setRequestMethod("GET");
                httpConnection.connect();

                if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    stream = httpConnection.getInputStream();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return stream;
        }
    }
}

參考資料:



http://www.androidhub4you.com/2013/09/google-account-integration-in-android.html