我正在开发更改联系人图像的应用程序。当我点击保存按钮更改图像时,我不知道如何做到这一点或如何刷新联系人的列表视图。下面是我的代码MainActivity.class和Detail.class。
MainActivity.class
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// The contacts from the contacts content provider is stored in this
// cursor
mMatrixCursor = new MatrixCursor(new String[] { "_id", "name", "photo",
"details" });
// Adapter to set data in the listview
mAdapter = new SimpleCursorAdapter(getBaseContext(),
R.layout.lv_layout, null, new String[] { "name", "photo",
"details" }, new int[] { R.id.tv_name, R.id.iv_photo,
R.id.tv_details }, 0);
// Getting reference to listview
ListView lstContacts = (ListView) findViewById(R.id.lst_contacts);
// Setting the adapter to listview
lstContacts.setAdapter(mAdapter);
// Creating an AsyncTask object to retrieve and load listview with
// contacts
ListViewContactsLoader listViewContactsLoader = new ListViewContactsLoader();
// Starting the AsyncTask process to retrieve and load listview with
// contacts
listViewContactsLoader.execute();
lstContacts.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Constants.position = position;
Constants.id = Constants.ids_list.get(position);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent intent = new Intent(MainActivity.this, detail.class);
intent.putExtra("bmp", byteArray); // for image
startActivity(intent);
}
});
}
/** An AsyncTask class to retrieve and load listview with contacts */
private class ListViewContactsLoader extends AsyncTask<Void, Void, Cursor> {
@Override
protected Cursor doInBackground(Void... params) {
Uri contactsUri = ContactsContract.RawContacts.CONTENT_URI;
// Querying the table ContactsContract.Contacts to retrieve all the
// contacts
Cursor contactsCursor = getContentResolver().query(contactsUri,
null, null, null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
if (contactsCursor.moveToFirst()) {
do {
long contactId = contactsCursor.getLong(contactsCursor
.getColumnIndex("_ID"));
Uri dataUri = ContactsContract.Data.CONTENT_URI;
// Querying the table ContactsContract.Data to retrieve
// individual items like
// home phone, mobile phone, work email etc corresponding to
// each contact
Cursor dataCursor = getContentResolver().query(
dataUri,
null,
ContactsContract.Data.RAW_CONTACT_ID + "="
+ contactId, null, null);
Constants.ids_list.add(contactId);
String displayName = "";
String nickName = "";
String homePhone = "";
String mobilePhone = "";
String workPhone = "";
String photoPath = "" + R.drawable.blank;
byte[] photoByte = null;
String title = "";
if (dataCursor.moveToFirst()) {
// Getting Display Name
displayName = dataCursor
.getString(dataCursor
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
do {
// Getting NickName
if (dataCursor
.getString(
dataCursor
.getColumnIndex("mimetype"))
.equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE))
nickName = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
// Getting Phone numbers
if (dataCursor
.getString(
dataCursor
.getColumnIndex("mimetype"))
.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
switch (dataCursor.getInt(dataCursor
.getColumnIndex("data2"))) {
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
homePhone = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
mobilePhone = dataCursor
.getString(dataCursor
.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
workPhone = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
break;
}
}
// Getting Photo
if (dataCursor
.getString(
dataCursor
.getColumnIndex("mimetype"))
.equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)) {
photoByte = dataCursor.getBlob(dataCursor
.getColumnIndex("data15"));
if (photoByte != null) {
bitmap = BitmapFactory.decodeByteArray(
photoByte, 0, photoByte.length);
// Getting Caching directory
File cacheDirectory = getBaseContext()
.getCacheDir();
// Temporary file to store the contact image
File tmpFile = new File(
cacheDirectory.getPath() + "/wpta_"
+ contactId + ".png");
// The FileOutputStream to the temporary
// file
try {
FileOutputStream fOutStream = new FileOutputStream(
tmpFile);
// Writing the bitmap to the temporary
// file as png file
bitmap.compress(
Bitmap.CompressFormat.PNG, 100,
fOutStream);
// Flush the FileOutputStream
fOutStream.flush();
// Close the FileOutputStream
fOutStream.close();
} catch (Exception e) {
e.printStackTrace();
}
photoPath = tmpFile.getPath();
}
}
} while (dataCursor.moveToNext());
String details = "";
// Concatenating various information to single string
if (homePhone != null && !homePhone.equals(""))
details = "HomePhone : " + homePhone + "n";
if (mobilePhone != null && !mobilePhone.equals(""))
details += "MobilePhone : " + mobilePhone + "n";
if (workPhone != null && !workPhone.equals(""))
details += "WorkPhone : " + workPhone + "n";
if (nickName != null && !nickName.equals(""))
details += "NickName : " + nickName + "n";
if (title != null && !title.equals(""))
details += "Title : " + title + "n";
// Adding id, display name, path to photo and other
// details to cursor
mMatrixCursor.addRow(new Object[] {
Long.toString(contactId), displayName,
photoPath, details });
}
} while (contactsCursor.moveToNext());
}
return mMatrixCursor;
}
@Override
protected void onPostExecute(Cursor result) {
// Setting the cursor containing contacts to listview
mAdapter.swapCursor(result);
}
}
}
Here is My Detail.class。保存按钮在那里。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_list);
Intent i = getIntent();
this.photo = (ImageView) this.findViewById(R.id.photo);
this.camera = (Button) this.findViewById(R.id.camera);
this.galery = (Button) this.findViewById(R.id.galary);
this.save = (Button) this.findViewById(R.id.save);
this.galery.setOnClickListener(new ImagePickListener());
this.camera.setOnClickListener(new TakePictureListener());
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int position = getIntent().getExtras().getInt("bmp");
// int po=ops.size();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
if (image != null) { // If an image is selected successfully
// Bitmap bmp = BitmapFactory.decodeResource(getResources(),
// R.drawable.ic_launcher);
image.compress(Bitmap.CompressFormat.PNG, 0, stream);
//
long id = Constants.id;
// setContactPhoto(stream.toByteArray(), id);
setContactPhoto(detail.this.getContentResolver(),
stream.toByteArray(), id);
detail.this.finish();
Intent intent=new Intent(detail.this,MainActivity.class);
startActivity(intent);
}
}
});
}
void setContactPhoto(byte[] byteArray, long parseLong) {
// TODO Auto-generated method stub
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, parseLong);
android.provider.Contacts.People.setPhotoData(
detail.this.getContentResolver(), uri, byteArray);
Log.d("main", "id: " + parseLong + " Uri: " + uri + " bytearray: "
+ byteArray.length);
}
/**
* Receive the result from the startActivity
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case IMAGE_PICK:
this.imageFromGallery(resultCode, data);
break;
case IMAGE_CAPTURE:
this.imageFromCamera(resultCode, data);
break;
case PICK_PHOTO:
if (resultCode == RESULT_OK) {
// Getting the uri of the picked photo
Uri updateImageView = data.getData();
InputStream imageStream = null;
try {
// Getting InputStream of the selected image
imageStream = getContentResolver().openInputStream(
updateImageView);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// Creating bitmap of the selected image from its
// inputstream
image = BitmapFactory.decodeStream(imageStream);
// Getting reference to ImageView
// ImageButton ibPhoto = (ImageButton)
// findViewById(R.id.photo);
// Setting Bitmap to ImageButton
photo.setImageBitmap(image);
}
break;
default:
break;
}
}
}
/**
* Update the imageView with new bitmap
*
* @param newImage
*/
private void updateImageView(Bitmap newImage) {
BitmapProcessor bitmapProcessor = new BitmapProcessor(newImage, 1000,
1000, 90);
this.image = bitmapProcessor.getBitmap();
this.photo.setImageBitmap(this.image);
}
/**
* Image result from camera
*
* @param resultCode
* @param data
*/
private void imageFromCamera(int resultCode, Intent data) {
this.updateImageView((Bitmap) data.getExtras().get("data"));
}
/**
* Image result from gallery
*
* @param resultCode
* @param data
*/
private void imageFromGallery(int resultCode, Intent data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
this.updateImageView(BitmapFactory.decodeFile(filePath));
}
/**
* Click Listener for selecting images from phone gallery
*
* @author tscolari
*
*/
class ImagePickListener implements OnClickListener {
@Override
public void onClick(View v) {
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "select photo"), IMAGE_PICK);
}
}
/**
* Click listener for taking new picture
*
* @author tscolari
*
*/
class TakePictureListener implements OnClickListener {
@Override
public void onClick(View v) {
Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, IMAGE_CAPTURE);
}
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
// Constants.ids_list.clear();
startActivity(new Intent(this, MainActivity.class));
super.onDestroy();
// finish();
}
void setContactPhoto(ContentResolver c, byte[] bytes, long personId) {
ContentValues values = new ContentValues();
int photoRow = -1;
// personId = 8863;
String where = ContactsContract.Data._ID + " = " + personId + " AND "
+ ContactsContract.Data.MIMETYPE + "=='"
+ ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
+ "'";
Cursor cursor = c.query(ContactsContract.Data.CONTENT_URI, null, where,
null, null);
int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
if (cursor.moveToFirst()) {
photoRow = cursor.getInt(idIdx);
}
cursor.close();
values.put(ContactsContract.Data.RAW_CONTACT_ID, personId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes);
values.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
if (photoRow >= 0) {
c.update(ContactsContract.Data.CONTENT_URI, values,
ContactsContract.Data._ID + " = " + photoRow, null);
Toast.makeText(detail.this, "updated " + personId, 50000).show();
} else {
c.insert(ContactsContract.Data.CONTENT_URI, values);
Toast.makeText(detail.this, "inserted " + personId, 50000).show();
}
}
}
在ButtonClick
中的保存函数之后使用Intent intent = getIntent();
finish();
startActivity(intent);
@Override
public void onClick(View arg0) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int position = getIntent().getExtras().getInt("bmp");
// int po=ops.size();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
if (image != null) { // If an image is selected successfully
// Bitmap bmp = BitmapFactory.decodeResource(getResources(),
// R.drawable.ic_launcher);
image.compress(Bitmap.CompressFormat.PNG, 0, stream);
//
long id = Constants.id;
// setContactPhoto(stream.toByteArray(), id);
setContactPhoto(detail.this.getContentResolver(),
stream.toByteArray(), id);
detail.this.finish();
Intent intent = getIntent();
startActivity(intent);
}