Это хорошо документированная ошибка в некоторых версиях Android. то есть, в сборках Google для Android, захват изображений не работает, как описано в документации. то, что я обычно использовал, это что-то вроде этого в классе утилит.
public boolean hasImageCaptureBug() {
// list of known devices that have the bug
ArrayList<String> devices = new ArrayList<String>();
devices.add("android-devphone1/dream_devphone/dream");
devices.add("generic/sdk/generic");
devices.add("vodafone/vfpioneer/sapphire");
devices.add("tmobile/kila/dream");
devices.add("verizon/voles/sholes");
devices.add("google_ion/google_ion/sapphire");
return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/"
+ android.os.Build.DEVICE);
}
затем, когда я запускаю захват изображения, я создаю намерение, которое проверяет ошибку.
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (hasImageCaptureBug()) {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/tmp")));
} else {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
startActivityForResult(i, mRequestCode);
затем в деятельности, к которой я возвращаюсь, я делаю разные вещи в зависимости от устройства.
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case GlobalConstants.IMAGE_CAPTURE:
Uri u;
if (hasImageCaptureBug()) {
File fi = new File("/sdcard/tmp");
try {
u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
if (!fi.delete()) {
Log.i("logMarker", "Failed to delete " + fi);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
u = intent.getData();
}
}
это избавляет вас от необходимости писать новое приложение для камеры, но этот код тоже не очень хорош. большие проблемы
Вы никогда не получите полноразмерные изображения с устройств с ошибкой. вы получаете изображения шириной 512 пикселей, которые вставляются в контент-провайдер изображений. на устройствах без ошибок все работает как документ, вы получаете большую нормальную картинку.
Вы должны поддерживать список. как написано, устройства могут быть прошиты версией Android (скажем , сборки cyanogenmod ), в которой исправлена ошибка. если это произойдет, ваш код не работает. Исправление заключается в использовании всего отпечатка устройства.
Я знаю, что на этот вопрос уже отвечали, но я знаю, что многие люди запутались в этом, поэтому я собираюсь добавить комментарий.
У меня точно такая же проблема случилась на моем Nexus One. Это было из файла, не существующего на диске до запуска приложения камеры. Поэтому я позаботился о том, чтобы файл существовал до запуска приложения камеры. Вот пример кода, который я использовал:
Сначала я создаю уникальное (несколько) имя файла, используя хэш MD5, и помещаю его в соответствующую папку. Затем я проверяю, существует ли он (не должен, но в любом случае рекомендуется проверять). Если он не существует, я получаю родительский каталог (папку) и создаю иерархию папок до него (поэтому, если папки, ведущие к месту расположения файла, не существуют, они будут после этой строки. Затем после этого Я создаю файл. Как только файл создан, я получаю Uri и передаю его намерению, а затем кнопка ОК работает, как и ожидалось, и все это золотой.
Теперь, когда в приложении камеры нажата кнопка «ОК», файл будет находиться в указанном месте. В этом примере это будет /sdcard/Android/data/com.example.myapp/files/234asdioue23498ad.jpg
Нет необходимости копировать файл в «onActivityResult», как указано выше.
источник
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в манифесте, если вы используете более новую, чем Android 1.5 - потратил несколько часов на отладку камеры, и это не было включено, поэтому мои сохранения всегда будут неудачными.Я прошел через несколько стратегий захвата фотографий, и всегда, кажется, был случай, платформа или определенные устройства, где некоторые или все вышеперечисленные стратегии потерпят неудачу неожиданным образом. Мне удалось найти стратегию, которая использует код генерации URI ниже, который, кажется, работает в большинстве, если не во всех случаях.
Чтобы внести свой вклад в обсуждение и помочь новичкам, я создал образец / тестовое приложение, которое показывает несколько различных стратегий реализации захвата фотографий. Вклады других реализаций определенно поощряются, чтобы добавить к обсуждению.
https://github.com/deepwinter/AndroidCameraTester
источник
onActivityResult
или я действительно должен сам это запомнить? Мне пришлось бы настойчиво сохранить его, чтобы мое приложение даже запомнило его, если оно будет уничтожено во время фотосъемки ...У меня была такая же проблема, когда кнопка OK в приложении камеры ничего не делала, как на эмуляторе, так и на Nexus One.
Проблема исчезла после указания безопасного имени файла без пробелов, без специальных символов.
MediaStore.EXTRA_OUTPUT
Кроме того, если вы указываете файл, который находится в каталоге, который еще не был создан, вы должны сначала создать его. Приложение камеры не делает MKDIR для вас.источник
mkdirs()
вместо,mkdir()
если ваш путь имеет более одного уровня каталогов, и вы хотите, чтобы все они были созданы (mkdir
создает только последний, «листовой» каталог). У меня были некоторые проблемы с этим, и этот ответ помог мне.Рабочий процесс, который вы описываете, должен работать так, как вы его описали. Это может помочь, если вы покажете нам код создания Intent. В целом, следующий шаблон должен позволить вам делать то, что вы пытаетесь.
Обратите внимание, что именно Camera Activity будет создавать и сохранять файл, и на самом деле он не является частью вашего приложения, поэтому у него не будет разрешения на запись в папку вашего приложения. Чтобы сохранить файл в папке приложения, создайте временный файл на SD-карте и переместите его в папку приложения в
onActivityResult
обработчике.источник
Чтобы прокомментировать приведенный выше комментарий Йенчи, кнопка OK также ничего не сделает, если приложение камеры не может записать в каталог, о котором идет речь.
Это означает, что вы не можете создать файл в месте, доступном только для записи для вашего приложения (например, что-то в разделе «
getCacheDir())
Что-то под»).getExternalFilesDir()
должно работать).Было бы хорошо, если бы приложение камеры печатало сообщение об ошибке в журналах, если оно не могло записать по указанному
EXTRA_OUTPUT
пути, но я не нашел его.источник
чтобы камера записывала на SDCard, но сохраняла новый альбом в приложении-галерее, я использую это:
Обратите внимание, что вам нужно будет каждый раз генерировать уникальное имя файла и заменять 1111.jpg, который я написал. Это было проверено с Nexus One. URI объявлен в закрытом классе, поэтому в результате активности я могу загрузить изображение из URI в imageView для предварительного просмотра, если это необходимо.
источник
У меня была та же проблема, и я исправил ее следующим образом:
Проблема в том, что когда вы указываете файл, к которому имеет доступ только ваше приложение (например, при вызове
getFileStreamPath("file");
)Вот почему я просто убедился, что данный файл действительно существует и что КАЖДЫЙ имеет к нему доступ для записи.
Таким образом, приложение камеры имеет доступ на запись к указанному Uri, и кнопка OK работает нормально :)
источник
Я рекомендую вам следить за сообщением об обучении Android для захвата фотографии. Они показывают на примере, как делать маленькие и большие фотографии. Вы также можете скачать исходный код здесь
источник
Я создал простую библиотеку, которая будет управлять выбором изображений из разных источников (Галерея, Камера), возможно, сохранить его в каком-то месте (SD-карта или внутренняя память) и вернуть изображение обратно, поэтому, пожалуйста, используйте его и улучшайте - Android-ImageChooser ,
источник
Файл должен быть доступен для записи камерой, как указал Правин .
В моем использовании я хотел сохранить файл во внутренней памяти. Я сделал это с:
Вот
cacheFile
глобальный файл, используемый для ссылки на файл, который написан. Тогда в методе результата возвращенное намерение является нулем. Тогда метод обработки намерения выглядит так:Вот
getImageFile()
служебный метод для присвоения имени и создания файла, в котором должно храниться изображение, иcopyFile()
метод для копирования файла.источник
Вы можете использовать этот код
источник
Решить эту проблему с помощью кода результата деятельности очень просто. Попробуйте этот метод.
источник
источник