/** * Copyrights reserved to authors of this code (available from GitHub * repository https://github.com/Letme/give-me-coinsMonitoringApp * * This file is part of Give-me-coins.com Dashboard Android App * * Give-me-coins.com Dashboard is free software: you can redistribute it * and/or modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package give_me_coins.dashboard; import java.io.ByteArrayOutputStream; import com.google.zxing.BinaryBitmap; import com.google.zxing.LuminanceSource; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.QRCodeReader; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ImageFormat; import android.graphics.Rect; import android.graphics.YuvImage; import android.hardware.Camera; import android.hardware.Camera.PreviewCallback; import android.hardware.Camera.Size; import android.util.Log; import android.view.Display; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.WindowManager; import android.widget.Toast; class TerrorCam implements Callback, PreviewCallback { private static final String TAG = "QRCodeReaderCam"; private static final boolean DEBUG=true; private final SurfaceHolder oPreviewHolder; private Camera oCamera = null; private boolean inPreview = false; private boolean cameraConfigured = false; private final Activity oAct; private QRCodeReturnListener qrcl = null; void addQRCodeReturnListener(QRCodeReturnListener para_qr) { qrcl = para_qr; } interface QRCodeReturnListener { /** * packet received * @param head - function name * @param params - parameters */ void validQRcode(String QRText); } TerrorCam(SurfaceView para_prev, Activity para_act) { oPreviewHolder = para_prev.getHolder(); oAct = para_act; } private Camera.Size getBestPreviewSize( int width, int height, Camera.Parameters parameters ) { if(DEBUG) Log.d( TAG, "getBestPreviewSize" ); Camera.Size result = null; for ( Camera.Size size : parameters.getSupportedPreviewSizes() ) { if ( size.width <= width && size.height <= height ) { if ( result == null ) { result = size; } else { int resultArea = result.width * result.height; int newArea = size.width * size.height; if ( newArea > resultArea ) { result = size; } } } } return ( result ); } private void initPreview( int width, int height ) { if(DEBUG) Log.d( TAG, "initPreview " ); if ( oCamera != null && oPreviewHolder.getSurface() != null ) { try { oCamera.setPreviewDisplay( oPreviewHolder ); } catch ( Throwable t ) { Log.e( "PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t ); Toast.makeText( oAct, t.getMessage(), Toast.LENGTH_LONG ) .show(); } if ( !cameraConfigured ) { Camera.Parameters parameters = oCamera.getParameters(); Camera.Size size = getBestPreviewSize( width, height, parameters ); if ( size != null ) { parameters.setPreviewSize( size.width, size.height ); oCamera.setParameters( parameters ); /* stupid fps rates beeing stupid ... try{ parameters.setPreviewFpsRange(5000, 12000); oCamera.setParameters( parameters ); } catch(Exception e) { if(DEBUG)Log.d(TAG, "doens't like to make fps range ..."); parameters = oCamera.getParameters(); parameters.setPreviewSize(size.width, size.height); oCamera.setParameters(parameters); } */ Display display = ((WindowManager) oAct.getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); if(DEBUG)Log.d(TAG, "ORIENT"+oAct.getResources().getConfiguration().orientation ); if (oAct.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { if(DEBUG)Log.d(TAG, "ORIENTATION_PORTRAIT Rot: "+display.getRotation()); if( display.getRotation() == Surface.ROTATION_0 ) { oCamera.setDisplayOrientation(90); } else { oCamera.setDisplayOrientation(270); } } else if (oAct.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { if(DEBUG)Log.d(TAG, "ORIENTATION_LANDSCAPE Rot: "+display.getRotation()); if( display.getRotation() == Surface.ROTATION_90 ) { oCamera.setDisplayOrientation(0); } else { oCamera.setDisplayOrientation(180); } } cameraConfigured = true; } } } } void start() { if(DEBUG) Log.d( TAG, "start" ); try { oCamera = Camera.open(); } catch ( Exception e ) { // TODO Auto-generated catch block Log.e(TAG,"Camera not found"); Toast.makeText( oAct, "No Camera Found", Toast.LENGTH_LONG ).show(); return; } oPreviewHolder.addCallback( this ); oPreviewHolder.setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS ); //oPreviewHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU); startPreview(); oCamera.setPreviewCallback( this ); } void stop() { if(DEBUG) Log.d( TAG, "stop" ); if ( inPreview ) { if(DEBUG) Log.d( TAG, "stop prev" ); oCamera.stopPreview(); oCamera.setPreviewCallback( null ); } oPreviewHolder.removeCallback( this ); inPreview = false; cameraConfigured = false; if(oCamera != null) { oCamera.release(); oCamera = null; } } private void startPreview() { if ( cameraConfigured && oCamera != null ) { oCamera.startPreview(); inPreview = true; } } @Override public void onPreviewFrame( byte[] data, Camera camera ) { try { camera.autoFocus(null); // Convert to JPG Size previewSize = camera.getParameters().getPreviewSize(); YuvImage yuvimage = new YuvImage( data, ImageFormat.NV21, previewSize.width, previewSize.height, null ); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg( new Rect( 0, 0, previewSize.width, previewSize.height ), 80, baos ); byte[] jdata = baos.toByteArray(); Bitmap oBitmap = BitmapFactory.decodeByteArray( jdata, 0, jdata.length );// ,opts); LuminanceSource source = new RGBLuminanceSource( oBitmap ); BinaryBitmap oBbitmap = new BinaryBitmap( new HybridBinarizer( source ) ); //Log.d( TAG, "blubb" ); try { QRCodeReader oReader = new QRCodeReader(); String sDecoded = oReader.decode( oBbitmap ).getText(); if(DEBUG) Log.d( TAG, "TEXT: " + sDecoded ); if(qrcl != null) { qrcl.validQRcode( sDecoded ); } } catch ( Exception e1 ) { // Log.e(TAG,e1.toString()); // didnt find qrcode ... } } catch ( Exception e ) { Log.e(TAG,e.toString()); } } @Override public void surfaceCreated( SurfaceHolder holder ) { // no-op -- wait until surfaceChanged() } @Override public void surfaceChanged( SurfaceHolder holder, int format, int width, int height ) { if( cameraConfigured ) { oCamera.stopPreview(); cameraConfigured = false; } initPreview( width, height ); startPreview(); } @Override public void surfaceDestroyed( SurfaceHolder holder ) { // no-op } }