總網頁瀏覽量

關於我自己

我的相片
人生的必修課是接受無常,人生的選修課是放下執著。
顯示具有 Contact 標籤的文章。 顯示所有文章
顯示具有 Contact 標籤的文章。 顯示所有文章

2012年1月29日 星期日

自動搜尋 AutoCompleteTextView ~ 搭配Contacts


 User在欄位中key入 中/英 文字會從資料中搜尋相似的名單, 但
 1. 必須從第一個字開始比對, 有第一個字相同的才算數
 2. 至少要key入兩個 中/英 文字, AutoCompleteTextView才會列出搜尋結果

 本範例用Contacts(聯絡人)作為資料來源, 必須要在AndroidManifest.xml中加入讀取的權限, 否則會crash喔!



 








Auto_ContactActivity.java

package com.tsots.AutoCompleteTextView_Contact;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.TextView;

public class Auto_ContactActivity extends Activity 
{
 List contact_id= new ArrayList();
 List contact_name= new ArrayList();
 AutoCompleteTextView autoCompleteTextView;
 EditText edittext;
 TextView textview1;
 TextView textview2;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        autoCompleteTextView = (AutoCompleteTextView) findViewById (R.id.AutoCompleteTextView1);
        /*
         *  在layout中並沒有真的加入EditText元件, 而是與autoCompleteTextView共用
         *  目的是用EditText.getText().toString()取得user選到的值
         *  當然, 在onItemClick()內寫arg0.getItemAtPosition(arg2).toString()也有一樣的效果 
         */
        edittext = (EditText) findViewById (R.id.AutoCompleteTextView1);
        textview1 = (TextView) findViewById (R.id.TextView1);
        textview2 = (TextView) findViewById (R.id.TextView2);
  /*
   * 獲得所有的聯絡人資料
   * public final Cursor query (
   *         Uri uri, 
   *         String[] projection, 
   *         String selection, 
   *         String[] selectionArgs, 
   *         String sortOrder
   *         )
   */
  final Cursor cur_name = getContentResolver().query(
               ContactsContract.Contacts.CONTENT_URI,
               null,
               null,
               null,
               ContactsContract.Contacts.DISPLAY_NAME
                );

        try
        {
         if (cur_name.moveToFirst()) 
         {                 
          int idColumn = cur_name.getColumnIndex(ContactsContract.Contacts._ID);
          int nameColumn = cur_name.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);

          do
          {                                  
           try
           {
            //逐一將Contacts的ID和NAME蒐集起來
            contact_id.add(String.valueOf(cur_name.getString(idColumn)));
                  contact_name.add(String.valueOf(cur_name.getString(nameColumn)));
              }
                 catch(Exception e)
                 {
                   
                 }
             }while(cur_name.moveToNext());          
         }
         cur_name.close();
         
         System.out.println("contact_id.size() = "+contact_id.size());
         System.out.println("contact_name.size() = "+contact_name.size());

         ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, contact_name);       
         autoCompleteTextView.setAdapter(adapter);

         /*
          * 為AutoCompleteTextView提供的(下拉式)選單清單添加點擊事件
          * 帶出info: 電話
          */
         autoCompleteTextView.setOnItemClickListener(new OnItemClickListener()
         {
    public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) 
    {     
           for(int order=0; order<取得聯絡人的電話號碼>
              * 若Phone ID == Contacts ID
              */
             Cursor phones = getContentResolver().query
             (
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, 
        null, 
        null
       );
             
             if (phones.moveToFirst()) 
             {
              String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
              String phoneType = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
              if(phoneType.equals("1"))
              {
               textview1.setText("住家電話:");
              }
              else if(phoneType.equals("2"))
              {
               textview1.setText("行動電話:");
              }
              else if(phoneType.equals("3"))
              {
               textview1.setText("公司電話:");
              }
              else
              {
               textview1.setText("其它:");
              }
              textview2.setText(phoneNumber);
             }
            }
           }    
    }
   });
        }        
        finally
        {
         cur_name.close();
        }
 }
}

