2015年6月8日 星期一

Android SlidingDrawer 滑動 視窗

上下左右的滑動視窗
1.res/layout/activity_main.xml


    

        
        

        
        

        
        

        
        

        
        

        
        

        
        

        
        

        
        

        
        

        
    

    

        

        
        
    


2.MainActivity.java
package tw.android;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
import android.widget.Toast;

@SuppressWarnings("deprecation")
public class MainActivity extends Activity {

 private EditText etT, etB, etL, etR, etRotation;
 private Button btConfirm;
 private SlidingDrawer sd;
 private int left, top, right, bottom;

 /** Called when the activity is first created. */
 @SuppressLint("ShowToast")
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  etT = (EditText) findViewById(R.id.etT);
  etB = (EditText) findViewById(R.id.etB);
  etL = (EditText) findViewById(R.id.etL);
  etR = (EditText) findViewById(R.id.etR);
  etRotation = (EditText) findViewById(R.id.etRotation);
  btConfirm = (Button) findViewById(R.id.btConfirm);
  sd = (SlidingDrawer) findViewById(R.id.sd);

  /* 確認輸入 */
  btConfirm.setOnClickListener(new Button.OnClickListener() {

   public void onClick(View v) {
    /* 輸入SlidingDrawer距離上方位置 */

    left = Integer.parseInt(etL.getText().toString()); // 左
    top = Integer.parseInt(etT.getText().toString()); // 上
    right = Integer.parseInt(etR.getText().toString()); // 右
    bottom = Integer.parseInt(etB.getText().toString()); // 下

    if (left > 1000 || top > 1000 || right > 1000 || bottom > 1000) {
     Toast.makeText(getApplicationContext(), "不可大於1000",
       Toast.LENGTH_SHORT).show();

    } else {
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.WRAP_CONTENT,
       RelativeLayout.LayoutParams.WRAP_CONTENT);

     lp.setMargins(left, top, right, bottom);
     sd.setLayoutParams(lp);
     /* 輸入SlidingDrawer旋轉角度 */
     sd.setRotation(Integer.parseInt(etRotation.getText()
       .toString()));

     Toast.makeText(getApplicationContext(), "輸入完成",
       Toast.LENGTH_SHORT).show();
    }

   }
  });

  /* 打開監聽動作 */
  sd.setOnDrawerOpenListener(new OnDrawerOpenListener() {
   public void onDrawerOpened() {

    Toast.makeText(getApplicationContext(), "我被拉開了",
      Toast.LENGTH_SHORT).show();
    ;
   }
  });

  /* 關閉監聽動作 */
  sd.setOnDrawerCloseListener(new OnDrawerCloseListener() {

   public void onDrawerClosed() {
    Toast.makeText(getApplicationContext(), "我被關閉了",
      Toast.LENGTH_SHORT).show();
   }
  });

 }
}



參考來源:
http://examples.javacodegeeks.com/android/core/widget/slidingdrawer/android-slidingdrawer-example/
http://stackoverflow.com/questions/3695856/android-slidingdrawer-from-top

2015年6月4日 星期四

Android Studio Import libs 專案 匯入 套件 UI 美化

Android Studio專案套件匯入與eclipse匯入方式不同
1.首先建立一個空白專案,建立完成後打開在app下的build.gradle檔案

2.以https://github.com/rey5137/material UI 為例,在build.gradle檔案加入
compile 'com.android.support:appcompat-v7:21.0.3' 
compile 'com.github.rey5137:material:1.1.1'
compile 'com.android.support:cardview-v7:21.0.3'





3.基本上在這裡點選Build -> Clear Project 就會下載匯入在你的專案裡


4.在專案點右鍵 -> Open Module Settings中的Dependencies裡可以看到匯入的lib



5.下載https://github.com/rey5137/material/archive/master.zip 拿裡面的demo檔來測試
位置在下載的資料夾material-master\app\src\main,在這裡先測試button原件
將material-master\app\src\main\res除了layout資料夾其他資料夾複製到你的專案底下 res的位置


