Pull to refresh

Работа с фотографиями контактов в android 2.1+

Reading time3 min
Views2.5K
По ходу обучения программированию под систему Android, мне была поставлена задача написания своего контакт-менеджера, пусть не в замен системному, а именно как обучающее задание.
Работа с контакт-листом была уже описана тут, и не один раз, потому напишу только про то, что я тут не встретил, а, именно, про работу с фотографией контакта (аватара контакта).

По ходу работы мною был написан класс-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, я не знаю.
Спасибо за внимание.
Tags:
Hubs:
Total votes 23: ↑21 and ↓2+19
Comments6

Articles