1. Запрос фото с камеры с сохранением в файл
В андроиде запрос Environment.getExternalStorageState() дает возможность узнать подсоединено ли вообще место, где можно сохранять и загружать "медию", в т.ч. фото. Если оно возвращает Environment.MEDIA_MOUNTED - значит есть такое место, и можно туда и сохранять, и загружать файлы. Причем оно не означает присоединенную SD-карту. Даже в телефонах без карты памяти этот запрос возвращает MEDIA_MOUNTED - этот значит некое место есть чтобы сохранять/загружать медиафайлы.
Поэтому это даже хорошо что сначала написался код, пробрасывающий фотку в миниатюре через память. Теперь если MEDIA_MOUNTED - то будем просить камеру андроида сохранять полноразмерное фото в файл. А если не MEDIA_MOUNTED - то пробрасывать мини-фотку через память (чтоб даже такие андроиды без медиахранилища могли что-то попытаться сфотографировать).
Будем просить камеру сохранять файл с фото в папку Pictures, под именем редким каким-нибудь, чтоб не затереть другие файлы находящиеся там. Я выбрал "__phot__.jpg" - такие файлы у пользователя там вряд ли будут.
Перед этим проверим еще - можно ли вообще что-то сохранить в Pictures. Создадим файл (который потом перезапишется фоткой) и создадим путь (вдруг папки Pictures вообще нет).
Получился вот такой гибридный вызов камеры для фото в файл или в память (в помощь тем, кто будет делать съемку тоже в андроиде, хотя примеров в инете полно, даже этот - франкенштейн из них, конечно же):
Код: Выделить всё
byte[] camphoto = null;
Uri furi;
boolean filephot = true;
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + "Pictures/__phot__.jpg";
File phot = new File(path);
try {
if(!phot.exists()) {
phot.getParentFile().mkdirs();
phot.createNewFile();
}
} catch (IOException e) {
filephot=false;
}
if (filephot)
{
furi = Uri.fromFile(phot);
camphoto=null;
Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
takePicture.putExtra( MediaStore.EXTRA_OUTPUT, furi);
startActivityForResult(takePicture, 0);
}
} else {
filephot=false;
}
if (!filephot)
{
camphoto=null;
Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, 1);
}
Запрос съемки под номером 0 будет связан со съемкой в файл. А под номером 1 - со съемкой через память.
Чтоб запросить съемку через файл - после создания Intent-а под именем takePicture (как в предыдущем посте) добавил ему информацию о файле командой takePicture.putExtra( MediaStore.EXTRA_OUTPUT, furi), где furi = Uri.fromFile(phot) - т.е. URI из нашего пути+имени JPG файла.
2. После съемки: загружаем фото из файла или достаем его из памяти
Ответная часть - реакция на отснятую фотку - тоже разрослась. В обработке запроса 0 (фото через файл) после удачной загрузки JPG-файла по пути+имени из furi-переменной - удаляем его. В обработке запроса 1 (фото через память) ничего не поменялось с предыдущего поста:
Код: Выделить всё
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
//file photo
if((requestCode == 0) && (resultCode == RESULT_OK)){
this.getContentResolver().notifyChange(furi, null);
try
{
InputStream ims = this.getContentResolver().openInputStream(furi);
Bitmap bmp = BitmapFactory.decodeStream(ims);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
camphoto = baos.toByteArray();
} catch (Exception e) {
camphoto = null;
}
File fdel = new File(furi.getPath());
try
{
if (fdel.exists()) fdel.delete();
} catch (Exception e) {}
//memory photo
} else if ((requestCode == 1) && (resultCode == RESULT_OK)){
Bundle extras = imageReturnedIntent.getExtras();
if(extras.containsKey("data")) {
Bitmap bmp = (Bitmap) extras.get("data");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
camphoto = baos.toByteArray();
};
};
}
























































































































