6.在專案res/下建立layout資料夾,建立activity_main.xml,複製material-master\app\src\main\res\layout\fragment_button.xml裡的程式碼


    

        

        

            

            

            

        

        

            

            

            

        

        

        

            

            

            

        

        

            

            

            

        

        

        

            

            

            

        

        

            

            

            

        

    



    
7.建立MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;

import com.rey.material.drawable.RippleDrawable;
import com.rey.material.widget.Button;
import com.rey.material.widget.FloatingActionButton;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt_flat = (Button) findViewById(R.id.button_bt_flat);
        Button bt_flat_color = (Button) findViewById(R.id.button_bt_flat_color);
        Button bt_flat_wave = (Button) findViewById(R.id.button_bt_flat_wave);
        Button bt_flat_wave_color = (Button) findViewById(R.id.button_bt_flat_wave_color);
        Button bt_raise = (Button) findViewById(R.id.button_bt_raise);
        Button bt_raise_color = (Button) findViewById(R.id.button_bt_raise_color);
        Button bt_raise_wave = (Button) findViewById(R.id.button_bt_raise_wave);
        Button bt_raise_wave_color = (Button) findViewById(R.id.button_bt_raise_wave_color);
        FloatingActionButton bt_float = (FloatingActionButton) findViewById(R.id.button_bt_float);
        FloatingActionButton bt_float_color = (FloatingActionButton) findViewById(R.id.button_bt_float_color);
        FloatingActionButton bt_float_wave = (FloatingActionButton) findViewById(R.id.button_bt_float_wave);
        FloatingActionButton bt_float_wave_color = (FloatingActionButton) findViewById(R.id.button_bt_float_wave_color);

        /*左邊正常速度*/
        View.OnClickListener listener = new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (v instanceof FloatingActionButton) {
                    FloatingActionButton bt = (FloatingActionButton) v;
                    bt.setLineMorphingState((bt.getLineMorphingState() + 1) % 2, true);
                }

                System.out.println(v + " " + ((RippleDrawable) v.getBackground()).getDelayClickType());
            }
        };
        /*右邊DELAY速度*/
        View.OnClickListener listener_delay = new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (v instanceof FloatingActionButton) {
                    FloatingActionButton bt = (FloatingActionButton) v;
                    bt.setLineMorphingState((bt.getLineMorphingState() + 1) % 2, true);
                }

                System.out.println(v + " " + ((RippleDrawable) v.getBackground()).getDelayClickType());
            }
        };

        /*監聽事件*/
        bt_flat.setOnClickListener(listener);
        bt_flat_wave.setOnClickListener(listener);
        bt_raise.setOnClickListener(listener);
        bt_raise_wave.setOnClickListener(listener);
        bt_float.setOnClickListener(listener);
        bt_float_wave.setOnClickListener(listener);

        bt_flat_color.setOnClickListener(listener_delay);
        bt_flat_wave_color.setOnClickListener(listener_delay);
        bt_raise_color.setOnClickListener(listener_delay);
        bt_raise_wave_color.setOnClickListener(listener_delay);
        bt_float_color.setOnClickListener(listener_delay);
        bt_float_wave_color.setOnClickListener(listener_delay);

    }

}
8.最後修改一下AndroidManifest.xml


    
    

        
            
                

                
            
        
    




其餘的UI就依樣畫葫蘆

檔案下載: https://github.com/terryyamg/ASLibTest
參考連結:https://github.com/rey5137/material

2015年6月3日 星期三

Android Expandablelistview 展開列表

基本功能Expandablelistview,展開列項目的子項目列表,附加圖示
1./res/layout/activity_main 主畫面


    
    


2./res/layout/list_group.xml 標題layout


    
    

    
    


3./res/layout/list_item.xml 內容layout


    

        
        
    