2012年1月24日 星期二

撈出聯絡人資料 ~ 照片 ~ 並換圖 BitmapFactory.decodeByteArray







要讀取聯絡人資料記得Manifest.xml中要加入




Launch這個AP後, 會撈出Device中聯絡人的資料, 列出有人名(ContactsContract.Contacts.DISPLAY_NAME有值)的資料, 並抓出聯絡人圖片, 如果沒設的就顯示

本範例目的在自行更換圖示, 所以用了兩個Activity -> 選擇要換圖的item後 -> open另一個Activity選圖
















換換換~
帶有圖片的Toast



如此我們便可以任意更換聯絡人圖示~不過這個AP並沒有真正寫入資料到ContactsContract.Contacts,也沒有建立資料庫存放, 所以關閉後所有的變更就會不見囉.
















ContactPhotoActivity.java
package com.tsots.GridView_Contact_ChangePhoto;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
  
public class ContactPhotoActivity extends Activity 
{  
 Context context = ContactPhotoActivity.this;
 List total_contact_id= new ArrayList();
 List contact_name= new ArrayList();
 List contact_photo= new ArrayList();
 GridView g1;
 String photoId;  
 String tag = "com.tsots.GridView_Contact_ChangePhoto / ContactPhotoActivity.java";
 int num_contact=0;
 int num_contact_photo=0;
 int contact_id;
 int photo;
 Bitmap photoBitmap;
 Bitmap tmp_photoBitmap;
 Bitmap map; 

 /** Called when the activity is first created. */  
 @Override  
    public void onCreate(Bundle savedInstanceState) 
 {  
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);  
  
  g1 = (GridView) findViewById (R.id.gridview1); 
  //陣列內容: 從contact撈出有顯示名稱的資料
  final String[] selectNameColumn = new String[]{
                                          ContactsContract.Contacts._ID, 
                                          ContactsContract.Contacts.DISPLAY_NAME
                                          };
        final Cursor cursor_ContactName = getContentResolver().query(  
                            Contacts.CONTENT_URI,  //要查詢的表格
                            selectNameColumn,      //要回傳的欄位組合
                            null,  
                            null,  
                            null
                             );  
        try
        {
         cursor_ContactName.moveToFirst();                                              
         do
         {                 
          /*****************************聯絡人在被建立時該id***************************************
           * int idColumn = cursor_ContactName.getColumnIndex(ContactsContract.Contacts._ID);
           * String contactId = cursor_ContactName.getString(idColumn);//會丟入59筆資料
           *****************************等於*****************************************************/
          String contactId = cursor_ContactName.getString(0);  //回傳有DISPLAY_NAME的資料,個人Device有59筆        
          
          /*****************************聯絡人姓名***********************************************
           * final int nameColumn = cursor_ContactName.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
           * String contactName = cursor_ContactName.getString(nameColumn);
           *****************************等於*****************************************************/
          String contactName = cursor_ContactName.getString(1);

          try
          {                  
           byte[] photo = getPhoto(contactId);   //只會得到24筆資料
           num_contact++;
                 map = BitmapFactory.decodeByteArray(photo, 0, photo.length); 
                 total_contact_id.add(String.valueOf(contactId));
                 contact_name.add(num_contact + " " + String.valueOf(contactName));                 
                 contact_photo.add(map);
             }
                catch(Exception e)
                {
                 System.out.println("e = "+e); 
                }
            }while(cursor_ContactName.moveToNext());

            Adapter_ContactPhotoActivity adapter = new Adapter_ContactPhotoActivity(
                                  this,   
                                  contact_name,
                                  contact_photo
                         );
            g1.setNumColumns(3);    //每排3筆資料
            g1.setAdapter(adapter); //自訂的Adapter

            /*
             * 加入GridView的點擊事件
             * 記錄user點選的位置到"CONTACT_POSITION", 這個數值是在PhotoSelect.java中選好換圖事件後,
             * 所要對哪個聯絡人欄位變更資訊的依據
             */
            class  ItemClickListener implements OnItemClickListener
            {
             public void onItemClick(AdapterView arg0,//The AdapterView where the click happened   
                   View v,             //The view within the AdapterView that was clicked  
                   int position,       //The position that be clicked  
                   long id             //The row id of the item that was clicked  
                     ) 
             {                  
              Intent intent = new Intent(context, PhotoSelect.class);
              Bundle bundle = new Bundle();
              bundle.putInt("CONTACT_POSITION", position);
              intent.putExtras(bundle);
              Log.i(tag, "select position : "+position);
              Log.i(tag, "select contact_name : "+contact_name.get(position));
              startActivityForResult(intent,0);
             }
            }
            g1.setOnItemClickListener(new ItemClickListener());       
        }
        finally
        {
         cursor_ContactName.close();
        }
 }
 
 /*
  * 這個function負責從聯絡人中撈出有PHOTO_ID的資料, 並以byte[]的型態回傳
  */
 public byte[] getPhoto(String people_id) 
 {
  byte[] contactIcon = null;
  String photo_id = null;
  String selection1 = ContactsContract.Contacts._ID + " = " + people_id; 
  Cursor cur_select_name = getContentResolver().query(
               ContactsContract.Contacts.CONTENT_URI, /*搜尋對象*/
               null, 
               selection1,                            /*條件*/
               null,
               null
              );
  //會丟入59筆資料    
  if (cur_select_name.getCount() > 0) 
  {
   cur_select_name.moveToFirst();
   photo_id = cur_select_name.getString(cur_select_name.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
  }
  String[] projection = new String[] {ContactsContract.Data.DATA15}; 
  String select_photo = ContactsContract.Data._ID + " = " + photo_id;  //只抓有photo的data
  //String selection = ContactsContract.Data._ID;  //抓所有有名字的data, 且沒有抓到photo值

  Cursor cur_select_photo = getContentResolver().query(
                 ContactsContract.Data.CONTENT_URI, //要查詢的表格        
                 projection,                        //要回傳的欄位組合
                 select_photo,                      //符合這個限制資料的才會回傳
                 null,                              //前一個參數的參數
                 null                               //排序
                );
  //會丟入59筆資料    
  cur_select_photo.moveToFirst();
  /*
   * 若由DISPLAY_NAME過濾後的資料裡, 沒有聯絡人圖片的, 統一給一個圖示, 從.png裡抓
   */
  if(cur_select_photo.getCount() == 0)
  {
   //將圖檔轉成Bitmap
   tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.widget_stock_addnewstock_btn_normal);  
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   //將.png的圖檔轉成Bitmap
   tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);                                                  
   contactIcon = baos.toByteArray();
   return contactIcon;
  }
  else
  {
   //只會得到24筆資料
   contactIcon = cur_select_photo.getBlob(0);
   return contactIcon;
  }
 }
 
 /*
  * 從PhotoSelect.java操作完選圖的動作
  * 傳回"CONTACT_POSITION"和"CONTACT_PHOTO"到ContactPhotoActivity.java
  */
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) 
 {
  super.onActivityResult(requestCode, resultCode, data);
  switch(resultCode)
  {
   case RESULT_OK:
    Bundle bundle_from_PhotoSelect = data.getExtras();
    contact_id = bundle_from_PhotoSelect.getInt("CONTACT_POSITION");
    photo = bundle_from_PhotoSelect.getInt("CONTACT_PHOTO");
    changePhoto(contact_id, photo);
    break;
  }
 }
 
 public void changePhoto(int id, int photo)
 {  
     tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), photo);     //將int轉成Bitmap
  ByteArrayOutputStream baos_from_PhotoSelect = new ByteArrayOutputStream(); //將Bitmap轉成ByteArrayOutStream
  tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos_from_PhotoSelect);                                                  
  byte[] byte_from_PhotoSelect = baos_from_PhotoSelect.toByteArray();        //將ByteArrayOutStream轉成byte
        map = BitmapFactory.decodeByteArray(byte_from_PhotoSelect, 0, byte_from_PhotoSelect.length);//將byte轉成Bitmap
     contact_photo.set(id, map);    //可以改變contact_photo
     //contact_name.set(id, "xxx"); //可以改變contact_name   
     
        Adapter_ContactPhotoActivity adapter = new Adapter_ContactPhotoActivity(
                                 this,   
                                 contact_name,
                                 contact_photo
                        );
        g1.setNumColumns(3);    //每排3筆資料
        g1.setAdapter(adapter); //自訂的Adapter
 }
 } //

