要讀取聯絡人資料記得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; Listtotal_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 } } //
PhotoSelect.java
package com.tsots.GridView_Contact_ChangePhoto; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class PhotoSelect extends Activity { Context context = PhotoSelect.this; Adapter_PhotoSelect adapter = new Adapter_PhotoSelect(this); Intent intent; Bundle bundle; int contact_id; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //取得從ContactPhotoActivity.java intent來的bundle資料 intent=this.getIntent(); bundle = intent.getExtras(); contact_id = bundle.getInt("CONTACT_POSITION"); GridView gridview = (GridView) findViewById(R.id.gridview1); gridview.setNumColumns(3); gridview.setAdapter(adapter); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, final View v, final int position, final long id) { ImageView iv = new ImageView(context); iv.setImageResource(adapter.mThumbIds[position]); /* * 建立一個AlertDialog, 除了預覽選到的圖片外 * PositiveButton會傳回"CONTACT_PHOTO","CONTACT_POSITION"的值到前一個畫面 * NegativeButton則退出AlertDialog */ new AlertDialog.Builder(context) .setTitle(getResources().getString(R.string.alertdialog_title)) .setView(iv) .setPositiveButton(getResources().getString(R.string.alertdialog_PositiveButton), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { toastWithPhoto(position, v); bundle.putInt("CONTACT_PHOTO", adapter.mThumbIds[position]); bundle.putInt("CONTACT_POSITION", contact_id); intent.putExtras(bundle); //以RESULT_OK標籤識別換圖的動作成不成立 PhotoSelect.this.setResult(RESULT_OK, intent); //結束此Activity PhotoSelect.this.finish(); } }) .setNegativeButton(getResources().getString(R.string.alertdialog_NegativeButton), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }) .show(); } }); } public void toastWithPhoto(int position, View v) { ImageView iv = new ImageView(context); photoChangeSize(position, iv); TextView tv = new TextView(context); tv.setText(String.valueOf(position)); LinearLayout lay = new LinearLayout(context); lay.setOrientation(LinearLayout.HORIZONTAL); Toast toast = Toast.makeText(context, getResources().getString(R.string.toast_text) + tv.getText(), Toast.LENGTH_SHORT); View view = toast.getView(); lay.addView(view); lay.addView(iv); toast.setView(lay); toast.show(); } public void photoChangeSize(int position, ImageView iv) { Matrix matrix = new Matrix(); float scaleWidth = (float) 0.5; float scaleHeigh = (float) 0.5; matrix.postScale(scaleWidth, scaleHeigh); Bitmap bmp = BitmapFactory.decodeResource(getResources(), adapter.mThumbIds[position]); int bmpWidth = bmp.getWidth(); int bmpHeigh = bmp.getHeight(); Bitmap resizebmp = Bitmap.createBitmap(bmp,0,0, bmpWidth, bmpHeigh, matrix, true); iv.setImageBitmap(resizebmp); } }
ContactPhotoActivity.java的Adapter, 設定GridView的型態是一個ImageView加一個TextView
Adapter_ContactPhotoActivity.java
package com.tsots.GridView_Contact_ChangePhoto; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class Adapter_ContactPhotoActivity extends BaseAdapter { private Context photoadapter; List_contact_name; List _contact_photo; String tag = "com.tsots.GridView_Contact_ChangePhoto / Adapter_ContactPhotoActivity.java"; public Adapter_ContactPhotoActivity(Context con,List contact_name, List contact_photo) { photoadapter = con; _contact_name = contact_name; _contact_photo = contact_photo; } public int getCount() { //return _items.length; return _contact_name.size(); } public Object getItem(int position) { return _contact_name.get(position); } public long getItemId(int position) { return position; } /* * 從layout contactactivity_adapter.xml中定義一個TextView與一個ImageView欄位來放置聯絡人圖片與名稱 */ public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater factory = LayoutInflater.from(photoadapter); View v = (View) factory.inflate(R.layout.adapter_contactphotoactivity, null); TextView tv = (TextView) v.findViewById(R.id.ItemText); ImageView iv = (ImageView) v.findViewById(R.id.ItemImage); tv.setText(_contact_name.get(position).toString()); try { iv.setImageBitmap(_contact_photo.get(position)); } catch(Exception e) { Log.e(tag, String.valueOf(e)); } return v; } }
PhotoSelect.java的Adapter, 設定GridView的型態是一個ImageView
Adapter_PhotoSelect.java
package com.tsots.GridView_Contact_ChangePhoto; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class Adapter_PhotoSelect extends BaseAdapter { private Context mContext; public Adapter_PhotoSelect(Context c) { mContext = c; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(110, 110)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } public Integer[] mThumbIds = { R.drawable.pic_01, R.drawable.pic_02, R.drawable.pic_03, R.drawable.pic_04, R.drawable.pic_05, R.drawable.pic_06, R.drawable.pic_07, R.drawable.pic_08, R.drawable.pic_09, R.drawable.pic_10, R.drawable.pic_11, R.drawable.pic_12, R.drawable.pic_13, R.drawable.pic_14, R.drawable.pic_15, R.drawable.pic_16, R.drawable.pic_17, R.drawable.pic_18, R.drawable.pic_19, R.drawable.pic_20, R.drawable.pic_21, R.drawable.pic_22, R.drawable.pic_23, R.drawable.pic_24, R.drawable.pic_25, R.drawable.pic_26, R.drawable.pic_27, R.drawable.pic_28, R.drawable.pic_29, R.drawable.pic_30, R.drawable.pic_31, R.drawable.pic_32, R.drawable.pic_33, R.drawable.pic_34 }; }
請問有完整檔案借看嗎ˊˋ
回覆刪除正在學這個 拜託嚕
gn01672966@gmail.com
或者放網上下載也可以 感謝您~~