4.ExpandableListAdapter.java
package tw.android;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

 private Context context;
 private int[] listIv; // 標題圖示
 private List<String> listDataHeader; // 標題
 private HashMap<String, List<String>> listDataChild; // 內容

 /**
  * @param listIv
  *            -標題圖示
  * @param listDataHeader
  *            -標題
  * @param listChildData
  *            -內容
  */
 public ExpandableListAdapter(Context context, int[] listIv,
   List<String> listDataHeader,
   HashMap<String, List<String>> listChildData) {
  this.context = context;
  this.listIv = listIv;
  this.listDataHeader = listDataHeader;
  this.listDataChild = listChildData;
 }

 /* -------------------- 內容 -------------------- */
 public Object getChild(int groupPosition, int childPosititon) {
  return this.listDataChild.get(this.listDataHeader.get(groupPosition))
    .get(childPosititon);
 }

 public int getChildrenCount(int groupPosition) {
  return this.listDataChild.get(this.listDataHeader.get(groupPosition))
    .size();
 }

 public long getChildId(int groupPosition, int childPosition) {
  return childPosition;
 }

 /* 內容View */
 public View getChildView(int groupPosition, final int childPosition,
   boolean isLastChild, View convertView, ViewGroup parent) {

  final String childText = (String) getChild(groupPosition, childPosition); // 取得內容

  /* 設置內容layout */
  if (convertView == null) {
   LayoutInflater infalInflater = (LayoutInflater) this.context
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   convertView = infalInflater.inflate(R.layout.list_item, null);
  }

  /* 設置內容 */
  TextView txtListChild = (TextView) convertView
    .findViewById(R.id.lblListItem);

  txtListChild.setText(childText);
  return convertView;
 }

 /* -------------------- 標題 -------------------- */
 public Object getGroup(int groupPosition) {
  return this.listDataHeader.get(groupPosition);
 }

 public int getGroupCount() {
  return this.listDataHeader.size();
 }

 public long getGroupId(int groupPosition) {
  return groupPosition;
 }

 /* -------------------- 標題圖示 -------------------- */
 public Object getGroupView(int groupPosition) {
  return Integer.toString(this.listIv[groupPosition]);
 }

 public int getGroupViewCount() {
  return this.listIv.length;
 }

 public long getGroupViewId(int groupPosition) {
  return groupPosition;
 }

 /* 標題View */
 public View getGroupView(int groupPosition, boolean isExpanded,
   View convertView, ViewGroup parent) {
  String headerIv = (String) getGroupView(groupPosition); // 取得圖示
  String headerTitle = (String) getGroup(groupPosition); // 取得標題
  /* 設置標題layout */
  if (convertView == null) {
   LayoutInflater infalInflater = (LayoutInflater) this.context
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   convertView = infalInflater.inflate(R.layout.list_group, null);
  }

  /* 設置圖示 */
  ImageView iv = (ImageView) convertView.findViewById(R.id.iv);
  iv.setImageResource(Integer.parseInt(headerIv));
  /* 設置標題 */
  TextView lblListHeader = (TextView) convertView
    .findViewById(R.id.lblListHeader);
  lblListHeader.setTypeface(null, Typeface.BOLD);
  lblListHeader.setText(headerTitle);

  return convertView;
 }

 /* ------------------------------------------------ */
 public boolean hasStableIds() {
  return false;
 }

 public boolean isChildSelectable(int groupPosition, int childPosition) {
  return true;
 }
}

5.MainActivity.java
package tw.android;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;

public class MainActivity extends Activity {

 ExpandableListAdapter listAdapter;
 ExpandableListView expListView;
 int[] listIv; //圖示
 List<String> listDataHeader; //標題
 HashMap<String, List<String>> listDataChild; //內容

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

  // 取得ExpandableListView
  expListView = (ExpandableListView) findViewById(R.id.lvExp);

  // 列表資料
  prepareListData();

