Мною было замечено, что в ванильном андроиде (в отличии от, например, правильного в этом плане Галереи от Sense) формат хранения файлов фотографий не соответствует спецификациям, которые требуют хранить фотографии с адресом по шаблону /DCIM/123ABCD/ABCD1234.jpg, андроид же (2.3 в том числе) делает пути вида /DCIM/Camera/IMG_<дата>_<время>.jpg, что не совпадает со стандартом, из-за чего iPhoto не видит контента для импорта.
Кстати, этот дефект опубликован в основном баг-трекере от 11.06.2009, но у него очень мало голосов, поэтому он успешно игнорируется. Если вы заинтересованы в его решении, не поленитесь также поставить звёздочку
Поехали!
Что ж, система открытая — решено исправить. Синхронизируем источники, открываем редактор, импортируем готовый проект и начинаем править. Внести требуется лишь три изменения: путь до фотографий, шаблон имени для фотографий, шаблон имени для видеозаписей. Не отвлекаясь на посторонние темы, даю код для замены:
// 1) com.android.camera.ImageManager.java:129 public static final String CAMERA_IMAGE_BUCKET_NAME = Environment.getExternalStorageDirectory().toString() + "/DCIM/100ANDRO"; //2) com.android.camera.Camera.java:871 private String createName(long dateTaken) { int n = 1, max = 0; for(File file: // go through all jpg's new File(ImageManager.CAMERA_IMAGE_BUCKET_NAME).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return filename.toLowerCase().endsWith(".jpg"); } }) ){ try{ // try to search maximum n = Integer.parseInt(file.getName().substring(4, 8)); if(n>max) max = n; }catch (Exception ignored) { } } return String.format("IMAG%04d", max+1); } //3) com.android.camera.VideoCamera.java:252 private String createName(long dateTaken) { int n = 1, max = 0; for(File file: // go through all 3gp's new File(ImageManager.CAMERA_IMAGE_BUCKET_NAME).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return filename.toLowerCase().endsWith(".3gp"); } }) ){ try{ // try to search maximum n = Integer.parseInt(file.getName().substring(5, 9)); if(n>max) max = n; }catch (Exception ignored) { } } return String.format("VIDEO%04d", max+1); }
Чтобы заменить системный пакет на устройстве, необходимо либо удалить оригинал, либо сделать вид, что мы обновляем пакет, положив пакет в /data/app/com.android.camera-1.apk, тогда система будет использовать «новый» пакет. Даю ссылки на исходные коды (из репозитория AOSP) и собранный мной бинарник (подписан дебаг-сертификатом):
Исходники (590кб) Бинарник (541кб)
Финальный штрих:
Чтобы теперь и Галерея начала распознавать нашу папку 100ANDRO как папку хранения фотографий и корректно сортировала файлы в ней (в обратном порядке, сначала свежие файлы), нужно поправить и её, благо исходный код также доступен, а исправлений буквально пара:
// 1) com.cooliris.media.ImageManager.java:61 public static final String CAMERA_IMAGE_BUCKET_NAME = Environment.getExternalStorageDirectory().toString() + "/DCIM/100ANDRO"; // 2) com.cooliris.media.LocalDataSource.java:46 public static final String CAMERA_STRING = "100ANDRO";
Также, коды и результат:
Исходники (938кб) Бинарник (680кб)
3 comments