Tutorial Membuat Aplikasi Tanda Tangan dengan Android Studio

    Aplikasi Tanda Tangan
    Aplikasi Tanda Tangan
    Halo sobat 48😁 kalau kemarin saya membagikan sebuah Tutorial Membuat Aplikasi Scan Barcode dan QR Code dengan Android Studio, kali ini saya akan membahas Tutorial Membuat Aplikasi Tanda Tangan dengan Android Studio. Mungkin dari kalian sudah ada beberapa yang tahu tutorial ini, namun bagi kalian yang belum tahu dan sangat butuh tutorial ini silahkan lanjut dibaca ya artikel ini😄

    Jika kalian ingin SOURCE CODE Aplikasi Tanda Tangan ini, silahkan download di Github saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai😄

    Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :

    1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 15 ya.

    2. Buka build.gradle dan ubah menjadi seperti ini :


    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'com.github.gcacace:signature-pad:1.2.1'
    }

    3. Buka AndroidManifest.xml dan ubah menjadi seperti ini :


    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.azhar.tandatangan">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    </application>

    </manifest>

    4. Ubah isi MainActivity.java dan activity_main.xml menjadi seperti ini :


    package com.azhar.tandatangan;

    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;

    import com.github.gcacace.signaturepad.views.SignaturePad;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;

    public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
    private SignaturePad mSignaturePad;
    private Button mClearButton;
    private Button mSaveButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    verifyStoragePermissions(this);
    setContentView(R.layout.activity_main);

    mSignaturePad = (SignaturePad) findViewById(R.id.signature_pad);
    mSignaturePad.setOnSignedListener(new SignaturePad.OnSignedListener() {
    @Override
    public void onStartSigning() {
    Toast.makeText(MainActivity.this, "OnStartSigning", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onSigned() {
    mSaveButton.setEnabled(true);
    mClearButton.setEnabled(true);
    }

    @Override
    public void onClear() {
    mSaveButton.setEnabled(false);
    mClearButton.setEnabled(false);
    }
    });

    mClearButton = (Button) findViewById(R.id.clear_button);
    mSaveButton = (Button) findViewById(R.id.save_button);

    mClearButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    mSignaturePad.clear();
    }
    });

    mSaveButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Bitmap signatureBitmap = mSignaturePad.getSignatureBitmap();
    if (addJpgSignatureToGallery(signatureBitmap)) {
    Toast.makeText(MainActivity.this, "Signature saved into the Gallery", Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(MainActivity.this, "Unable to store the signature", Toast.LENGTH_SHORT).show();
    }
    if (addSvgSignatureToGallery(mSignaturePad.getSignatureSvg())) {
    Toast.makeText(MainActivity.this, "SVG Signature saved into the Gallery", Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(MainActivity.this, "Unable to store the SVG signature", Toast.LENGTH_SHORT).show();
    }
    }
    });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
    @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
    case REQUEST_EXTERNAL_STORAGE: {
    // If request is cancelled, the result arrays are empty.
    if (grantResults.length <= 0
    || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
    Toast.makeText(MainActivity.this, "Cannot write images to external storage", Toast.LENGTH_SHORT).show();
    }
    }
    }
    }

    public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
    Log.e("SignaturePad", "Directory not created");
    }
    return file;
    }

    public void saveBitmapToJPG(Bitmap bitmap, File photo) throws IOException {
    Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newBitmap);
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(bitmap, 0, 0, null);
    OutputStream stream = new FileOutputStream(photo);
    newBitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream);
    stream.close();
    }

    public boolean addJpgSignatureToGallery(Bitmap signature) {
    boolean result = false;
    try {
    File photo = new File(getAlbumStorageDir("SignaturePad"), String.format("Signature_%d.jpg", System.currentTimeMillis()));
    saveBitmapToJPG(signature, photo);
    scanMediaFile(photo);
    result = true;
    } catch (IOException e) {
    e.printStackTrace();
    }
    return result;
    }

    private void scanMediaFile(File photo) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    Uri contentUri = Uri.fromFile(photo);
    mediaScanIntent.setData(contentUri);
    MainActivity.this.sendBroadcast(mediaScanIntent);
    }

    public boolean addSvgSignatureToGallery(String signatureSvg) {
    boolean result = false;
    try {
    File svgFile = new File(getAlbumStorageDir("SignaturePad"), String.format("Signature_%d.svg", System.currentTimeMillis()));
    OutputStream stream = new FileOutputStream(svgFile);
    OutputStreamWriter writer = new OutputStreamWriter(stream);
    writer.write(signatureSvg);
    writer.close();
    stream.flush();
    stream.close();
    scanMediaFile(svgFile);
    result = true;
    } catch (IOException e) {
    e.printStackTrace();
    }
    return result;
    }

    /**
    * Checks if the app has permission to write to device storage
    * * If the app does not has permission then the user will be prompted to grant permissions
    *
    * @param activity the activity from which permissions are checked
    */
    public static void verifyStoragePermissions(MainActivity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
    // We don't have permission so prompt the user
    ActivityCompat.requestPermissions(
    activity,
    PERMISSIONS_STORAGE,
    REQUEST_EXTERNAL_STORAGE
    );
    }
    }
    }




    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:signature="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <RelativeLayout
    android:id="@+id/signature_pad_container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/buttons_container">

    <FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_above="@+id/signature_pad_description"
    android:layout_marginBottom="8dp"
    android:background="@android:color/darker_gray" />

    <TextView
    android:id="@+id/signature_pad_description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="16dp"
    android:text="@string/agreement"
    android:textColor="@android:color/darker_gray" />

    <com.github.gcacace.signaturepad.views.SignaturePad
    android:id="@+id/signature_pad"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

    </RelativeLayout>

    <LinearLayout
    android:id="@+id/buttons_container"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal"
    android:paddingTop="16dp">

    <Button
    android:id="@+id/clear_button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:enabled="false"
    android:text="@string/clear_pad" />

    <Button
    android:id="@+id/save_button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:enabled="false"
    android:text="@string/save_signature" />
    </LinearLayout>

    </RelativeLayout>

    Kalau kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

    Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Aplikasi Tanda Tangan dengan Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Follow Instagram Admin @azhardvls_. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih...