バーコードを読み取るために、カメラ ビューによって生成されたすべてのフレームを処理する必要があります。
私は HTC Sensation を使用しています (テストするための別の電話をまだ持っていません)
だから私は getSupportedPreviewSizes を呼び出して、使用できる最適な解像度を選択しました。
1920,1088年
1280,720
960,544
800,480
720,480
640,480
640,368
480,320
352,288
320,240
176,144
ただし、640x480 のみが機能します :(
私が使用する場合:
parameters.setPreviewSize(800 , 600);
また
parameters.setPreviewSize(960 , 544);
また
parameters.setPreviewSize(1280 , 720);
次に、取得した画像が取り除かれます。ここに例を示します。
プレビュー サイズとして 3264x1840 または 2592x1456 を使用しても効果はなく、生成された画像のサイズは 640x480 のままです。
プレビュー サイズとして 1920x1088 を設定すると、アプリを自動的に再起動するという致命的なエラーが発生します。
0x417db2d9 (コード = 2) の致命的なシグナル 11 (SIGSEGV)
参考までに、 onPreviewFrame の本文をコピーして貼り付けます。
public void onPreviewFrame(byte[] data, Camera camera)
{
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
Parameters parameters = camera.getParameters();
YuvImage image = new YuvImage(data , parameters.getPreviewFormat(), width , height , null);
String resultText = "";
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0 , 0 , image.getWidth() , image.getHeight()), 100, baos);
// Convertie YUV TO BITMAP
Bitmap bitmap = BitmapFactory.decodeByteArray( baos.toByteArray(), 0, baos.size());
FileOutputStream outStream = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.close();
outStream.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
}
コールバック buffer のコードを含む surfaceChanged 関数のコードで投稿を更新します。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
try
{
Parameters parameters = camera.getParameters();
// parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); // ACTIVE FLASH SI NECESSAIRE
// parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO ); // ACTIVE AUTOFOCURS
// parameters.setSceneMode(Camera.Parameters.SCENE_MODE_STEADYPHOTO);
String focusMode = Utils.findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO, Camera.Parameters.FOCUS_MODE_MACRO);
if (focusMode != null)
{
parameters.setFocusMode(focusMode);
}
Log.e(TAG , "PREVIEWS : ");
List<Size> previews = parameters.getSupportedPreviewSizes();
for(int i = 0 ; i < previews.size() ; i++)
{
Log.e(TAG , i + " : " + previews.get(i).width + "," + previews.get(i).height);
}
Log.e(TAG , "PICTURES : ");
List<Size> pictures = parameters.getSupportedPictureSizes();
for(int i = 0 ; i < pictures.size() ; i++)
{
Log.e(TAG , i + " : " + pictures.get(i).width + "," + pictures.get(i).height);
}
Size preview = previews.get(1);
parameters.getSupportedPictureSizes();
// parameters.setPreviewSize(preview.width , preview.height);
// Camera.Size size = getBestPreviewSize(width, height);
parameters.setPictureSize(1280 , 720);
parameters.setPreviewSize(1280 , 720);
camera.setParameters(parameters);
// camera.setDisplayOrientation(90);
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
camera.startPreview();
camera.autoFocus(autoFocusCallback);
///////////////////////////////////////////////////////////
int imgformat = parameters.getPreviewFormat();
int bitsperpixel = ImageFormat.getBitsPerPixel(imgformat);
Camera.Size camerasize = parameters.getPreviewSize();
int frame_size = ((camerasize.width * camerasize.height) * bitsperpixel) / 8;
byte[] buffer = new byte[frame_size];
camera.addCallbackBuffer(buffer);
}
catch (Exception e)
{
e.printStackTrace();
}
}
しかし、コールバック バッファを使用しても問題は残り、画像が剥がれます。
私は何か間違ったことをしましたか?
ありがとう