Android Zxingスキャンバーコード縦画面モードカメラcamera 90度回転


最近バーコードスキャンに関するソフトウェアを作っていますが、スキャンが必要なときは縦画面です.最後にzxing公式wikiで解決策を見つけた.基本的な考え方は以下の通りです.There are 4 relative files: 1, manifest.xml, you need to make CaptureActivity portrait.
2, DecodeHandler.java, rotate data before buildLuminanceSource, it works becuase in YCbCr_420_SP and YCbCr_422_SP, the Y channel is planar and appears first
フラットパネルビュー
印刷?1 byte [] rotatedData = new byte [data.length]; 2 for ( int y = 0 ; y < height; y++) { 3      for ( int x = 0 ; x < width; x++) 4          rotatedData[x * height + height - y - 1 ] = data[x + y * width]; 5 }
3, CameraManager.java, getFramingRectInPreview() need to be modified.
フラットパネルビュー
印刷?1 rect.left = rect.left * cameraResolution.y / screenResolution.x; 2 rect.right = rect.right * cameraResolution.y / screenResolution.x; 3 rect.top = rect.top * cameraResolution.x / screenResolution.y; 4 rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
4, CameraConfigurationManager.java, set camera orientation to portrait in setDesiredCameraParameters() use
フラットパネルビュー
印刷?1 parameters.set( "orientation" , "portrait" );
注:バージョン互換性は以下を参照してください.and in getCameraResolution(), you need to swap x and y, because camera preview size is something like 480*320, other than 320*480.
フラットパネルビュー
印刷?1 int tmp = cameraResolution.x; 2 cameraResolution.x = cameraResolution.y; 3 cameraResolution.y = tmp; 4 return cameraResolution;
説明:カメラが90度回転する場合、sdkバージョンによって方法が異なります.互換性の方法は次のとおりです(ファイル:CameraConfigurationmanager.java)
フラットパネルビュー
印刷?01 if (Integer.parseInt(Build.VERSION.SDK) >= <IMG class =wp-smiley alt= 8 ) src= "http://www.andcoder.com/wp-includes/images/smilies/icon_cool.gif" > 02     setDisplayOrientation(camera, 90 ); 03    else { 04     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 05      parameters.set( "orientation" , "portrait" ); 06      parameters.set( "rotation" , 90 ); 07     } 08     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 09      parameters.set( "orientation" , "landscape" ); 10      parameters.set( "rotation" , 90 ); 11     } 12 } 13     14 protected void setDisplayOrientation(Camera camera, int angle) { 15    Method downPolymorphic; 16    try { 17     downPolymorphic = camera.getClass().getMethod( 18       "setDisplayOrientation" , new Class[] { int . class }); 19     if (downPolymorphic != null ) 20      downPolymorphic.invoke(camera, new Object[] { angle }); 21    } catch (Exception e1) { 22    } 23   }