  /* listIv-圖示, listDataHeader-標題, listDataChild-內容*/
  listAdapter = new ExpandableListAdapter(this,listIv, listDataHeader,
    listDataChild);

  // 將列表資料加入至展開列表單
  expListView.setAdapter(listAdapter);

  // 點選標題 展開 監聽事件
  expListView.setOnGroupExpandListener(new OnGroupExpandListener() {

   public void onGroupExpand(int groupPosition) {
    Toast.makeText(getApplicationContext(),
      "您正在收看:" + listDataHeader.get(groupPosition),
      Toast.LENGTH_SHORT).show();
   }
  });

  // 點選標題監聽事件
  expListView.setOnChildClickListener(new OnChildClickListener() {

   public boolean onChildClick(ExpandableListView parent, View v,
     int groupPosition, int childPosition, long id) {
    Toast.makeText(
      getApplicationContext(),
      "開始閱讀:"
        + listDataHeader.get(groupPosition)
        + " : "
        + listDataChild.get(
          listDataHeader.get(groupPosition)).get(
          childPosition), Toast.LENGTH_SHORT)
      .show();
    return false;
   }
  });

  // 點選標題 收回 監聽事件
  expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {

   public void onGroupCollapse(int groupPosition) {
    Toast.makeText(getApplicationContext(),
      "放回書架:" + listDataHeader.get(groupPosition),
      Toast.LENGTH_SHORT).show();

   }
  });

 }

 /* 列表資料 */
 private void prepareListData() {
  listIv = new int[]{R.drawable.p1,R.drawable.p2,R.drawable.p3}; //圖示
  listDataHeader = new ArrayList<String>(); // 標題
  listDataChild = new HashMap<String, List<String>>(); // 內容

  listDataHeader.add("水滸傳");
  listDataHeader.add("紅樓夢");
  listDataHeader.add("三國演義");

  // Adding child data
  List<String> first = new ArrayList<String>();
  first.add("第一回  張天師祈禳瘟疫 洪太尉誤走妖魔");
  first.add("第二回  王教頭私走延安府 九紋龍大鬧史家村");
  first.add("第三回  史大郎夜走華陰縣 魯提轄拳打鎮關西");
  first.add("第四回  趙員外重修文殊院 魯智深大鬧五臺山");
  first.add("第五回  小霸王醉入銷金帳 花和尚大鬧桃花村");

  List<String> second = new ArrayList<String>();
  second.add("第一回  甄士隱夢幻識通靈 賈雨村風塵懷閨秀");
  second.add("第二回  賈夫人仙逝揚州城 冷子興演說榮國府");
  second.add("第三回   託內兄如海薦西賓 接外孫賈母惜孤女");
  second.add("第四回  薄命女偏逢薄命郎 葫蘆僧判斷葫蘆案");
  second.add("第五回  賈寶玉神遊太虛境 警幻仙曲演紅樓夢");

  List<String> end = new ArrayList<String>();
  end.add("第一回  宴桃園豪傑三結義,斬黃巾英雄首立功");
  end.add("第二回  張翼德怒鞭督郵,何國舅謀誅宦豎");
  end.add("第三回  議溫明董卓叱丁原,餽金珠李肅說呂布");
  end.add("第四回  廢漢帝陳留為皇,謀董賊孟德獻刀");
  end.add("第五回  發矯詔諸鎮應曹公,破關兵三英戰呂布");

  listDataChild.put(listDataHeader.get(0), first); // 標題, 內容
  listDataChild.put(listDataHeader.get(1), second);
  listDataChild.put(listDataHeader.get(2), end);
 }
}
檔案下載: https://github.com/terryyamg/ExpandablelistviewTest
參考連結: http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/

2015年5月24日 星期日

Android Notification LED Light Control LED燈 閃爍 控制

通知LED燈控制,測試有些手機可用,有些不可用,需在非充電下執行
1./res/layout/activity_main.xml


    

        

        
    



2.MainActivity.java
package tw.android;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

 private NotificationManager notificationManager;
 private Notification notification;
 private boolean indeterminate = true; // true-開啟, false-關閉
 private int msInterval = 850; // 閃爍間隔時間(毫秒)

 private Button btStart, btStop;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  notification = new Notification();
  
  /* 啟用通知的led燈 */
  notification.flags = Notification.FLAG_SHOW_LIGHTS;
  /*notification閃亮間隔時間 */
  notification.ledOnMS=100; 
  notification.ledOffMS=100;

  btStart = (Button) findViewById(R.id.btStart);
  btStop = (Button) findViewById(R.id.btStop);

  /* 開始 */
  btStart.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {
    indeterminate = true;// 設為開啟
    new TwoColorBlink().execute(); // 執行LED燈閃爍

    btStart.setEnabled(false); // 開始按鈕-不可按
    btStop.setEnabled(true); // 關閉按鈕-可按

   }
  });

  /* 停止 */
  btStop.setOnClickListener(new OnClickListener() {

   public void onClick(View v) {

    indeterminate = false;// 設為關閉
    notificationManager.cancel(0); // 關閉notificationManager

    btStart.setEnabled(true); // 開始按鈕-可按
    btStop.setEnabled(false); // 關閉按鈕-不可按
   }
  });

 }

 @Override
 protected void onPause() {
  indeterminate = false; // 設為關閉
  notificationManager.cancel(0); // 關閉notificationManager
  super.onPause();
 }

 private class TwoColorBlink extends AsyncTask<Void, Void, Void> {

  private int counter = 0; // 初始化次數

  @Override
  protected void onPreExecute() {

  }

  @Override
  protected Void doInBackground(Void... arg0) {
   try {

    synchronized (this) { //同一時間只有一個Thread執行
     
     notification.ledARGB = 0xFFFF0000;// 設定LED燈開始顏色

     while (indeterminate) { //重複閃爍

      notificationManager.notify(0, notification);//開啟notificationManager

      this.wait(msInterval); //閃爍間隔時間

      notificationManager.cancel(0); //關閉notificationManager

      if (counter++ % 2 == 0) {
       notification.ledARGB = 0xFF00FF00; //切換綠色
      } else {
       notification.ledARGB = 0xFF0000FF; //切換藍色
      }
      
     }

    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   return null;
  }

  @Override
  protected void onPostExecute(Void result) {
   

  }

 }

}

檔按下載:https://github.com/terryyamg/LedTest
參考來源:http://www.41post.com/4706/programming/android-creating-a-two-color-led-notification

2015年5月12日 星期二

Android Output Write File 輸出 寫入 文件

有時候字串太長,LogCat不好顯示,輸出文件是個好方法。
1.AndroidManifest.xml加入權限

2./res/layout/activity_main.xml


    
    

    


3.Write.java
package tw.android;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

public class Write {
 private static Context context;

 public Write(Context context) {
  this.context = context;
 }
 
 public static void WriteFileExample(String message) {
  FileOutputStream fop = null;
  File file;
  String content = message;

  try {
   File sdcard = Environment.getExternalStorageDirectory();
   file = new File(sdcard, context.getResources().getString(R.string.app_name)+"Log.txt"); //輸出檔案位置
   Log.i("Write File:", file + "");
   fop = new FileOutputStream(file);
   
   if (!file.exists()) { // 如果檔案不存在,建立檔案
    file.createNewFile();
   }

   byte[] contentInBytes = content.getBytes();// 取的字串內容bytes

   fop.write(contentInBytes); //輸出
   fop.flush();
   fop.close();

   Toast.makeText(context, "輸出完成", Toast.LENGTH_LONG).show();
   
  } catch (IOException e) {
   Log.i("Write E:", e + "");
   e.printStackTrace();
  } finally {
   try {
    if (fop != null) {
     fop.close();
    }
   } catch (IOException e) {
    Log.i("Write IOException", e + "");
    e.printStackTrace();
   }
  }
 }
}
4.MainActivity.java
package tw.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
 private EditText etWrite;
 private Button btWrite;
 private Write write = new Write(MainActivity.this);

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  etWrite = (EditText) findViewById(R.id.etWrite);
  btWrite = (Button) findViewById(R.id.btWrite);

  btWrite.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {

    write.WriteFileExample(etWrite.getText().toString()); // 寫入輸入文字
   }
  });

 }
}


