Huda, Arif Akbarul. 2013. 9 Aplikasi Android Buatan Sendiri. Yogyakarta: Andi.
Juhara, Zamrony P. 2016. Panduan Lengkap Pemograman Android. Yogyakarta:
Penerbit Andi.
Safaat, Nazaruddin. 2011. Android Pemograman Aplikasi Mobile Smartphone dan Tablet PC, Bandung: Informatika.
Sofyana, Iwan. 2006. Mudah Menguasai Jbuilder Enterprise. Bandung: Informatika.
Widiarta, Wisnu. 2007. Dari Paskal ke Java. Bandung: Informatika.
Hariyanto, Bambang, Ir, Mt (2004), Rekayasa Sistem Berorientasi Obyek, Informatika Bandung, Bandung.
Rickyanto, Isak (2003), Dasar Pemrograman Berorientasi Objek dengan Java 2:
JDK 1.4, Andi Offset, Yogyakarta.
LAMPIRAN PROGRAM
splash_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android
"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="36dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/logo_color" />
</android.support.constraint.ConstraintLayout>
ocr_capture.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android
"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<com.ocrtranslator.libs.ui.camera.CameraSourcePreview android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.ocrtranslator.libs.ui.camera.GraphicOverlay android:id="@+id/graphicOverlay"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.ocrtranslator.libs.ui.camera.CameraSourcePreview>
<android.support.v7.widget.Toolbar android:id="@+id/toolbar2"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_margin="0dp"
android:background="@color/darkBackground"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:contentInsetEnd="0dp"
app:contentInsetEndWithActions="0dp"
app:contentInsetLeft="0dp"
app:contentInsetRight="0dp"
app:contentInsetStart="0dp"
app:contentInsetStartWithNavigation="0dp">
<android.support.constraint.ConstraintLayout android:layout_width="match_parent"
android:layout_height="0dp"
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.Toolbar>
<ImageView
android:id="@+id/imageView2"
android:layout_width="200dp"
android:layout_height="200dp"
android:tint="@color/colorPrimaryDark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_scan" />
<TextView
android:id="@+id/textView11"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/darkBackground"
android:gravity="center"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Scan text here"
android:textColor="@color/custom1"
android:textSize="16sp"
android:textStyle="italic"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</android.support.constraint.ConstraintLayout>
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.constraint.ConstraintLayout android:layout_width="match_parent"
android:layout_height="64dp"
android:background="@color/colorPrimary"
android:paddingStart="24dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
</android.support.constraint.ConstraintLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp">
<LinearLayout
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/titleDialog"
android:gravity="start"
android:padding="5dp"
/>
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="36dp">
<android.support.constraint.ConstraintLayout android:layout_width="match_parent"
android:layout_height="64dp"
android:background="@color/colorPrimary"
android:paddingStart="24dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_arrow" />
</android.support.constraint.ConstraintLayout>
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_gravity="center"
android:layout_marginTop="36dp"
android:layout_marginBottom="10dp"
android:adjustViewBounds="true"
app:srcCompat="@drawable/logo_color" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Version 1.0 - October 2018" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="24dp"
android:layout_marginBottom="8dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="24dp"
android:gravity="center"
android:text="152406109" />
<TextView
android:id="@+id/textView9"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="Universitas Sumatera Utara"
android:textStyle="bold" />
<TextView
android:id="@+id/textView6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="[email protected]" />
<TextView
android:id="@+id/textView8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="081343200695" />
</LinearLayout>
SplashActivity.java
package com.ocrtranslator.libs.ui;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import com.ocrtranslator.OcrCaptureActivity;
import com.ocrtranslator.R;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.splash_layout);
new Handler().postDelayed(new Runnable() {
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;
public DownloadImageTask(ImageView imageView) { this.imageView = imageView;
package com.ocrtranslator;
android.hardware.Camera.Parameters.FLASH_MODE_TORCH;
import static
android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_
VIDEO;
public final class OcrCaptureActivity extends AppCompatActivity {
private static final String TAG =
"OcrCaptureActivity";
private static final int RC_HANDLE_GMS = 9001;
private static final int RC_HANDLE_CAMERA_PERM = 2;
public static final String AutoFocus = "AutoFocus";
public static final String UseFlash = "UseFlash";
public static final String TextBlockObject =
"String";
private CameraSource cameraSource;
private CameraSourcePreview preview;
private GraphicOverlay<OcrGraphic> graphicOverlay;
private ScaleGestureDetector scaleGestureDetector;
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle bundle) { super.onCreate(bundle);
setContentView(R.layout.ocr_capture);
preview = findViewById(R.id.preview);
graphicOverlay =
findViewById(R.id.graphicOverlay);
boolean autoFocus = true;
boolean useFlash = false;
int rc = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (rc == PackageManager.PERMISSION_GRANTED) { createCameraSource(autoFocus, useFlash);
} else {
requestCameraPermission();
}
gestureDetector = new GestureDetector(this, new CaptureGestureListener());
scaleGestureDetector = new
about.setContentView(R.layout.about_layout);
btBackAbout.setOnClickListener(new View.OnClickListener() {
} }
@Override
public boolean onTouchEvent(MotionEvent e) {
boolean b = scaleGestureDetector.onTouchEvent(e);
boolean c = gestureDetector.onTouchEvent(e);
return b || c || super.onTouchEvent(e);
}
@SuppressLint("InlinedApi")
private void createCameraSource(boolean autoFocus, boolean useFlash) {
public void onRequestPermissionsResult(int requestCode,
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
return;
}
if (grantResults.length != 0 && grantResults[0]
> 0 ? grantResults[0] : "(empty)"));
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
builder.setTitle("Multitracker sample")
.setMessage(R.string.no_camera_permission)
.setPositiveButton(R.string.ok, listener) .show();
}
private void startCameraSource() throws SecurityException {
dlg.show();
Dialog translationDialog;
HashMap<String, String> map;
private String lang;
private void translationDialog(String inputText) {
translationDialog = new Dialog(this);
translationDialog.setContentView(R.layout.translate_layou t);
translationDialog.getWindow().setLayout(ViewGroup.LayoutP arams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
translationDialog.setCancelable(false);
translationDialog.show();
map = new HashMap<>();
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>
adapterView, View view, int i, long l) { String item =
View.OnClickListener() {
private void showTranslation(String result) { EditText etResult =
translationDialog.findViewById(R.id.etResult);
etResult.setText(result);
}
private void translate(final String inputText, final
protected Map<String, String> getParams() {
private class CaptureGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return onTap(e.getRawX(), e.getRawY()) ||
super.onSingleTapConfirmed(e);
} }
private class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener { @Override
public boolean onScale(ScaleGestureDetector detector) {
return false;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
} }
OcrGraphic.java
package com.ocrtranslator.libs.ui;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import com.ocrtranslator.libs.ui.camera.GraphicOverlay;
import com.google.android.gms.vision.text.TextBlock;
public class OcrGraphic extends GraphicOverlay.Graphic { private int id;
private static final int TEXT_COLOR = Color.WHITE;
private static Paint rectPaint;
private static Paint textPaint;
private final TextBlock text;
OcrGraphic(GraphicOverlay overlay, TextBlock text) { super(overlay);
this.text = text;
if (rectPaint == null) { rectPaint = new Paint();
rectPaint.setColor(TEXT_COLOR);
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(4.0f);
}
if (textPaint == null) { textPaint = new Paint();
textPaint.setColor(TEXT_COLOR);
textPaint.setTextSize(54.0f);
}
postInvalidate();
}
public int getId() { return id;
}
public void setId(int id) { this.id = id;
}
public TextBlock getTextBlock() { return text;
}
public boolean contains(float x, float y) {
TODO: Check if this graphic's text contains this point.
if (text == null) { return false;
}
RectF rect = new RectF(text.getBoundingBox());
rect = translateRect(rect);
return rect.contains(x, y);
}
@Override
public void draw(Canvas canvas) {
TODO: Draw the text onto the canvas.
if (text == null) { return;
}
RectF rect = new RectF(text.getBoundingBox());
rect = translateRect(rect);
canvas.drawRect(rect, rectPaint);
} }
OcrDetectorProcessor.java
package com.ocrtranslator.libs.ui;
import android.util.Log;
import android.util.SparseArray;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.text.TextBlock;
import com.ocrtranslator.libs.ui.camera.GraphicOverlay;
TODO: Make this implement Detector.Processor<TextBlock>
and add text to the GraphicOverlay
public class OcrDetectorProcessor implements Detector.Processor<TextBlock> {
private GraphicOverlay<OcrGraphic> graphicOverlay;
public
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import com.google.android.gms.vision.CameraSource;
import java.util.HashSet;
import java.util.Set;
public class GraphicOverlay<T extends GraphicOverlay.Graphic> extends View {
private final Object lock = new Object();
private int previewWidth;
private float widthScaleFactor = 1.0f;
private int previewHeight;
private float heightScaleFactor = 1.0f;
private int facing = CameraSource.CAMERA_FACING_BACK;
private Set<T> graphics = new HashSet<>();
public static abstract class Graphic { private GraphicOverlay mOverlay;
public Graphic(GraphicOverlay overlay) { mOverlay = overlay;
}
public abstract void draw(Canvas canvas);
public abstract boolean contains(float x, float y);
public float scaleX(float horizontal) { return horizontal *
mOverlay.widthScaleFactor;
}
public float scaleY(float vertical) {
return vertical * mOverlay.heightScaleFactor;
}
public float translateX(float x) { if (mOverlay.facing ==
CameraSource.CAMERA_FACING_FRONT) {
return mOverlay.getWidth() - scaleX(x);
} else {
return scaleX(x);
}
public GraphicOverlay(Context context, AttributeSet attrs) {
}
public T getGraphicAtLocation(float rawX, float rawY) {
synchronized (lock) {
// Get the position of this View so the raw location can be offset relative to the view.
int[] location = new int[2];
public void setCameraInfo(int previewWidth, int previewHeight, int facing) {
protected void onDraw(Canvas canvas) { super.onDraw(canvas);
CameraSourcePreview.java
package com.ocrtranslator.libs.ui.camera;
import android.Manifest;
import android.content.Context;
import android.content.res.Configuration;
import android.support.annotation.RequiresPermission;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.ViewGroup;
import com.google.android.gms.common.images.Size;
import java.io.IOException;
public class CameraSourcePreview extends ViewGroup { private static final String TAG =
"CameraSourcePreview";
private Context context;
private SurfaceView surfaceView;
private boolean startRequested;
private boolean surfaceAvailable;
private CameraSource cameraSource;
private GraphicOverlay overlay;
public CameraSourcePreview(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
startRequested = false;
surfaceAvailable = false;
surfaceView = new SurfaceView(context);
surfaceView.getHolder().addCallback(new SurfaceCallback());
addView(surfaceView);
}
@RequiresPermission(Manifest.permission.CAMERA) public void start(CameraSource cameraSource) throws IOException, SecurityException {
if (cameraSource == null) { stop();
}
this.cameraSource = cameraSource;
@RequiresPermission(Manifest.permission.CAMERA) public void start(CameraSource cameraSource, GraphicOverlay overlay) throws IOException,
@RequiresPermission(Manifest.permission.CAMERA) private void startIfReady() throws IOException, SecurityException {
}
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder surface) {
public void surfaceDestroyed(SurfaceHolder surface) {
surfaceAvailable = false;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
} }
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if (isPortraitMode()) {
private boolean isPortraitMode() { int orientation =
context.getResources().getConfiguration().orientation;
if (orientation ==
Configuration.ORIENTATION_LANDSCAPE) { return false;
}
if (orientation ==
Configuration.ORIENTATION_PORTRAIT) { return true;
}
Log.d(TAG, "isPortraitMode returning false by default");
return false;
} }
CameraSource.java
package com.ocrtranslator.libs.ui.camera;
@SuppressWarnings("deprecation") public class CameraSource {
@SuppressLint("InlinedApi")
public static final int CAMERA_FACING_BACK = CameraInfo.CAMERA_FACING_BACK;
@SuppressLint("InlinedApi")
public static final int CAMERA_FACING_FRONT = CameraInfo.CAMERA_FACING_FRONT;
private static final String TAG = "OpenCameraSource";
private static final int DUMMY_TEXTURE_NAME = 100;
private static final float ASPECT_RATIO_TOLERANCE = 0.01f;
@StringDef({
Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO, Camera.Parameters.FOCUS_MODE_AUTO,
Camera.Parameters.FOCUS_MODE_EDOF, Camera.Parameters.FOCUS_MODE_FIXED, Camera.Parameters.FOCUS_MODE_INFINITY, Camera.Parameters.FOCUS_MODE_MACRO })
@Retention(RetentionPolicy.SOURCE) private @interface FocusMode {}
@StringDef({
Camera.Parameters.FLASH_MODE_ON, Camera.Parameters.FLASH_MODE_OFF, Camera.Parameters.FLASH_MODE_AUTO, Camera.Parameters.FLASH_MODE_RED_EYE, Camera.Parameters.FLASH_MODE_TORCH })
@Retention(RetentionPolicy.SOURCE) private @interface FlashMode {}
private Context context;
private final Object cameraLock = new Object();
private Camera camera;
private int mFacing = CAMERA_FACING_BACK;
private int rotation;
private Size previewSize;
private float requestedFps = 30.0f;
private int requestedPreviewWidth = 1024;
private int requestedPreviewHeight = 768;
private String focusMode = null;
private String flashMode = null;
private SurfaceView dummySurfaceView;
private SurfaceTexture dummySurfaceTexture;
private Thread processingThread;
private FrameProcessingRunnable frameProcessor;
private Map<byte[], ByteBuffer> bytesToByteBuffer = new HashMap<>();
public static class Builder {
private final Detector<?> detector;
private CameraSource cameraSource = new CameraSource();
public Builder(Context context, Detector<?>
detector) {
IllegalArgumentException("Invalid fps: " + fps);
}
cameraSource.requestedFps = fps;
return this;
}
public Builder setFocusMode(@FocusMode String mode) {
cameraSource.focusMode = mode;
return this;
}
public Builder setFlashMode(@FlashMode String mode) {
cameraSource.flashMode = mode;
return this;
}
public Builder
setRequestedPreviewSize(int width, int height) { final int MAX = 1000000;
if ((width <= 0) || (width > MAX) || (height
<= 0) || (height > MAX)) { throw new
IllegalArgumentException("Invalid preview size: " + width + "x" + height);
}
cameraSource.requestedPreviewWidth = width;
IllegalArgumentException("Invalid camera: " + facing);
}
public interface ShutterCallback { void onShutter();
}
public interface PictureCallback { void onPictureTaken(byte[] data);
}
public interface AutoFocusCallback { void onAutoFocus(boolean success);
}
public interface AutoFocusMoveCallback { void onAutoFocusMoving(boolean start);
@RequiresPermission(Manifest.permission.CAMERA) public CameraSource start() throws IOException { synchronized (cameraLock) {
if (camera != null) {
return this;
@RequiresPermission(Manifest.permission.CAMERA) public CameraSource start(SurfaceHolder
surfaceHolder) throws IOException {
frameProcessor.setActive(false);
return 0;
public void takePicture(ShutterCallback shutter, PictureCallback jpeg) {
@Nullable @FocusMode
public String getFocusMode() { return focusMode;
}
public boolean setFocusMode(@FocusMode String mode) { synchronized (cameraLock) {
public boolean setFlashMode(@FlashMode String mode) { synchronized (cameraLock) {
public void autoFocus(@Nullable AutoFocusCallback cb)
{
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public boolean setAutoFocusMoveCallback(@Nullable AutoFocusMoveCallback cb) {
}
private class PictureStartCallback implements Camera.ShutterCallback {
private class PictureDoneCallback implements Camera.PictureCallback {
private class CameraAutoFocusCallback implements Camera.AutoFocusCallback {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private class CameraAutoFocusMoveCallback implements Camera.AutoFocusMoveCallback {
private AutoFocusMoveCallback mDelegate;
@Override
public void onAutoFocusMoving(boolean start, Camera camera) {
@SuppressLint("InlinedApi") private Camera createCamera() {
Camera camera = Camera.open(requestedCameraId);
SizePair sizePair = selectSizePair(camera, suitable preview frames per second range.");
}
parameters.setPreviewSize(previewSize.getWidth(), previewSize.getHeight());
parameters.setPreviewFpsRange(
previewFpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
previewFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX])
;
parameters.setPreviewFormat(ImageFormat.NV21);
setRotation(camera, parameters,
camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback());
camera.addCallbackBuffer(createPreviewBuffer(previewSize) );
camera.addCallbackBuffer(createPreviewBuffer(previewSize)
private static int getIdForRequestedCamera(int facing) {
private static SizePair selectSizePair(Camera camera, int desiredWidth, int desiredHeight) {
List<SizePair> validPreviewSizes =
private Size mPicture;
public SizePair(android.hardware.Camera.Size previewSize,
private static List<SizePair>
generateValidPreviewSizeList(Camera camera) { Camera.Parameters parameters =
camera.getParameters();
List<android.hardware.Camera.Size>
supportedPreviewSizes =
parameters.getSupportedPreviewSizes();
List<android.hardware.Camera.Size>
supportedPictureSizes =
parameters.getSupportedPictureSizes();
List<SizePair> validPreviewSizes = new ArrayList<>();
for (android.hardware.Camera.Size previewSize : supportedPreviewSizes) {
break; that we shouldn't set a picture size.
validPreviewSizes.add(new
private int[] selectPreviewFpsRange(Camera camera, float desiredPreviewFps) {
private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) { WindowManager windowManager =
(WindowManager)
context.getSystemService(Context.WINDOW_SERVICE);
Camera.getCameraInfo(cameraId, cameraInfo);
int angle;
camera.setDisplayOrientation(displayAngle);
parameters.setRotation(angle);
}
private byte[] createPreviewBuffer(Size previewSize) { int bitsPerPixel =
ImageFormat.getBitsPerPixel(ImageFormat.NV21);
ByteBuffer buffer = ByteBuffer.wrap(byteArray);
if (!buffer.hasArray() || (buffer.array() !=
byteArray)) {
throw new IllegalStateException("Failed to create valid buffer for camera source.");
}
bytesToByteBuffer.put(byteArray, buffer);
return byteArray;
}
private class CameraPreviewCallback implements Camera.PreviewCallback {
private class FrameProcessingRunnable implements Runnable {
private Detector<?> mDetector;
private long mStartTimeMillis = SystemClock.elapsedRealtime();
private final Object mLock = new Object();
private boolean mActive = true;
private long mPendingTimeMillis;
private int mPendingFrameId = 0;
private ByteBuffer mPendingFrameData;
FrameProcessingRunnable(Detector<?> detector) { mDetector = detector;
mDetector = null; find ByteBuffer associated with the image " +
"data from the
mLock.wait();
} catch (InterruptedException e) {
Log.d(TAG, "Frame processing loop terminated.", e);
return;
} }
if (!mActive) {
return;
}
outputFrame = new Frame.Builder() .setImageData(mPendingFrameData, previewSize.getWidth(),
previewSize.getHeight(), ImageFormat.NV21)
.setId(mPendingFrameId)
.setTimestampMillis(mPendingTimeMillis)
.setRotation(rotation) .build();
data = mPendingFrameData;
mPendingFrameData = null;
}
try {
mDetector.receiveFrame(outputFrame);
} catch (Throwable t) {
Log.e(TAG, "Exception thrown from receiver.", t);
} finally {
camera.addCallbackBuffer(data.array());
} } } } }
Medan, 22 Oktober 2018
Kepada Yth :
Ibu ketua program studi D3 TI USU di
Medan
Dengan hormat,
Saya yang bertanda tangan dibawah ini : Nama : Sari Mawar
Nim : 152406109
Program Studi : D3 Teknik Informatika
Memohon izin melaksanakan Sidang Meja Hijau dengan judul Tugas Akhir Aplikasi Penerjemah Dengan Metode Text Recognizer.
Demikian permohonan ini saya ajukan, atas perhatiannya saya ucapkan terima kasih.
Diketahui
Ketua Program Studi Pemohon,
Dra. Normalina Napitupulu, M.Sc Sari Mawar
NIP. 196311061989022001 NIM. 152406109