Настройка Android API камеры Android? - PullRequest
9 голосов
/ 05 июня 2010

Кто-нибудь знает, где управлять настройкой ISO для камеры в Android SDK? Это должно быть возможно, поскольку родное приложение камеры в HTC Desire имеет настройки ISO.

Ответы [ 5 ]

17 голосов
/ 08 марта 2011

Вы должны взглянуть на методы flatten(), unflatten(), get(String key), set(String key, String value) in android.hardware.Camera.Parameters. Также рассмотрим исходный код этого класса . Это может прояснить ситуацию.

Сначала вам нужно получить Camera.Parameters. Разблокируйте его до String и исследуйте его. Я также работаю на HTC Desire и получаю следующее String:

sharpness-max=30;zoom=0;taking-picture-zoom=0;zoom-supported=true;sharpness-min=0;sharpness=10;contrast=5;whitebalance=auto;jpeg-quality=100;preview-format-values=yuv420sp;jpeg-thumbnail-quality=75;preview-format=yuv420sp;preview-size=640x480;focal-length=3.53;iso=auto;meter-mode=meter-center;front-camera-mode=mirror;flash-mode-values=off,auto,on,torch;preview-frame-rate-values=15;preview-frame-rate=15;focus-mode-values=auto,infinity;jpeg-thumbnail-width=640;jpeg-thumbnail-size-values=640x480,512x384,384x288,0x0;zoom-ratios=100,114,131,151,174,200;saturation-def=5;preview-size-values=1280x720,800x480,768x432,720x480,640x480,576x432,480x320,400x240,384x288,352x288,320x240,272x272,240x240,240x160,176x144,160x120;smart-contrast=off;picture-size-values=2592x1952,2592x1456,2592x1936,2592x1728,2592x1552,2048x1536,2048x1360,2048x1216,2048x1152,1600x1200,1584x1056,1280x960,1280x848,1280x768,1280x720,1024x768,640x480,640x416,640x384,640x368,512x384,400x400,272x272;contrast-min=0;min-exposure-compensation=-4;brightness-min=0;antibanding=auto;taking-picture-zoom-min=0;saturation-min=1;contrast-max=10;vertical-view-angle=42.5;taking-picture-zoom-max=21;contrast-def=5;brightness-max=6;horizontal-view-angle=54.8;brightness=3;jpeg-thumbnail-height=480;cam-mode=0;focus-mode=auto;sharpness-def=10;front-camera-mode-values=mirror,reverse;picture-format-values=jpeg;saturation-max=10;max-exposure-compensation=4;exposure-compensation=0;exposure-compensation-step=0.5;flash-mode=off;effect-values=none,mono,negative,solarize,sepia,posterize,aqua;meter-mode-values=meter-average,meter-center,meter-spot;picture-size=2592x1952;max-zoom=5;effect=none;saturation=5;whitebalance-values=auto,incandescent,fluorescent,daylight,cloudy-daylight;picture-format=jpeg;brightness-def=3;iso-values=auto,deblur,100,200,400,800,1250;enable-caf=off;antibanding-values=off,50hz,60hz,auto

Таким образом, в основном есть ключ iso-values для извлечения поддерживаемых значений и ключ iso, который содержит текущее значение.

Вы можете сделать следующее:

Camera cam = Camera.open();
Camera.Parameters camParams = cam.getParameters();
String supportedIsoValues = camParams.get("iso-values"); //supported values, comma separated String
camParams.set("iso", (String)newValue);
cam.setParameters(camParams);

А что касается параметров без привязки, я бы предположил, что между настройками iso и компенсацией экспозиции есть разница.

9 голосов
/ 09 мая 2014

К настоящему времени (KK 4.4.2) Android не имеет официальных API для управления ISO.
Управление ISO полностью зависит от устройства, и 8/18 устройств, которые я тестировал до сих пор, вообще не поддерживают настройки ISO.
Исследуйте строку Camera.getParameters().flatten(), чтобы проверить действительные ключевые слова, каждое устройство может использовать разные ключевые слова !!
Большинство устройств используют ключевое слово «iso-values» для определения списка возможных значений, разделенных запятыми, для использования с ключевым словом «iso», например:

param.set("iso", valid_value_from_list);

Некоторые другие устройства используют ключевые слова "iso-mode-values" и "iso" (Galaxy Nexus).
Я также нашел устройство, которое использует «значения изо-скорости» и «изо-скорость» (Micromax A101).
Еще одна вещь, которая меня огорчает, это «nv-picture-iso-values» -> «nv-picture-iso» (LG dual P990).

Следуйте szia ответ о том, как использовать эти ключевые слова.

Вот некоторый код, который я использую, чтобы получить список допустимых значений, используя известные ключевые слова:

String flat = param.flatten();
String[] isoValues = null;
String values_keyword=null;
String iso_keyword=null;
if(flat.contains("iso-values")) {
    // most used keywords
    values_keyword="iso-values";
    iso_keyword="iso";
} else if(flat.contains("iso-mode-values")) {
    // google galaxy nexus keywords
    values_keyword="iso-mode-values";
    iso_keyword="iso";
} else if(flat.contains("iso-speed-values")) {
    // micromax a101 keywords
    values_keyword="iso-speed-values";
    iso_keyword="iso-speed";
} else if(flat.contains("nv-picture-iso-values")) {
    // LG dual p990 keywords
    values_keyword="nv-picture-iso-values";
    iso_keyword="nv-picture-iso";
}
// add other eventual keywords here...
if(iso_keyword!=null) {
    // flatten contains the iso key!!
    String iso = flat.substring(flat.indexOf(values_keyword));
    iso = iso.substring(iso.indexOf("=")+1);

    if(iso.contains(";")) iso = iso.substring(0, iso.indexOf(";"));

    isoValues = iso.split(",");

} else {
    // iso not supported in a known way
}
5 голосов
/ 01 июня 2016

, так как у меня была та же проблема с определением, имеет ли устройство параметр ISO, я посмотрел на этот ответ https://stackoverflow.com/a/23567103/3976589 и увидел, что @jc решил проблему для устройств 8/18, перечислив некоторые параметры, которыеон нашел на разных устройствах.На основании этого списка я обнаружил, что каждый параметр содержит слова iso и values ( иногда только эти слова, иногда что-то дополнительное ).

Так что, если я перечислю все камерыПараметры и поиск строки, содержащей оба слова. Я буду знать, как называется параметр ISO, если он существует.Кроме того, если параметр существует, я могу принять поддерживаемые значения ISO, и если я хочу установить одно из этих значений, т.е. изменить параметр камеры, я могу просто удалить -values в конце параметра iso-values, а затемможет успешно изменить значение ISO.

Теперь я поделюсь своим кодом для этой задачи.Сначала фрагмент, который извлекает список с поддерживаемыми значениями ISO.

    private String ISOValuesParameter = null;
    private String ISOParameter = null;
    private String ISOValues = null;


    private void initCamera() {
        Camera mCamera = Camera.open();

        // this will list supported values
        String ISOvalues = getISOValues(); 
        textViewISO = (TextView) findViewById(R.id.viewISO);
        textViewISO.setText(ISOvalues);

    // setting Minimum ISO value
    if(ISOValuesParameter != null) {
        Camera.Parameters params = mCamera.getParameters();

        ISOParameter = ISOValuesParameter.replace("-values", "");
        params.set(ISOParameter, getMinISO());

        mCamera.setParameters(params);

        // get the updated ISO value
        params = mCamera.getParameters();

        String ISO = params.get(ISOParameter);

        Toast.makeText(this,"ISO set to: " + ISO, Toast.LENGTH_SHORT).show();
    }

    }

    // returns a list with supported ISO values
    private String getISOValues() {
            ISOValuesParamter = getISOValuesParameter();
            Camera.Parameters params = mCamera.getParameters();
            ISOValues = params.get(ISOValuesParamter);

            return ISOValues!=null ? ISOValues : "ISO not supported";
    }

    // this will return the name of the ISO parameter containing supported ISO values
    private String getISOValuesParameter() {
            Camera.Parameters params = mCamera.getParameters();

            String flatten = params.flatten();
            String[] paramsSeparated = flatten.split(";");
            for(String cur : paramsSeparated) {
                if(cur.contains("iso") && cur.contains("values")) {
                    return cur.substring(0,cur.indexOf('='));
                }
            }

            return null;
    }

В этом фрагменте перечислены только поддерживаемые значения ISO.В моем приложении мне нужно было выбрать самый низкий ISO.Вот мое решение:

private String getMinISO() {
    if(ISOValues == null) {
        return null;
    }

    String[] ISOarray = ISOValues.split(",");
    Arrays.sort(ISOarray, myComparator);

    String minISO = ISOarray[ISOarray.length-1];

    return minISO;
}

Здесь myComparator - это класс, который сравнивает две строки и сортирует массив в порядке убывания.Все алфавитные слова в начале, а все цифры в конце.Вот моя реализация:

// Singelton class
public class MyComparator implements  Comparator<String> {

private static MyComparator myComparator = null;

private MyComparator() {}

@Override
public int compare(String a, String b) {
    return compareString(a,b);
}

public static int compareString(String a, String b) {
    if (a.length() > b.length())
        return -1;
    if (a.length() == b.length()) {
        if (a.compareTo(b) > 0)
            return -1;
        else if (a.compareTo(b) == 0)
            return 0;
    }

    return 1;
}

public static synchronized MyComparator getInstance() {
    if(myComparator==null) {
        myComparator = new MyComparator();
    }

    return myComparator;
}

}

Надеюсь, мой ответ поможет другим людям.:)

Ура!@ Ee3509

4 голосов
/ 04 декабря 2012

szias ответ правильный.

Только

String supportedIsoValues = camParams.get("iso-values"); 

возвращает ноль на некоторых устройствах.

Тем не менее вы можете установить iso с помощью

Camera cam = Camera.open();
Camera.Parameters camParams = cam.getParameters();
camParams.set("iso", "400"); // values can be "auto", "100", "200", "400", "800", "1600"
cam.setParameters(camParams);

Я не знаю, поддерживается ли "800" или "1600" на всех устройствах

Вы можете проверить, что вы сделали с помощью

String newVAlue = camParams.get("iso");
1 голос
/ 05 июня 2010

Простите мое невежество, но как это отличается от «компенсации экспозиции», установленной через setExposureCompensation ()? Википедия содержит некоторые формулы преобразования, которые могут оказаться полезными.

...