檔案下載:
https://github.com/terryyamg/WriteFileTest
參考連結:
http://www.mkyong.com/java/how-to-write-to-file-in-java-fileoutputstream-example/

Android Get Phone WIFI IP 取得 網路 IP

取得手機或WIFI的IP位址
1.AndroidManifest.xml加入權限
    
    
    
2./res/layout/activity_main.xml


    

        
        

        
        
    

    

        
        

        
        
    

    

        
        

        
        
    

    

        
        

        
        
    


3.Utils.java
package tw.android;

import java.io.*;
import java.net.*;
import java.util.*;   
import org.apache.http.conn.util.InetAddressUtils;

public class Utils {

    /**
     * Convert byte array to hex string
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sbuf = new StringBuilder();
        for(int idx=0; idx < bytes.length; idx++) {
            int intVal = bytes[idx] & 0xff;
            if (intVal < 0x10) sbuf.append("0");
            sbuf.append(Integer.toHexString(intVal).toUpperCase());
        }
        return sbuf.toString();
    }

    /**
     * Get utf8 byte array.
     * @param str
     * @return  array of NULL if error was found
     */
    public static byte[] getUTF8Bytes(String str) {
        try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; }
    }

    /**
     * Load UTF8withBOM or any ansi text file.
     * @param filename
     * @return  
     * @throws java.io.IOException
     */
    public static String loadFileAsString(String filename) throws java.io.IOException {
        final int BUFLEN=1024;
        BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN);
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN);
            byte[] bytes = new byte[BUFLEN];
            boolean isUTF8=false;
            int read,count=0;           
            while((read=is.read(bytes)) != -1) {
                if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) {
                    isUTF8=true;
                    baos.write(bytes, 3, read-3); // drop UTF8 bom marker
                } else {
                    baos.write(bytes, 0, read);
                }
                count+=read;
            }
            return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray());
        } finally {
            try{ is.close(); } catch(Exception ex){} 
        }
    }

    /**
     * Returns MAC address of the given interface name.
     * @param interfaceName eth0, wlan0 or NULL=use first interface 
     * @return  mac address or empty string
     */
    public static String getMACAddress(String interfaceName) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                if (interfaceName != null) {
                    if (!intf.getName().equalsIgnoreCase(interfaceName)) continue;
                }
                byte[] mac = intf.getHardwareAddress();
                if (mac==null) return "";
                StringBuilder buf = new StringBuilder();
                for (int idx=0; idx<mac.length; idx++)
                    buf.append(String.format("%02X:", mac[idx]));       
                if (buf.length()>0) buf.deleteCharAt(buf.length()-1);
                return buf.toString();
            }
        } catch (Exception ex) { } // for now eat exceptions
        return "";
        /*try {
            // this is so Linux hack
            return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim();
        } catch (IOException ex) {
            return null;
        }*/
    }

    /**
     * Get IP address from first non-localhost interface
     * @param ipv4  true=return ipv4, false=return ipv6
     * @return  address or empty string
     */
    public static String getIPAddress(boolean useIPv4) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
                for (InetAddress addr : addrs) {
                    if (!addr.isLoopbackAddress()) {
                        String sAddr = addr.getHostAddress().toUpperCase();
                        boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
                        if (useIPv4) {
                            if (isIPv4) 
                                return sAddr;
                        } else {
                            if (!isIPv4) {
                                int delim = sAddr.indexOf('%'); // drop ip6 port suffix
                                return delim<0 ? sAddr : sAddr.substring(0, delim);
                            }
                        }
                    }
                }
            }
        } catch (Exception ex) { } // for now eat exceptions
        return "";
    }

}

