если вылетает то нужно лог ошибок выкладывать, 125 сообщений на форуме и до сих пор приходится выпрашивать логиIgNa писал(а):Во-первых, как уже говорил snowkam изображение сохраняется и в папку Picture и туда где хранятся все фотки с фотика ( не знаю как он с этим справился )
Во-вторых, лично у меня .. при записи видео, после нажатия кнопки стоп, приложение вылетает на всех девайсах, но видеофайл создается в папке Picture
Эти два факта делают невозможным использовать столь полезный код
Если кто знает как исправить, не дайте никому вас остановить
Урок 131. Камера. Используем системное приложение
Re: Урок 131. Камера. Используем системное приложение
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 131. Камера. Используем системное приложение
Я немного ошибся - при нажатии кнопки стоп при записи видео, ошибка возникает не в ЭТОМ приложении, а в приложении камера ( на телефоне либо планшете)
Таким образом никаких логов нет
Но нерабочесть кода остается, хотел бы посмореть на людей у которых данный код работает на реальных устройствах,
а не в эмуляторах, уверен что таких почти нет. Исправьте пожалуйста свой недочет... люди страдают, в африке дети умирают от голода. Эффект бабочки)
Таким образом никаких логов нет
Но нерабочесть кода остается, хотел бы посмореть на людей у которых данный код работает на реальных устройствах,
а не в эмуляторах, уверен что таких почти нет. Исправьте пожалуйста свой недочет... люди страдают, в африке дети умирают от голода. Эффект бабочки)
-
- Сообщения: 3
- Зарегистрирован: 31 июл 2012, 10:38
Re: Урок 131. Камера. Используем системное приложение
С HTC могут быть проблемы. Некоторые модели игнорируют настройки пути (EXTRA_OUTPUT) в Camera Intent или возвращают не пойми что. Ссылка по теме http://stackoverflow.com/a/6600148/527759. Как обойти баг можно почитать тут http://thanksmister.com/2012/03/16/andr ... ra_intent/SevenXP писал(а):Кто может уже подскажет, хотя этот вопрос не к это му уроку.
Делал приложение собственную фото камеру. Вот 2 устройство 2.3 андроид и планшет 4.0.4 вернул мне макс. разрешение фото. Для телефона 2.3 2500*1600 для планшета уже не помню но точно не размер экрана. Но на HTC 4.0.3 у которого была возможность делать фото в 3д возвращает постоянно фотку с размером экрана. Переключатель на HTC стоял на 2D и пробовал на 3D и всегда был размер фотки как и экрана. Но это же приложение на 2-х других дали нужный мне результат. Кто знает в чем может быть причина?
Это может быть неприятная особенность некоторых телефонов. Выше я привел ссылкиsnowkam писал(а):Почему то когда я делаю фотографию, фотография записывается и в обычную папку Camera и в папку которую мы создаем программно!!!
1. Как исправить этот баг?
Может, лучше задать имя изначальноsnowkam писал(а): 2. Как программно указать папку которую использует системное приложение Camera? и как после того как сделал снимок узнать имя файла?
Попробуйте фиксы по ссылке выше.IgNa писал(а):Во-первых, как уже говорил snowkam изображение сохраняется и в папку Picture и туда где хранятся все фотки с фотика ( не знаю как он с этим справился )
...
Если кто знает как исправить, не дайте никому вас остановить
Как это пытался обойти я. К сожалению не ручаюсь за 100% работоспособность, но некоторые баги это исправило. Выглядит как нагромождение костылей, но другого способа я не нашел.
Код: Выделить всё
mUploadImageFile = getNextFileName("upload_");
// this is a hack for some
// devices taken from here
// http://thanksmister.com/2012/03/16/android_null_data_camera_intent/
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE,
mUploadImageFile.getName());
values.put(MediaStore.Images.Media.DATA,
mUploadImageFile.getAbsolutePath());
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getActivity()
.getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, REQUEST_CAMERA);
Код: Выделить всё
void removeGalleryEntryForCurrentFile()
{
int rowsDeleted = TroveboxApplication.getContext().getContentResolver()
.delete(fileUri, null, null);
}
Код: Выделить всё
/**
* Calculate the image size for the given file name.
*
* @param filename
* @return
*/
public static BitmapFactory.Options calculateImageSize(String filename) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filename, options);
return options;
}
void updateingGalleryPictureSize()
{
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB)
{
return;
}
BitmapFactory.Options options = calculateImageSize(mUploadImageFile
.getAbsolutePath());
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.WIDTH, options.outWidth);
values.put(MediaStore.Images.Media.HEIGHT, options.outHeight);
int rowsUpdated = TroveboxApplication.getContext().getContentResolver()
.update(fileUri, values, null, null);
}
Код: Выделить всё
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CAMERA:
if (resultCode == RESULT_OK) {
updateingGalleryPictureSize();
setSelectedImageFile();
} else {
removeGalleryEntryForCurrentFile();
mUploadImageFile = null;
}
break;
default:
break;
}
}
Re: Урок 131. Камера. Используем системное приложение
У меня такая же проблема, как и у NitrogenW.
Независимо от того, в какой ориентации я делаю фотографию, в ImageView всегда выводится картинка в ландшафтном режиме. Причём, если я нахожу фотку в проводнике и открываю её встроенным просмотрщиком, то она показывается в правильной ориентации. Есть какой-то способ определять ориентацию получившейся фотки для её правильного отображения в ImageView?NitrogenW писал(а):Здравствуйте! у меня фотография всегда получается повернутой в ландшафтный режим: делаю в портретном -- итоговое изображение повернуто на 90 граусов Что можно с этим сделать?
не помоглоКод: Выделить всё
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Re: Урок 131. Камера. Используем системное приложение
Много гуглил и, к своему удивлению, во многих туториалах встречал в комментариях такой же вопрос, почему-то оставляемый без внимания. Только один добрый человек нашёл решение, которое, кстати, довольно-таки простое. Скомпилировав несколько ответов, получил такую парочку методов:
imageUri - Uri к сохранённой ранее фотке
Надеюсь, кому-нибудь это поможет
Код: Выделить всё
private void setPic(ImageView iv) {
// Get the dimensions of the View
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageUri.getPath(), bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(imageUri.getPath(), bmOptions);
ExifInterface ei;
try {
ei = new ExifInterface(imageUri.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Log.d(TAG, "ei = " + ei.toString());
Log.d(TAG, "orientation = " + orientation);
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
bitmap = rotateImage(bitmap, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
bitmap = rotateImage(bitmap, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
bitmap = rotateImage(bitmap, 270);
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iv.setImageBitmap(bitmap);
}
private Bitmap rotateImage(Bitmap bitmap, int degrees){
Matrix matrix = new Matrix();
matrix.postRotate(degrees);
bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return bitmap;
}
Надеюсь, кому-нибудь это поможет
Re: Урок 131. Камера. Используем системное приложение
Здравствуйте!
Подскажите пожалуйста, в уроке написано что при работе с фото в активити onActivityResult intent возвращается пустой (если используется путь для сохранения фото не по умолчанию). Как тогда получить само фото? Сохранять uri и по нему искать? Извините, если вопрос не слишком умный)
Подскажите пожалуйста, в уроке написано что при работе с фото в активити onActivityResult intent возвращается пустой (если используется путь для сохранения фото не по умолчанию). Как тогда получить само фото? Сохранять uri и по нему искать? Извините, если вопрос не слишком умный)
Re: Урок 131. Камера. Используем системное приложение
Добрый день.
Может кто подскажет, как узнать путь в читабельном формате?
Дело в том что при получении пути к изображению что в камере что в галереи он выглядит так "content://media/external/images/media/15"
с путем такого вида для работы с битмапами вполне подходит и работает хорошо.
Но если я пытаюсь скажем переименовать файл то нечего не выходит в добавок ко всему ошибок не выдает ошибку удалось обнаружить вот этим способом
if (oldFile.renameTo(newFile)) {
Log.d("TAG", "SobitieAdd saveFile " + "no error");
} else Log.d("TAG", "SobitieAdd saveFile " + "error");
Выше я задавал такой вопрос и сам нашел на него ответ
Uri selectedImage = imageReturnedIntent.getData();
Cursor cursor = getContentResolver().query(selectedImage, null, null, null, null);
cursor.moveToFirst();
int columnIndexData = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
filePath = cursor.getString(columnIndexData);
cursor.close();
но этот метод явно не хочет работать на некоторых версиях
может есть другой способ????
Может кто подскажет, как узнать путь в читабельном формате?
Дело в том что при получении пути к изображению что в камере что в галереи он выглядит так "content://media/external/images/media/15"
с путем такого вида для работы с битмапами вполне подходит и работает хорошо.
Но если я пытаюсь скажем переименовать файл то нечего не выходит в добавок ко всему ошибок не выдает ошибку удалось обнаружить вот этим способом
if (oldFile.renameTo(newFile)) {
Log.d("TAG", "SobitieAdd saveFile " + "no error");
} else Log.d("TAG", "SobitieAdd saveFile " + "error");
Выше я задавал такой вопрос и сам нашел на него ответ
Uri selectedImage = imageReturnedIntent.getData();
Cursor cursor = getContentResolver().query(selectedImage, null, null, null, null);
cursor.moveToFirst();
int columnIndexData = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
filePath = cursor.getString(columnIndexData);
cursor.close();
но этот метод явно не хочет работать на некоторых версиях
может есть другой способ????
Re: Урок 131. Камера. Используем системное приложение
"getData вернул null, хотя хелп обещал, что там будет путь к файлу"
А где можно почитать этот хелп?
А где можно почитать этот хелп?
Re: Урок 131. Камера. Используем системное приложение
Тут он - http://developer.android.com/guide/topi ... amera.htmlRealist писал(а):"getData вернул null, хотя хелп обещал, что там будет путь к файлу"
А где можно почитать этот хелп?
MediaStore.EXTRA_OUTPUT - This setting requires a Uri object specifying a path and file name where you'd like to save the picture. This setting is optional but strongly recommended. If you do not specify this value, the camera application saves the requested picture in the default location with a default name, specified in the returned intent's Intent.getData() field.
Re: Урок 131. Камера. Используем системное приложение
Всем привет.
Насчёт дублирования снимка (своя директория + стандартная), если кому ещё надо. Просто чтобы сэкономить ваше время.
Сразу скажу, что проконтролировать этот баг на всех девайсах невозможно и универсального решения похоже нет.
Почему это происходит.
Всё зависит от системного приложения работы с камерой. Даже если мы явно отправим ему путь для сохранения снимка, например даже вот так (вариант от httpdispatch):
системное приложение (существенное множество их разновидностей) создаст дефолтный снимок ещё и в своей дефолтной директории.
Как бы можно было это обойти.
1. Удалить дубликат снимка в onActivityResult, вытащив Uri из intent.getData().
Может не получиться по следующим причинам:
- Ещё одно множество системных приложений просто возвращает NULL в intent.getData() (по идее это нормально, если вы явно указываете MediaStore.EXTRA_OUTPUT, но возможны исключения в обе стороны).
- В intent.getData() может оказаться URI, который мы сами туда положили (то есть мы удалим не копию, а снимок из нужной нам директории).
2. На SOF часто советуют удалять последний по дате снимок из дефолтной галереи, например, вот так:
и просто выполнить этот метод в onActivityResult, когда убедимся, что нужный снимок есть в нашей директории.
Этим методом я пользоваться не советую по причине того, что очередное множество системных приложений реагирует на MediaStore.ACTION_IMAGE_CAPTURE, на удивление, так как нам надо и не создаёт в дефлтной директории копию нашего снимка. Отследить появление копии программно, в принципе, можно (проверять дату последнего файла в галерее, например), но не знаю, стоит ли на столько уродовать код.
Что же делать?
Как вариант, можно не указывать явный путь для сохранения, то есть опустить строку:
Затем вытащить uri сохранённого файла в onActivityResult, скопировать снимок из дефолтной директории в нужную и удалить оригинал. Но бывало так, что intent.getData() и в такой ситуации показывал мне NULL. То есть, может и не работать.
Я, например, не хочу больше мучиться с нативным приложением и планирую использовать кастомную обработку камеры (уроки 132-134). Это и полезнее, и можно гораздо эффективнее фиксить баги
Если кто-то нашёл универсальное решение для описанной проблемы - буду рад, если поделитесь )
Насчёт дублирования снимка (своя директория + стандартная), если кому ещё надо. Просто чтобы сэкономить ваше время.
Сразу скажу, что проконтролировать этот баг на всех девайсах невозможно и универсального решения похоже нет.
Почему это происходит.
Всё зависит от системного приложения работы с камерой. Даже если мы явно отправим ему путь для сохранения снимка, например даже вот так (вариант от httpdispatch):
Код: Выделить всё
mUploadImageFile = getNextFileName("upload_");
// this is a hack for some
// devices taken from here
// http://thanksmister.com/2012/03/16/android_null_data_camera_intent/
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE,
mUploadImageFile.getName());
values.put(MediaStore.Images.Media.DATA,
mUploadImageFile.getAbsolutePath());
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getActivity()
.getContentResolver()
.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, REQUEST_CAMERA);
Как бы можно было это обойти.
1. Удалить дубликат снимка в onActivityResult, вытащив Uri из intent.getData().
Может не получиться по следующим причинам:
- Ещё одно множество системных приложений просто возвращает NULL в intent.getData() (по идее это нормально, если вы явно указываете MediaStore.EXTRA_OUTPUT, но возможны исключения в обе стороны).
- В intent.getData() может оказаться URI, который мы сами туда положили (то есть мы удалим не копию, а снимок из нужной нам директории).
2. На SOF часто советуют удалять последний по дате снимок из дефолтной галереи, например, вот так:
Код: Выделить всё
public void deleteLastCapturedImage() {
String[] projection = {
MediaStore.Images.ImageColumns.SIZE,
MediaStore.Images.ImageColumns.DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATA,
BaseColumns._ID
};
Cursor c = null;
Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
try {
if (u != null) {
c = managedQuery(u, projection, null, null, null);
}
if ((c != null) && (c.moveToLast())) {
ContentResolver cr = getContentResolver();
int i = cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, BaseColumns._ID + "=" + c.getString(c.getColumnIndex(BaseColumns._ID)), null);
Log.v(LOG_TAG, "Number of column deleted : " + i);
}
} finally {
if (c != null) {
c.close();
}
}
}
Этим методом я пользоваться не советую по причине того, что очередное множество системных приложений реагирует на MediaStore.ACTION_IMAGE_CAPTURE, на удивление, так как нам надо и не создаёт в дефлтной директории копию нашего снимка. Отследить появление копии программно, в принципе, можно (проверять дату последнего файла в галерее, например), но не знаю, стоит ли на столько уродовать код.
Что же делать?
Как вариант, можно не указывать явный путь для сохранения, то есть опустить строку:
Код: Выделить всё
intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileUri());
Я, например, не хочу больше мучиться с нативным приложением и планирую использовать кастомную обработку камеры (уроки 132-134). Это и полезнее, и можно гораздо эффективнее фиксить баги
Если кто-то нашёл универсальное решение для описанной проблемы - буду рад, если поделитесь )
Re: Урок 131. Камера. Используем системное приложение
Может, чтобы код в onActivityResult не был таким громоздким, сначала стоит сделать проверку resultCode и intent?
Или так будет некорректно?
По поводу системного приложения камеры в эмуляторе (API19): долго не мог заставить его работать, пока не установил внешнюю вебку вместо интегрированной в ноут. Из чего делаю вывод, что проблема была с драйверами веб-камеры.
А чтобы в ImageView вставлялась полноразмерная фотка, сохранял путь к последнему созданному изображению и отображал его.
Код: Выделить всё
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
//super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (intent == null) {
Log.d(TAG, "Intent is null");
} else if (requestCode == REQUEST_CODE_PHOTO) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object data = bundle.get("data");
if (data instanceof Bitmap) {
Bitmap bitmap = (Bitmap) data;
Log.d(TAG, "bitmap " + bitmap.getWidth() + " x "
+ bitmap.getHeight());
ivPhoto.setImageBitmap(bitmap);
}
}
} else if (requestCode == REQUEST_CODE_VIDEO) {
Log.d(TAG, "Video uri: " + intent.getData());
}
} else if (resultCode == RESULT_CANCELED)
Log.d(TAG, "Result canceled");
}
По поводу системного приложения камеры в эмуляторе (API19): долго не мог заставить его работать, пока не установил внешнюю вебку вместо интегрированной в ноут. Из чего делаю вывод, что проблема была с драйверами веб-камеры.
А чтобы в ImageView вставлялась полноразмерная фотка, сохранял путь к последнему созданному изображению и отображал его.
Re: Урок 131. Камера. Используем системное приложение
FireFox 31.0 падает CSS в (только)этом уроке. В хроме нормально.
Re: Урок 131. Камера. Используем системное приложение
Хочу сделать в этом приложении кнопку "Удалить". Чтобы удаляло всё что находится в ImageView. Как бы это сделать попроще?
Re: Урок 131. Камера. Используем системное приложение
Обнуляй все свойства вручную.Novgor писал(а):Хочу сделать в этом приложении кнопку "Удалить". Чтобы удаляло всё что находится в ImageView. Как бы это сделать попроще?
void resetImage( ImageView iv ){
iv.set... null
...
}
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Урок 131. Камера. Используем системное приложение
Нужна инфа, как сделать, чтобы эту фотографию потом искало в интернете.
Re: Урок 131. Камера. Используем системное приложение
Google custom search apiNovgor писал(а):Нужна инфа, как сделать, чтобы эту фотографию потом искало в интернете.
https://developers.google.com/custom-se ... 1/overview
https://developers.google.com/apis-expl ... h.cse.list
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Урок 131. Камера. Используем системное приложение
А как мне Custom Search в приложение залепить? После создания они мне дало код в HTML.doter.ua писал(а):Google custom search apiNovgor писал(а):Нужна инфа, как сделать, чтобы эту фотографию потом искало в интернете.
https://developers.google.com/custom-se ... 1/overview
https://developers.google.com/apis-expl ... h.cse.list
И я толком не понял зачем мне 2 ссылка?
Re: Урок 131. Камера. Используем системное приложение
Для понимания нужно немного разбираться в технологиях API. В двух словах формируется запрос(url ссылка при переходе по которой вместо html кода выдается инфа в некотором формате(JSON, XML)) с параметрами среди которых теги для поиска, различные параметры (для авторизации, проверки токенов, ид приложения у разных АПИ по разному).Novgor писал(а):А как мне Custom Search в приложение залепить? После создания они мне дало код в HTML.doter.ua писал(а):Google custom search apiNovgor писал(а):Нужна инфа, как сделать, чтобы эту фотографию потом искало в интернете.
https://developers.google.com/custom-se ... 1/overview
https://developers.google.com/apis-expl ... h.cse.list
И я толком не понял зачем мне 2 ссылка?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
-
- Сообщения: 1
- Зарегистрирован: 07 сен 2018, 10:30
Re: Урок 131. Камера. Используем системное приложение
На эмуляторе сразу высыпались ошибки. Камера отсутствует!
Решил испытать на устройстве. Снимок делает но в приложении фото не показывает. Фото сохраняет не по пути приложения а в то место куда обычно сохраняет камера! Андроид 5.0.2
Может кто что посоветует!
Решил испытать на устройстве. Снимок делает но в приложении фото не показывает. Фото сохраняет не по пути приложения а в то место куда обычно сохраняет камера! Андроид 5.0.2
Может кто что посоветует!