2012年1月23日 星期一

撈出聯絡人資料 ~ if(顯示名稱) ContactsContract.Contacts.DISPLAY_NAME







要讀取聯絡人資料記得Manifest.xml中要加入
加入OnItemClickListener讓user點到的item名稱顯示在Title列



GridViewActivity.java

package com.tsots.GridView_HashMap;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class GridViewActivity extends Activity 
{
 GridView g1;
 String str1;
 ArrayList> lstImageItem;
 /** Called when the activity is first created. */  
 @Override  
    public void onCreate(Bundle savedInstanceState) 
 {  
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);  
  
  g1 = (GridView) findViewById (R.id.gridview1);
  
  Uri contacts = Contacts.CONTENT_URI;
  //陣列內容: 從contact撈出有顯示名稱的資料
  String[] selectColumn = new String[] {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME};
        Cursor cur = getContentResolver().query(  
                   contacts,  
                   selectColumn,  
                   null,  
                   null,  
                   null
                    );  
        try
        {
         if (cur.moveToFirst()) 
         {                  
             int displayNameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
             lstImageItem = new ArrayList>();

                do
                {
                 //用HashMap加入圖片與文字訊息
                 HashMap map = new HashMap();
                 map.put("ItemImage", R.drawable.icon);
                 map.put("ItemText", String.valueOf(cur.getString(displayNameColumn)));
                 lstImageItem.add(map);
                }while(cur.moveToNext());

                SimpleAdapter saImageItems = new SimpleAdapter(this,   
                  lstImageItem,   
                  R.layout.night_item,//ImageView*1, TextView*1  
                  new String[] {"ItemImage","ItemText"},    
                  new int[] {R.id.ItemImage,R.id.ItemText}
                             );
                //每行3欄資料
                g1.setNumColumns(3);
                g1.setAdapter(saImageItems);
             class  ItemClickListener implements OnItemClickListener
             {
              public void onItemClick(AdapterView arg0,//The AdapterView where the click happened   
           View arg1,//The view within the AdapterView that was clicked  
           int arg2,//The position of the view in the adapter  
           long arg3//The row id of the item that was clicked  
                      ) 
              {   
               HashMap item = (HashMap) arg0.getItemAtPosition(arg2);    
               setTitle((String)item.get("ItemText"));
              }
             }
             g1.setOnItemClickListener(new ItemClickListener());
         }
        }
        finally
        {
         cur.close();
        }
 }
}//

2012年1月11日 星期三

撈出聯絡人資料 ~ 照片 ContactsContract.Contacts.PHOTO_ID







要讀取聯絡人資料記得Manifest.xml中要加入


ContactPhotoActivity.java

package com.tsots.ContactPhotoActivity;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.widget.GridView;
  
public class ContactPhotoActivity extends Activity 
{  
 GridView g1;
 String photoId;
 Bitmap photoBitmap;
 List contact_name= new ArrayList();
 List contact_photo= new ArrayList();
 int num_contact=0;
 int num_contact_photo=0;
 Bitmap tmp_photoBitmap;
 