4.MainActivity.java
package tw.android;

import android.app.Activity;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.text.format.Formatter;
import android.widget.TextView;

public class MainActivity extends Activity {
 private TextView tvMac, tvWifi, tvIPV4, tvIPV6;

 /** Called when the activity is first created. */

 @SuppressWarnings("deprecation")
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  tvMac = (TextView) findViewById(R.id.tvMac);
  tvWifi = (TextView) findViewById(R.id.tvWifi);
  tvIPV4 = (TextView) findViewById(R.id.tvIPV4);
  tvIPV6 = (TextView) findViewById(R.id.tvIPV6);

  /* wifi ip位址 */
  WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
  String adWifi = Formatter.formatIpAddress(wm.getConnectionInfo()
    .getIpAddress());
  
  /* 手機網路ip位址 */
  String adMac = Utils.getMACAddress("wlan0");
  String ipv4 = Utils.getIPAddress(true); // IPv4
  String ipv6 = Utils.getIPAddress(true); // IPv6

  tvMac.setText(adMac);
  tvWifi.setText(adWifi);
  tvIPV4.setText(ipv4);
  tvIPV6.setText(ipv6);

 }
}

參考來源:
http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device

2015年5月11日 星期一

Android Internet Time 取得 網路 時間

Candy Crush APP就是抓取手機的時間,所以修改手機時間能獲得能量,有些APP則不能,因為抓取的為網路時間
1.AndroidManifest.xml加入網路權限
    
    
2.下載commons-net-3.1.jar
在專案建立libs資料夾,放至libs資料夾裡面

3./res/layout/activity_main.xml


    

        
        

        
        
    

    

        
        

        
        
    

    

    


4.MainActivity.java
package tw.android;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.net.time.TimeTCPClient;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
 private TextView tvPhoneTime, tvInternetTime;
 private Button btUpdateTime, btChangeTime;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads().detectDiskWrites().detectNetwork()
    .penaltyLog().build());
  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
    .build());

  tvPhoneTime = (TextView) findViewById(R.id.tvPhoneTime);
  tvInternetTime = (TextView) findViewById(R.id.tvInternetTime);
  btUpdateTime = (Button) findViewById(R.id.btUpdateTime);
  btChangeTime = (Button) findViewById(R.id.btChangeTime);

  /* 更新時間 */
  btUpdateTime.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    updateTime();
   }
  });

  /* 前往修改手機時間 */
  btChangeTime.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
    startActivity(intent);
   }
  });
 }

 @SuppressLint("SimpleDateFormat")
 private void updateTime() {
  /* 手機時間 */
  SimpleDateFormat sTime = new SimpleDateFormat("HH:mm:ss");
  String time = sTime.format(new java.util.Date()); // 現在時間
  tvPhoneTime.setText(time);

  /* 網路時間 */
  try {
   TimeTCPClient client = new TimeTCPClient();
   try {
    client.setDefaultTimeout(60000); // 設定最長等待時間為60秒
    /* 可以前往 http://tf.nist.gov/tf-cgi/servers.cgi 選擇可用的連結點 */
    client.connect("time-nw.nist.gov"); // 取得網路時間
    String iT = sTime.format(client.getDate());// 格式處理

    tvInternetTime.setText(iT);
   } finally {
    client.disconnect(); // 關掉連結
   }
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

}

檔案下載:
 https://github.com/terryyamg/InternetTimeTest
參考連結:
http://stackoverflow.com/questions/13064750/how-to-get-current-time-from-internet-in-android
http://tf.nist.gov/tf-cgi/servers.cgi
http://grepcode.com/snapshot/repo1.maven.org/maven2/commons-net/commons-net/3.1