По ходу обучения программированию под систему Android, мне была поставлена задача написания своего контакт-менеджера, пусть не в замен системному, а именно как обучающее задание.
Работа с контакт-листом была уже описана тут, и не один раз, потому напишу только про то, что я тут не встретил, а, именно, про работу с фотографией контакта (аватара контакта).
По ходу работы мною был написан класс-helper, код можно увидеть тут. В нём были реализованы основные функции для работы с фото из контакта.
Основых методов два:
Как очевидно из названия, в первом методе мы сохраняем контакту новую фотографию, а второй метод загружает из базы данных контактов фотографию.
Использование методов:
Для сохранения фотографии контакту, её надо сначала получить, например, из галереи.
Пусть, у нас на активити есть кнопка ImageButton, по нажатию которой будет появляться окно выбора фотографии из галереи. Не забываем, что фотография в галерее может быть любых размеров, потому, сначала фотографию надо уменьшить под нужный размер. К счастью, программисту под андроид не требуется знание алгоритмов уменьшения размеров и обрезания изображений, всё уже сделано компанией Google заранее, достаточно в вызов добавить нужные параметры, пример ниже:
Как мы можем видеть из этого кода, при создании нового интента мы добавили ему параметры из документации, для автоматического обрезания под размер и уменьшения фотографии. Результат выполнения системная активити положит, по стандарту, в вызов onActivityResult, вызвавшей её активити.
Следует учесть, что в данном примере, системная активити положит результат во временный файл, который мы создали в методе ContactPhotoHelper.getTempUri().
Обработка результата: на кнопке высветится результирующая фотография
После этого, можно сохранить пользователю эту фотографию в профиле:
В результате, выбранный контакт получает новую фотографию
Для загрузки фотографии из контакт листа вызов совсем простой, используем всё ту же кнопку ImageButton:
Таким образом, при помощи всего двух статических методов, я здорово упростил работу с фотографиями контактов, почему это не было сделано разработчиками из Google, я не знаю.
Спасибо за внимание.
Работа с контакт-листом была уже описана тут, и не один раз, потому напишу только про то, что я тут не встретил, а, именно, про работу с фотографией контакта (аватара контакта).
По ходу работы мною был написан класс-helper, код можно увидеть тут. В нём были реализованы основные функции для работы с фото из контакта.
Основых методов два:
public static void setContactPhoto(ContentResolver c, byte[] bytes, long personId)
public static Bitmap loadContactPhoto(ContentResolver cr, long id, Context context)
Как очевидно из названия, в первом методе мы сохраняем контакту новую фотографию, а второй метод загружает из базы данных контактов фотографию.
Использование методов:
Для сохранения фотографии контакту, её надо сначала получить, например, из галереи.
Пусть, у нас на активити есть кнопка ImageButton, по нажатию которой будет появляться окно выбора фотографии из галереи. Не забываем, что фотография в галерее может быть любых размеров, потому, сначала фотографию надо уменьшить под нужный размер. К счастью, программисту под андроид не требуется знание алгоритмов уменьшения размеров и обрезания изображений, всё уже сделано компанией Google заранее, достаточно в вызов добавить нужные параметры, пример ниже:
private static final int REQ_CODE_PICK_IMAGE = 1;
private Bitmap contactPhoto = null;
private ImageView ibtnAvatar;
@Override
protected void onCreate(Bundle bundle) {
...
ibtnAvatar = (ImageButton) findViewById(R.id.ibtn_avatar);
ibtnAvatar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.putExtra("crop", "true");
i.putExtra("aspectX", 1);
i.putExtra("aspectY", 1);
i.putExtra("outputX", 500);
i.putExtra("outputY", 500);
i.putExtra("scale", true);
i.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
i.putExtra("noFaceDetection", false);
i.putExtra("return-data", false);
i.putExtra(MediaStore.EXTRA_OUTPUT, ContactPhotoHelper.getTempUri());
startActivityForResult(i, REQ_CODE_PICK_IMAGE);
}
});
}
Как мы можем видеть из этого кода, при создании нового интента мы добавили ему параметры из документации, для автоматического обрезания под размер и уменьшения фотографии. Результат выполнения системная активити положит, по стандарту, в вызов onActivityResult, вызвавшей её активити.
Следует учесть, что в данном примере, системная активити положит результат во временный файл, который мы создали в методе ContactPhotoHelper.getTempUri().
Обработка результата: на кнопке высветится результирующая фотография
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case REQ_CODE_PICK_IMAGE:
if (resultCode == RESULT_OK) {
contactPhoto = BitmapFactory.decodeFile(ContactPhotoHelper.getTempFile()
.getAbsolutePath());
ibtnAvatar.setImageBitmap(contactPhoto);
}
}
}
После этого, можно сохранить пользователю эту фотографию в профиле:
if (contactPhoto != null) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
contactPhoto.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
ContactPhotoHelper.setContactPhoto(getContentResolver(), bitmapdata, contactId);
}
В результате, выбранный контакт получает новую фотографию
Для загрузки фотографии из контакт листа вызов совсем простой, используем всё ту же кнопку ImageButton:
ibtnAvatar.setImageBitmap(ContactPhotoHelper.loadContactPhoto(getContentResolver(), contactId, this));
Таким образом, при помощи всего двух статических методов, я здорово упростил работу с фотографиями контактов, почему это не было сделано разработчиками из Google, я не знаю.
Спасибо за внимание.