 /** Called when the activity is first created. */  
 @Override  
    public void onCreate(Bundle savedInstanceState) 
 {  
  super.onCreate(savedInstanceState);  
  setContentView(R.layout.main);  
  g1 = (GridView) findViewById (R.id.gridview1);  
  Uri contacts = Contacts.CONTENT_URI;
  //陣列內容: 從contact撈出有顯示名稱的資料
  String[] selectNameColumn = new String[]{
                                        ContactsContract.Contacts._ID, 
                                        ContactsContract.Contacts.DISPLAY_NAME
                                       };
        Cursor cur = getContentResolver().query(  
                   contacts,          //要查詢的表格
                   selectNameColumn,  //要回傳的欄位組合
                   null,  
                   null,  
                   null
                    );  
        try
        {
         if (cur.moveToFirst()) 
         {                  
          int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
          int nameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
          do
          {                  
           String contactId = cur.getString(idColumn);//回傳有DISPLAY_NAME的資料,個人Device有103筆                  
           try
           {
            byte[] photo = getPhoto(contactId);   //只回傳有PHOTO_ID的資料,個人Device有24筆
            num_contact++;
            //將byte轉成Bitmap
                  Bitmap map = BitmapFactory.decodeByteArray(photo, 0, photo.length);                      
                  contact_name.add(num_contact + " " + String.valueOf(cur.getString(nameColumn)));
                  contact_photo.add(map);
              }
                 catch(Exception e)
                 {
                   
                 }
             }while(cur.moveToNext());
                 
             PhotoAdapter adapter = new PhotoAdapter(
                           this,   
                           contact_name,
                           contact_photo
                  );
             g1.setNumColumns(3);    //每列3筆資料
             g1.setAdapter(adapter); //自訂的Adapter
         }
        }
        finally
        {
         cur.close();
        }
 }
 
 /*
  * 這個function負責從聯絡人中撈出有PHOTO_ID的資料, 並以byte[]的型態回傳
  */
 public byte[] getPhoto(String people_id) 
 {
  byte[] contactIcon = null;
  String photo_id = null;
  String select_name = ContactsContract.Contacts._ID + " = " + people_id; 
  Cursor cur_select_name = getContentResolver().query(
                 ContactsContract.Contacts.CONTENT_URI, 
                 null, 
                 select_name, 
                 null,
                 null
                   );
  //會丟入103筆資料    
  if (cur_select_name.getCount() > 0) 
  {
   cur_select_name.moveToFirst();
   photo_id = cur_select_name.getString(cur_select_name.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
  }
  String[] projection = new String[] {ContactsContract.Data.DATA15}; 
  String select_photo = ContactsContract.Data._ID + " = " + photo_id;  //只抓有photo的data
  //String selection = ContactsContract.Data._ID;        //抓所有有名字的data, 且沒有抓到photo值

  Cursor cur_select_photo = getContentResolver().query(
                     ContactsContract.Data.CONTENT_URI, //要查詢的表格        
                     projection,                        //要回傳的欄位組合
                     select_photo,                      //符合這個限制資料的才會回傳
                     null,                              //前一個參數的參數
                     null                               //排序
               );
  //會丟入59筆資料    
  cur_select_photo.moveToFirst();
  /*
   * 若由DISPLAY_NAME過濾後的資料裡, 沒有聯絡人圖片的, 統一給一個圖示, 從.png裡抓
   */
  if(cur_select_photo.getCount() == 0)
  {
   tmp_photoBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.widget_stock_addnewstock_btn_normal);  //將圖檔轉成Bitmap
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   tmp_photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); //將.png的圖檔轉成Bitmap
   contactIcon = baos.toByteArray();
   return contactIcon;
  }
  else
  {
   //只會得到24筆資料
   contactIcon = cur_select_photo.getBlob(0);
   return contactIcon;
  }
 }
 } //