2014-11-07 2 views
1

Я выполнил следующий ответ, чтобы сделать это. https://stackoverflow.com/a/16252917/2747591Невозможно преобразовать Zxing в портретный режим в android

Но я не получаю то, что хочу.

Изображение, снятое камерой, повернуто на 90 градусов, пока я пытаюсь выполнить сканирование. Например, если вы нажмете фотографию человека, использующего камеру, то на экране телефона появится предварительный просмотр, повернутый на 90 градусов. Но это не то, что я хочу, поскольку это затрудняет использование сканирования штрих-кода. Я хочу превью, как и должно быть. Любые идеи?

Вот мои изменения в коде

Шаг 1

В DecodeHandler.java я добавил следующий код непосредственно перед buildLuminanceSource

byte[] rotatedData = new byte[data.length]; 
for (int y = 0; y < height; y++) { 
    for (int x = 0; x < width; x++) 
     rotatedData[x * height + height - y - 1] = data[x + y * width]; 
} 
int tmp = width; // Here we are swapping, that's the difference to #11 
width = height; 
height = tmp; 
data = rotatedData; 
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height); 

Шаг 2

Измененный getFramingRectInPreview() в Camera Manager.java

rect.left = rect.left * cameraResolution.y/screenResolution.x; 
    rect.right = rect.right * cameraResolution.y/screenResolution.x; 
    rect.top = rect.top * cameraResolution.x/screenResolution.y; 
    rect.bottom = rect.bottom * cameraResolution.x/screenResolution.y; 

Шаг 3:

Отключить проверку ландшафтного режима в initFromCameraParameters (...) в CameraConfigurationManager.java

Инструкции является Удалить

if (width < height) { 
    Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect"); 
    int temp = width; 
    width = height; 
    height = temp; 
} 

Но я не нашел этот код в своем файле Cameraconfiguration. так что это не должно иметь значения, в любом случае

Шаг 4

Добавлено следующую строку, чтобы повернуть камеру в setDesiredCameraParameters (...) в CameraConfigurationManager.java только после определения параметров

camera.setDisplayOrientation(90); 

Шаг 5

Изменена ориентация CaptureActivity от пейзажа к портрету в файле манифеста приложения, подобном этому

<activity 
      android:name="com.google.zxing.client.android.CaptureActivity" 
      android:screenOrientation="portrait" 
      android:configChanges="orientation|keyboardHidden" 
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
      android:windowSoftInputMode="stateAlwaysHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="com.google.zxing.client.android.SCAN"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
    </activity> 
+0

Вы знаете, что просите клиент стоять на голове, чтобы сделать снимок трудно , так почему бы вам попросить нас сделать то же самое, чтобы помочь вам? Без вашего кода на наших головах на самом деле легче. ;) –

+0

@JeremyMiller Я выполнил ту же процедуру, что и в приведенном выше ответе, который я упомянул наверху. Это единственное изменение кода. Если вы использовали Zxing, вы бы получили его, я думаю. –

+0

У меня есть и работает, поэтому позвольте мне повернуть таблицы: если вы помогли кому-то с их кодированием, прежде чем там, где они утверждают, что это точно то же самое, вы бы получили его, я думаю. –

ответ

0

Я использовал zxing zxing 2.3 и ниже решение работало для меня.

1 В классе CameraConfigurationManager, setDesiredCameraParameters Метод добавить ниже код ниже заостренной линии

- Параметры> Camera.Parameters = камеры.getParameters();

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
     camera.setDisplayOrientation(90); 
} 

2 В классе CameraManager, getFramingRect Способ замены кода, как показано ниже

int width = MIN_FRAME_WIDTH; int height = MIN_FRAME_HEIGHT; 
if (context.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) { 
    int tmp = 7 * screenResolution.x/8; 
    width = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : (tmp);     
    tmp = 1 * screenResolution.y/3; 
    height = (tmp) < MIN_FRAME_WIDTH ? MIN_FRAME_WIDTH : ((tmp) > MAX_FRAME_HEIGHT ? MAX_FRAME_HEIGHT : (tmp)); 
}else{ 
    // Original Code 
    width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, > MAX_FRAME_WIDTH); 
    height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT); 
} 

3 В классе CameraManager, getFramingRectInPreview Способ замены кода, как показано ниже

if (context.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) { 
    rect.left = rect.left * cameraResolution.y/screenResolution.x; 
    rect.right = rect.right * cameraResolution.y/screenResolution.x; 
    rect.top = rect.top * cameraResolution.x/screenResolution.y; 
    rect.bottom = rect.bottom * cameraResolution.x/screenResolution.y; 
}else{ 
    // Original code commented 
    rect.left = rect.left * cameraResolution.x/screenResolution.x; 
    rect.right = rect.right * cameraResolution.x/screenResolution.x; 
    rect.top = rect.top * cameraResolution.y/screenResolution.y; 
    rect.bottom = rect.bottom * cameraResolution.y/screenResolution.y; 
} 

4 В классе DecodeHandler, метод декодирования добавить ниже код ниже заостренной линии

-> Resu lt rawResult = null;

if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){ 
     byte[] rotatedData = new byte[data.length]; 
     for (int y = 0; y < height; y++) { 
      for (int x = 0; x < width; x++) 
       rotatedData[x * height + height - y - 1] = data[x + y * width]; 
     } 
     data = rotatedData; 
     int tmp = width; 
     width = height; 
     height = tmp; 

    } 

Пожалуйста найти мой рабочего код

http://www.compyutech.co.in/repo/zxing-dynamic.zip

Надеется, что это поможет вам ....

+0

Я сделал все эти шары, но все же сканер находится в ландшафтном режиме только с самого начала. –

+0

@RohitGoyal Проверка на 1. версия. 2. В манифестной ориентации CaptureActivity ее не следует исправлять. 3. Попробуйте заменить файл класса с http://www.compyutech.comoj.com/repo/zxing-dynamic.zip 4. Если вы не работаете, укажите код как можно, если это возможно. – compyutech