Sunday, April 28, 2019

Tutorial Membuat Space Tab Layout dengan Android Studio

Tutorial Membuat Space Tab Layout dengan Android Studio

Space Tab Layout
Space Tab Layout
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel yang akan membahas Tutorial Membuat Space Tab Layout dengan Android Studio. Untuk pengguna WhatsApp Mod khususnya C-YOWA mungkin sudah tidak asing dengan Space Tab ini.

Nah, disini saya akan membuatkan tutorial cara membuat Space Tab Layout tersebut. Jika kalian ingin SOURCE CODE Space Tab Layout ini, silahkan download di Github saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai😄

Jika kalian ingin mencoba membuat aplikasi ini dengan tutorial versi video, berikut saya berikan Videonya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. 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 19 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:design: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 'eu.long1:spacetablayout:1.0.4'
}

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


package com.azhar.spacetab;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import com.azhar.spacetab.Fragment.FragmentA;
import com.azhar.spacetab.Fragment.FragmentB;
import com.azhar.spacetab.Fragment.FragmentC;
import com.azhar.spacetab.Fragment.FragmentD;
import com.azhar.spacetab.Fragment.FragmentE;

import java.util.ArrayList;
import java.util.List;

import eu.long1.spacetablayout.SpaceTabLayout;

public class MainActivity extends AppCompatActivity {
    SpaceTabLayout tabLayout;

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

        //add the fragments you want to display in a List
        List fragmentList = new ArrayList<>();
        fragmentList.add(new FragmentA());
        fragmentList.add(new FragmentB());
        fragmentList.add(new FragmentC());
        fragmentList.add(new FragmentD());
        fragmentList.add(new FragmentE());

        final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.activity_main);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
        tabLayout = (SpaceTabLayout) findViewById(R.id.spaceTabLayout);

        tabLayout.initialize(viewPager, getSupportFragmentManager(), fragmentList, savedInstanceState);

        tabLayout.setTabOneOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Snackbar snackbar = Snackbar
                        .make(coordinatorLayout, "Welcome to SpaceTabLayout", Snackbar.LENGTH_SHORT);

                snackbar.show();
            }
        });

        tabLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplication(), "" + tabLayout.getCurrentPosition(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}



<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="56dp" />

    <eu.long1.spacetablayout.SpaceTabLayout
        android:id="@+id/spaceTabLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_behavior="eu.long1.spacetablayout.SpaceTabLayoutBehavior"
        app:number_of_tabs="five"
        app:starting_position="one" />

</android.support.design.widget.CoordinatorLayout>

4. Buat FragmentA.java dan fragment_a.xml :


package com.azhar.spacetab.Fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.azhar.spacetab.R;

public class FragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_a, container, false);
    }


}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.azhar.spacetab.Fragment.FragmentB">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_content_cut_black_24dp" />

</RelativeLayout>

5. Buat FragmentB.java dan fragment_b.xml :


package com.azhar.spacetab.Fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.azhar.spacetab.R;

public class FragmentB extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_b, container, false);
    }
}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.azhar.spacetab.Fragment.FragmentB">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_keyboard_capslock_black_24dp" />

</RelativeLayout>

6. Buat FragmentC.java dan fragment_c.xml :


package com.azhar.spacetab.Fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.azhar.spacetab.R;


public class FragmentC extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_c, container, false);
    }

}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.azhar.spacetab.Fragment.FragmentC">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_fingerprint_black_24dp" />

</RelativeLayout>

7. Buat FragmentD.java dan fragment_d.xml :


package com.azhar.spacetab.Fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.azhar.spacetab.R;


public class FragmentD extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_d, container, false);
    }

}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.azhar.spacetab.Fragment.FragmentD">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_hotel_black_24dp" />

</RelativeLayout>

8. Yang terakhir buat FragmentE.java dan fragment_e.xml :


package com.azhar.spacetab.Fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.azhar.spacetab.R;

public class FragmentE extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_e, container, false);
    }

}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.azhar.spacetab.Fragment.FragmentE">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_loyalty_black_24dp" />

</RelativeLayout>

9. Selesai dan kalian Run. Jika 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 Space Tab Layout dengan Android Studio ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Saturday, April 20, 2019

Tutorial Membuat About Dialog pada WhatsApp

Tutorial Membuat About Dialog pada WhatsApp

Tutorial Membuat About Dialog pada WhatsApp
About Dialog Mi-WhatsApp
Halo sobat 48😁 kalau kemarin saya membagikan Mi-WhatsApp Hijab 2.19.109, kali ini saya akan membagikan sebuah Tutorial Membuat About Dialog pada WhatsApp yang mungkin bisa kalian terapkan pada WhatsApp Official dan WhatsApp Mod. Tutorial ini sudah ada semenjak BBM Mod, akan tetapi belum ada yang menerapkannya pada WhatsApp kecuali saya😂 oleh karena itu saya akan buatkan tutorialnya.

About Dialog ini berisi tentang informasi dari aplikasi yang kalian buat, teks dan gambar bisa kalian ubah sesuai keinginan. Untuk merubah teks yang muncul pada dialog, buka PromtDialogUtils. Untuk bahan-bahan About Dialog silahkan download DISINI.

Nah, jika kalian ingin membuat WhatsApp Mod sendiri, sebagai langkah awal silahkan download Portable APKTools DISINI. Disana kalian bisa memilih Tools sesuai kebutuhan. Ada untuk via Device dan juga ada yang untuk via PC. Tapi saya sarankan untuk membuat WhatsApp Mod dengan Tools PC ya, karena akan lebih mudah dan leluasa untuk melihat script dari WhatsApp.

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

  1. Tempatkan bahan-bahan sesuai foldernya
  2. Paham Decompile/Recompile. Untuk Tools silahkan download DISINI. Hanya saran saya, gunakan Portable APKTool via PC agar lebih mudah dalam menerapkan tutorial ini.
  3. Buka styles.xml tambahkan
    
    
    <style name="azhar_prompt_dialog" parent="@android:style/Theme.Dialog">
     <item name="android:backgroundDimAmount">0.4</item>
     <item name="android:windowBackground">@android:color/transparent</item>
     <item name="android:windowNoTitle">true</item>
     <item name="android:windowIsFloating">true</item>
     <item name="android:windowIsTranslucent">false</item>
     <item name="android:windowAnimationStyle">@null</item>
     <item name="android:windowFullscreen">false</item>
     <item name="android:backgroundDimEnabled">true</item>
    </style>
  4. Buka juga colors.xml tambahkan
    
    
    <color name="azhar_color_dialog_gray">#ffededf3</color>
    <color name="azhar_color_dialog_red">@color/primary</color>
  5. Kemudian buka HomeActivity.smali, cari invoke-virtual {p0, v0}, Landroid/support/v7/app/c;->setContentView(Landroid/view/View;)V (patokannya setContentView) lalu tambahkan di bawah nya
    
    
    .line 18
    invoke-static {v2}, Lid/delta/dialog/andyxialm/PromtDialogUtils;->showDialogMain(Landroid/app/Activity;)V
  6. Jika sudah, silahkan Recompile. Selesai😄
Kalau kalian mengikuti langkah-langkah diatas dengan baik, pasti akan berjalan sebagaimana mestinya. Namun jika mengalami Force Close, silahkan berikan komentar dan kita diskusikan bersama.

Sekedar informasi khususnya kalian pengguna setia WhatsApp Mod harap dibaca:
  1. JANGAN PERNAH cadangkan Chat (obrolan) kalian via Google Grive jika menggunakan WhatsApp Mod. Pilih Never (jangan pernah) bila kalian ingin aman dan nyaman dalam menggunakan WhatsApp Mod. Resiko Chat hilang itu sudah resiko jika kalian sering ganti-ganti WhatsApp Mod.
  2. JANGAN PERNAH kirim Report apapun melalui Halaman Help (Bantuan) pada WhatsApp Mod.
  3. JANGAN terlalu sering keluar masuk dan ganti-ganti WhatsApp Mod dengan nomor yang sama. Harap jeda 1-2 hari jika ingin ganti WhatsApp Mod.
  4. Untuk nomor utama sebaiknya gunakan WhatsApp Resmi (Official & Business) dari Play Store. Untuk WhatsApp Mod gunakan nomor cadangan atau SIM 2. Jadi, gunakan WhatsApp Mod versi CLONE (hanya saran).
  5. Segala resiko dari penggunaan WhatsApp Mod adalah tanggung jawab pengguna itu sendiri, bukan tanggung jawab Modder.
Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat About Dialog pada WhatsApp 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...

Wednesday, April 17, 2019

Tutorial Membuat Aplikasi Tanda Tangan dengan Android Studio

Tutorial Membuat Aplikasi Tanda Tangan dengan Android Studio

Tutorial Membuat Aplikasi Tanda Tangan Digital dengan Android Studio
Aplikasi Tanda Tangan Digital dengan Android Studio
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 tonton video tutorial yang sudah saya buatkan :

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 "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    implementation 'com.google.android.material:material:1.2.1'

    implementation 'com.github.gcacace:signature-pad:1.3.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"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.azhar.tandatangan">

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

    <application
        android:requestLegacyExternalStorage="true"
        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"
        tools:targetApi="q">
        <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.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.github.gcacace.signaturepad.views.SignaturePad
import kotlinx.android.synthetic.main.activity_main.*
import java.io.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //set permission
        verifyStoragePermissions(this);

        //draw signature
        signaturePad.setOnSignedListener(object : SignaturePad.OnSignedListener {
            override fun onStartSigning() {
                //Toast.makeText(this@MainActivity, "Mulai menulis...", Toast.LENGTH_SHORT).show()
            }

            override fun onSigned() {
                btnSave.setEnabled(true)
                btnClear.setEnabled(true)
            }

            override fun onClear() {
                btnSave.setEnabled(false)
                btnClear.setEnabled(false)
            }
        })

        //clear signature
        btnClear.setOnClickListener {
            signaturePad.clear()
        }

        //save signature
        btnSave.setOnClickListener {
            val signatureBitmap = signaturePad.getSignatureBitmap()
            if (addJpgSignatureToGallery(signatureBitmap)) {
                Toast.makeText(this@MainActivity, "Tanda tangan disimpan ke dalam Galeri",
                        Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this@MainActivity, "Tidak dapat menyimpan Tanda Tangan",
                        Toast.LENGTH_SHORT).show()
            }
            if (addSvgSignatureToGallery(signaturePad.getSignatureSvg())) {
                Toast.makeText(this@MainActivity, "Tanda tangan SVG disimpan ke dalam Galeri",
                        Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this@MainActivity, "Tidak dapat menyimpan Tanda Tangan SVG",
                        Toast.LENGTH_SHORT).show()
            }
        }

    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        if (requestCode == REQUEST_EXTERNAL_STORAGE) {
            if (grantResults.size <= 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this@MainActivity, "Tidak dapat menulis gambar ke Media Penyimpanan",
                        Toast.LENGTH_SHORT).show()
            }
        }
    }

    fun getAlbumStorageDir(albumName: String?): File {
        val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName)
        if (!file.mkdirs()) {
            Log.e("SignaturePad", "Directory not created")
        }
        return file
    }

    //Image Signature
    @Throws(IOException::class)
    fun saveBitmapToJPG(bitmap: Bitmap, photo: File?) {
        val newBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(newBitmap)
        canvas.drawColor(Color.WHITE)
        canvas.drawBitmap(bitmap, 0f, 0f, null)
        val stream: OutputStream = FileOutputStream(photo)
        newBitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream)
        stream.close()
    }

    fun addJpgSignatureToGallery(signature: Bitmap): Boolean {
        var result = false
        try {
            val photo = File(getAlbumStorageDir("SignaturePad"), String.format("Signature_%d.jpg",
                    System.currentTimeMillis()))
            saveBitmapToJPG(signature, photo)
            scanMediaFile(photo)
            result = true
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return result
    }

    private fun scanMediaFile(photo: File) {
        val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
        val contentUri = Uri.fromFile(photo)
        mediaScanIntent.data = contentUri
        this@MainActivity.sendBroadcast(mediaScanIntent)
    }

    //SVG Signature
    fun addSvgSignatureToGallery(signatureSvg: String?): Boolean {
        var result = false
        try {
            val svgFile = File(getAlbumStorageDir("SignaturePad"), String.format("Signature_%d.svg",
                    System.currentTimeMillis()))
            val stream: OutputStream = FileOutputStream(svgFile)
            val writer = OutputStreamWriter(stream)
            writer.write(signatureSvg)
            writer.close()
            stream.flush()
            stream.close()
            scanMediaFile(svgFile)
            result = true
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return result
    }

    companion object {
        private const val REQUEST_EXTERNAL_STORAGE = 1
        private val PERMISSIONS_STORAGE = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        fun verifyStoragePermissions(activity: MainActivity?) {
            val permission = ActivityCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            if (permission != PackageManager.PERMISSION_GRANTED) {
                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:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Tanda Tangan Digital"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

    </androidx.appcompat.widget.Toolbar>

    <LinearLayout
        android:id="@+id/linearMessage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/toolbar"
        android:background="@color/colorPrimaryDark"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:text="Sentuh dan gerakan jari Anda pada Area dibawah ini untuk membuat Tanda Tangan Digital."
            android:textColor="@android:color/white"
            android:textSize="16sp"
            android:textStyle="italic" />

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/signatureContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/linearButton"
        android:layout_below="@id/linearMessage">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_above="@+id/signatureDescription"
            android:layout_marginBottom="8dp"
            android:background="@color/colorPrimary" />

        <TextView
            android:id="@+id/signatureDescription"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="16dp"
            android:text="*Saya Setuju dengan Syarat dan Ketentuan"
            android:textColor="@android:color/black" />

        <com.github.gcacace.signaturepad.views.SignaturePad
            android:id="@+id/signaturePad"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:penColor="@android:color/black" />

    </RelativeLayout>

    <LinearLayout
        android:id="@+id/linearButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnClear"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:layout_weight="1"
            android:background="@drawable/button_background"
            android:drawableStart="@drawable/ic_delete"
            android:enabled="false"
            android:paddingStart="30dp"
            android:paddingEnd="30dp"
            android:text="Clear"
            android:textColor="@android:color/white" />

        <Button
            android:id="@+id/btnSave"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:layout_weight="1"
            android:background="@drawable/button_background"
            android:drawableStart="@drawable/ic_save"
            android:enabled="false"
            android:paddingStart="30dp"
            android:paddingEnd="30dp"
            android:text="Save"
            android:textColor="@android:color/white" />

    </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...

Monday, April 15, 2019

Tutorial Membuat Aplikasi Scan Barcode dan QR Code dengan Android Studio

Tutorial Membuat Aplikasi Scan Barcode dan QR Code dengan Android Studio

Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
Halo sobat 48😁 kali ini saya akan membagikan artikel yang membahas tentang Tutorial Membuat Aplikasi Scan Barcode dan QR Code dengan Android Studio. Kalau sebelumnya saya pernah membuatkan Tutorial Membuat Aplikasi Barcode Generator dengan Android Studio, tetapi hanya bisa untuk Scan dan Create Barcode saja. Untuk yang kali ini bisa Scan Barcode dan QR Code juga, tetapi tidak bisa Create Barcode😂 mungkin di lain kesempatan akan saya buatkan semuanya jadi satu, pantau terus ya blog saya ini dengan cara berlangganan di kolom subscribe yang tersedia.

Jika kalian ingin mencoba membuat aplikasi menggunakan sample ini, berikut saya berikan Video Preview-nya:

Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya. Adapun fitur yang tersedia di Aplikasi Scan Barcode dan QR Code ini, antara lain:
  1. Scan Barcode dan QR Code
  2. Use SQLite for save data
  3. Tell Code Type (hasil scan akan menunjukkan tipe kode)
  4. Swipe to delete (hapus hasil scan dengan cara geser perlahan ke kiri atau kanan)
  5. On/Off Beep Sound (suara saat scan bisa kalian On/Off)
  6. On/Off Front Camera Scan (bisa scan dengan kamera depan)
  7. Clear All Data (bisa hapus semua hasil scan)
  8. Share Code (kode hasil scan bisa kalian bagikan)
  9. Copy Code (kode hasil scan bisa kalian copy)
  10. Menu About
Jika kalian ingin SOURCE CODE Aplikasi Scan Barcode dan QR Code 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'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.journeyapps:zxing-android-embedded:3.4.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'nl.qbusict:cupboard:2.2.0'
    implementation 'com.android.support:preference-v7:28.0.0'
    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'
}

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.barcodeqr">

    <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"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

4. Ubah isi MainActivity.java dan activity_main.xml, buat juga content_main.xml dan navigation_bar.xml seperti ini :


package com.azhar.barcodeqr;

import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.azhar.barcodeqr.adapter.Code;
import com.azhar.barcodeqr.adapter.ListItem;
import com.azhar.barcodeqr.adapter.MyAdapter;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

import java.util.ArrayList;
import java.util.List;

import nl.qbusict.cupboard.QueryResultIterable;

import static nl.qbusict.cupboard.CupboardFactory.cupboard;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    IntentIntegrator scan;
    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    List listItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final PracticeDatabaseHelper dbHelper = new PracticeDatabaseHelper(this);
        final SQLiteDatabase db = dbHelper.getWritableDatabase();

        PreferenceManager.setDefaultValues(this, R.xml.settings, false);
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        Boolean beep = sharedPref.getBoolean("beep", true);
        Boolean frontCamera = sharedPref.getBoolean("frontCamera", false);
        int camId;
        if (frontCamera == false)
            camId = 0;
        else
            camId = 1;
        sharedPref.registerOnSharedPreferenceChangeListener(this);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        listItems = new ArrayList<>();
        adapter = new MyAdapter(listItems, this);
        recyclerView.setAdapter(adapter);
        CardView cardView = (CardView) findViewById(R.id.cardView);

        Cursor codes = cupboard().withDatabase(db).query(Code.class).orderBy("_id DESC").getCursor();
        try {
            // Iterate Bunnys
            QueryResultIterable itr = cupboard().withCursor(codes).iterate(Code.class);
            for (Code bunny : itr) {
                // do something with bunny
                ListItem listItem = new ListItem(bunny._id, bunny.name, bunny.type);
                listItems.add(listItem);
                adapter = new MyAdapter(listItems, this);
                recyclerView.setAdapter(adapter);
            }
        } finally {
            // close the cursor
            codes.close();
        }
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }

            // Called when a user swipes left or right on a ViewHolder
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
                final int position = viewHolder.getAdapterPosition();
                ListItem item = listItems.get(position);

                cupboard().withDatabase(db).delete(Code.class, item.get_Id());
                listItems.remove(position);
                adapter.notifyItemRemoved(position);
                adapter.notifyItemRangeChanged(position, listItems.size());

            }
        }).attachToRecyclerView(recyclerView);
        scan = new IntentIntegrator(this);
        scan.setBeepEnabled(beep);
        scan.setCameraId(camId);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                scan.initiateScan();
            }
        });

        ImageView imgAbout = findViewById(R.id.action_about);
        imgAbout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent aboutIntent = new Intent(MainActivity.this, About.class);
                startActivity(aboutIntent);
            }
        });

        ImageView imgSettings = findViewById(R.id.action_settings);
        imgSettings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent settingsIntent = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(settingsIntent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_clearAll) {
            PracticeDatabaseHelper dbHelper = new PracticeDatabaseHelper(this);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Cursor codes = cupboard().withDatabase(db).query(Code.class).orderBy("_id DESC").getCursor();
            try {
                if (codes.getCount() > 0) {
                    cupboard().withDatabase(db).delete(Code.class, null);
                    listItems.clear();
                    adapter.notifyDataSetChanged();
                } else {
                    return true;
                }
            } finally {
                codes.close();
            }
        }

        return super.onOptionsItemSelected(item);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {

            if (result.getContents() == null) {
                Snackbar snackbar = Snackbar.make(findViewById(R.id.main), "Result Not Found", Snackbar.LENGTH_LONG);

                snackbar.show();
            } else {

                Code codeObj = new Code(result.getContents(), result.getFormatName());
                PracticeDatabaseHelper dbHelper = new PracticeDatabaseHelper(this);
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                long id = cupboard().withDatabase(db).put(codeObj);
                listItems.clear();
                adapter.notifyDataSetChanged();
                Cursor codes = cupboard().withDatabase(db).query(Code.class).orderBy("_id DESC").getCursor();
                try {
                    // Iterate Bunnys
                    QueryResultIterable itr = cupboard().withCursor(codes).iterate(Code.class);
                    for (Code bunny : itr) {
                        // do something with bunny
                        ListItem listItem = new ListItem(bunny._id, bunny.name, bunny.type);
                        listItems.add(listItem);
                        adapter = new MyAdapter(listItems, this);
                        recyclerView.setAdapter(adapter);
                    }
                } finally {
                    // close the cursor
                    codes.close();
                }
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    public void cardClick(View card) {
        TextView textView = (TextView) findViewById(R.id.textViewCode);
        String code = textView.getText().toString();
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, code);
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals("beep")) {
            scan.setBeepEnabled(sharedPreferences.getBoolean(key, true));
        }
        if (key.equals("frontCamera")) {
            int camId;
            if (sharedPreferences.getBoolean(key, false) == false)
                camId = 0;
            else
                camId = 1;
            scan.setCameraId(camId);
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        PreferenceManager.getDefaultSharedPreferences(this)
                .unregisterOnSharedPreferenceChangeListener(this);
    }
}



<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.bottomappbar.BottomAppBar
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:backgroundTint="@color/colorPrimary"
        app:fabAlignmentMode="center"
        app:fabCradleRoundedCornerRadius="16dp"
        app:hideOnScroll="true">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="55.0dip"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:layout_gravity="bottom"
            android:orientation="horizontal">

            <include layout="@layout/navigation_bar" />

        </LinearLayout>

    </android.support.design.bottomappbar.BottomAppBar>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="4dp"
        android:tint="@android:color/white"
        app:fabSize="normal"
        app:layout_anchor="@+id/navigation"
        app:srcCompat="@android:drawable/ic_search_category_default" />

</android.support.design.widget.CoordinatorLayout>



<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="8dp">

    </android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50.0dip"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0.0dip"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_marginTop="5.0dip"
        android:layout_weight="1.0"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:layout_width="36.0dip"
            android:layout_height="36.0dip"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_about"
            android:id="@+id/action_about"
            android:tint="#ffffff" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="0.0dip"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1.0"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="invisible" />

    <LinearLayout
        android:layout_width="0.0dip"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_marginTop="5.0dip"
        android:layout_weight="1.0"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:layout_width="36.0dip"
            android:layout_height="36.0dip"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_settings"
            android:id="@+id/action_settings"
            android:tint="#ffffff" />

    </LinearLayout>
</LinearLayout>

5. Buat SettingsActivity.java, settings.xml (taruh di folder xml) dan menu_main.xml (taruh di folder menu) :


package com.azhar.barcodeqr;

import android.os.Bundle;
import android.preference.PreferenceActivity;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class SettingsActivity extends PreferenceActivity {

    private final static String TAG = "SettingsAcitivity";

    public SettingsActivity() {}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new LocationFragment()).commit();
    }

}



<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        android:title="Settings"
        app:key="settings">

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="beep"
            android:summary="Enable beep on code scan"
            android:title="Beep Sound" />

        <CheckBoxPreference
            android:defaultValue="false"
            android:key="frontCamera"
            android:summary="Enable front camera for scanning"
            android:title="Front Camera" />
    </PreferenceCategory>

</PreferenceScreen>



<menu 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"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_clearAll"
        android:orderInCategory="100"
        android:title="@string/action_clearAll"
        app:showAsAction="always" />

</menu>

6. Buat About.java dan activity_about.xml :


package com.azhar.barcodeqr;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class About extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about);
    }
}



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".About">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="Github"
        android:textSize="20sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="16dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:autoLink="web"
        android:text="https://github.com/AzharRivaldi"
        android:textSize="16sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="42dp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="76dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="Twitter"
        android:textSize="20sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="16dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:autoLink="web"
        android:text="https://twitter.com/azharrvldi_"
        android:textSize="16sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="42dp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="76dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:text="Website"
        android:textSize="20sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="16dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:autoLink="web"
        android:text="https://rivaldi48.blogspot.com"
        android:textSize="16sp"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="42dp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="76dp" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_margin="16dp"
            android:text="Designed by Azhar Rivaldi" />

    </FrameLayout>

</LinearLayout>

7. Buat MyAdapter.java dan list_item.xml :


package com.azhar.barcodeqr.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.azhar.barcodeqr.R;

import java.util.List;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class MyAdapter extends RecyclerView.Adapter {
    List listItems;
    Context context;

    public MyAdapter(List listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ListItem listItem = listItems.get(position);
        holder.textView_Id.setText(String.valueOf(listItem.get_Id()));
        holder.textViewCode.setText(listItem.getCode());
        holder.textViewType.setText(listItem.getType());
        Linkify.addLinks(holder.textViewCode, Linkify.ALL);
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView textView_Id;
        public TextView textViewCode;
        public TextView textViewType;

        public TextView getTextView_Id() {
            return textView_Id;
        }

        public ViewHolder(View itemView) {
            super(itemView);
            textView_Id = (TextView)itemView.findViewById(R.id.textView_Id);
            textViewCode = (TextView)itemView.findViewById(R.id.textViewCode);
            textViewType = (TextView)itemView.findViewById(R.id.textViewType);
        }
    }
}




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        app:cardCornerRadius="5dp"
        app:cardElevation="4dp"
        android:paddingStart="8dp"
        android:paddingLeft="8dp"
        android:paddingBottom="8dp">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="8dp"
            android:paddingBottom="8dp">

            <TextView

                android:id="@+id/textViewCode"
                android:layout_width="306dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="16dp"
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
                android:textIsSelectable="true"
                android:textSize="20sp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="code" />

            <TextView
                android:id="@+id/textViewType"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textViewCode"
                tools:text="type" />

            <TextView
                android:id="@+id/textView_Id"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:visibility="gone"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="id" />

            <TextView
                android:id="@+id/textViewShare"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginRight="4dp"
                android:layout_marginBottom="8dp"
                android:background="@drawable/button_background"
                android:clickable="true"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:onClick="cardClick"
                android:paddingLeft="6dp"
                android:paddingTop="8dp"
                android:paddingRight="6dp"
                android:paddingBottom="8dp"
                android:text="SHARE"
                android:textColor="@android:color/white"
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
                android:textSize="15sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

        </android.support.constraint.ConstraintLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

8. Buat PracticeDatabaseHelper.java :


package com.azhar.barcodeqr;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.azhar.barcodeqr.adapter.Code;

import static nl.qbusict.cupboard.CupboardFactory.cupboard;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class PracticeDatabaseHelper  extends SQLiteOpenHelper{
    private static final String DATABASE_NAME = "scanqrbarcode.db";
    private static final int DATABASE_VERSION = 1;

    public PracticeDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    static {
        // register our models
        cupboard().register(Code.class);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // this will ensure that all tables are created
        cupboard().withDatabase(db).createTables();
        // add indexes and other database tweaks in this method if you want

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // this will upgrade tables, adding columns and new tables.
        // Note that existing columns will not be converted
        cupboard().withDatabase(db).upgradeTables();
        // do migration work if you have an alteration to make to your schema here

    }

}

9. Buat LocationFragment.java :


package com.azhar.barcodeqr;

import android.os.Bundle;
import android.preference.PreferenceFragment;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class LocationFragment extends PreferenceFragment {

    private final static String beep = "beep";
    private final static String frontCamera = "frontCamera";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);
    }

}

10. Buat ListItem.java dan Code.java :


package com.azhar.barcodeqr.adapter;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class ListItem {
    private long _id;
    private String code;
    private String type;

    public ListItem(long _id, String code, String type) {
        this._id = _id;
        this.code = code;
        this.type = type;
    }

    public long get_Id() {
        return _id;
    }

    public String getCode() {
        return code;
    }

    public String getType() {
        return type;
    }
}



package com.azhar.barcodeqr.adapter;

/**
 * Created by Azhar Rivaldi on 11/04/2019.
 */

public class Code {

    public Long _id; // for cupboard
    public String name; // bunny name
    public String type;

    public Code() {
        this.name = "noName";
        this.type = "noType";
    }

    public Code(String name, String type) {
        this.name = name;
        this.type = type;
    }

}

Jika sudah selesai, silahkan kalian RUN dengan emulator bawaan Android Studio atau langsung melalui Device. Untuk hasil outputnya seperti ini:
Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
Aplikasi Scan Barcode dan QR Code
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 Scan Barcode dan QR Code 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...

Wednesday, April 10, 2019

Instagram Mod Versi 86.0.0.24.87

Instagram Mod Versi 86.0.0.24.87

Instagram Mod 86.0.0.24.87
Instagram Mod 86.0.0.24.87
Halo sobat 48😁 kali ini saya akan membagikan Instagram Mod. Instagram Mod ini versi Terbaru untuk base Play Store yaitu 86.0.0.24.87. Instagram Mod Versi 86.0.0.24.87 ini tidak memiliki banyak fitur layaknya GB Insta. GB Insta sendiri pun sudah lama tidak ada update, GB Insta saat ini masih versi 71.0.0.18.102.

Instagram Mod Versi 86.0.0.24.87 ini saya dapatkan dari Channel The Begal Developer. Buat kalian yang lebih suka tampilan Instagram biasa saja namun memiliki fitur tambahan, Instagram Mod Versi 86.0.0.24.87 ini mungkin bisa kalian coba.
Instagram Mod 86.0.0.24.87
Instagram Mod 86.0.0.24.87
Instagram Mod 86.0.0.24.87
Instagram Mod 86.0.0.24.87
Oke langsung saja tanpa basa-basi saya jelaskan fitur apa saja yang ada di dalam Instagram Mod Versi 86.0.0.24.87:
  • New Base Updated to 86.0.0.24.87 
  • Added Ability to Download Video/Images
  • Added Privacy - Hide View Status (Don't Show Your Name even If you View Someone's Story)  
  • Added Ability to Download Stories
  • Added Ability to Share/Copy Video/Images Url (Click on 3 Dots of the Post and click More Options) 
  • Added Ability to copy Bio 
  • Added InstaUltra Settings Icon on Header of profile
  • Improved NOW you can Download Video/Image From Private Accounts 
  • Improved download options, you have 2 ways to Download Video/Images ( Click on 3 Dots of the Post and click More Options or InstaUltra options)
  • Added Option to Disable Slide Navigation  
  • Support X86
  • Added Ability to Support Links in App 
  • Added When some uploads More than 1 image Simultaneously, download will save all pics atOnce
  • Added Option to Start Audio Directly with Video
  • Fixed all bugs of v0.9.1.3
  • Fixed Crash when Click on Share on facebook
  • Fixed Crash when Click on Share Links...
  • Fixed Crash when open Download Data
  • Fixed Crash when open Access Data
  • Fixed Crash when open Two-Factor Authentication
  • Other Fixes..
Instagram Mod Versi 86.0.0.24.87 tersedia versi UNCLONE dan CLONE, bagi yang ingin mencobanya silahkan download melalui link dibawah ini:

LINK Instagram Mod Versi 86.0.0.24.87 CLONE
LINK Instagram Mod Versi 86.0.0.24.87 UNCLONE

Cara pasang :
  1. Download aplikasinya terlebih dahulu melalui link diatas.
  2. Buat kalian yang bingung perbedaan CLONE dan UNCLONE. CLONE adalah memasang aplikasi baru yang bisa berdampingan dengan aplikasi yang sudah ada di smartphone. UNCLONE adalah menimpa aplikasi yang sudah ada di smartphone.
  3. Instal dan Login dengan Username/Email dan Password kalian.
Untuk kalian yang baru pertama kali menggunakan Instagram Mod, kalian UNINSTAL atau copot pemasangan terlebih dahulu Instagram Official yang ada di smartphone kalian jika kalian mengunduh versi UNCLONE
Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut mengunduh Instagram Mod Versi 86.0.0.24.87 ini. Subscribe juga di blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Tuesday, April 9, 2019

Cara Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru | 2019

Cara Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru | 2019

Google Drive Terbaru
Google Drive Terbaru
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel yang membahas Cara Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru. Tepatnya tanggal 8 April kemarin saya memperbarui aplikasi Google Drive setelah mendapatkan notifikasi pembaruan. Setelah pembaruan selesai, saya langsung membuka aplikasi tersebut karena saya ingin melihat apa saja yang baru.

Secara tampilan memang lebih keren dan user friendly. Saya suka. Menu navigasinya pun lebih simpel dari versi yang sebelumnya. Setelah saya buka, saya langsung coba upload file. Tetapi saat saya sedang meng-upload file, saya mengalami sedikit masalah. File yang saya upload tidak kunjung ter-upload. Saya pun bingung cara mengatasinya bagaimana.

Saya coba cari ke komentar aplikasi Google Drive untuk mencari solusi di Play Store pun banyak yang mengalami hal serupa, kira-kira seperti ini isi komentar dari para pengguna:
Google Drive Terbaru
Google Drive Terbaru
Kemudian saya coba untuk mencari solusinya di Google. Dan alhamdulillah ketemu solusinya. Saya pun sedikit tertawa saat melihat jawaban dari Google, ternyata sangat simpel untuk Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru😄. Berikut solusinya:

1. Pertama, kalian buka menu navigasi drawer yang ada disamping, lalu tekan setelan
Google Drive Terbaru
Google Drive Terbaru
2. Kedua, kalian cari Penggunaan Data. Lalu matikan Transfer file hanya melalui Wi-Fi
Google Drive Terbaru
Google Drive Terbaru
Google Drive Terbaru
Google Drive Terbaru
Itulah Cara Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru. Setelah saya lakukan langkah-langkah diatas, saya langsung bisa upload file ke Google Drive seperti biasanya. Bagaimana? Sudah teratasi belum masalah gagal upload ke Google Drive versi terbaru? Berikan komentarnya ya😊

Berikut ini fitur-fitur baru dari Google Drive:

  • Temukan dan akses file di mana saja kini lebih cepat dan lebih mudah dengan Google Drive versi terbaru yang didesain ulang.
  • Menyederhanakan pengelolaan notifikasi di Android.
  • Memperbarui fitur kamera yang digunakan untuk memindai dokumen.

Dengan Drive, kalian dapat:

  • Dengan aman menyimpan file dan mengaksesnya dari mana pun.
  • Menelusuri file menurut nama dan konten.
  • Dengan mudah membagikan file dan folder kepada orang lain.
  • Dengan cepat melihat konten Anda.
  • Menyetel level akses untuk menentukan siapa yang dapat melihat, mengomentari, atau mengedit.
  • Dengan cepat mengakses file terbaru.
  • Melihat detail dan aktivitas file.
  • Mengaktifkan penampilan file secara offline.
  • Menggunakan kamera perangkat Anda untuk memindai dokumen kertas.
  • Mengakses foto dan video dari Google Foto.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Cara Mengatasi Gagal Upload File/Folder Setelah Update Google Drive Terbaru | 2019 ini. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Wednesday, April 3, 2019

Tutorial Membuat Aplikasi CRUD dengan Kotlin menggunakan Android Studio

Tutorial Membuat Aplikasi CRUD dengan Kotlin menggunakan Android Studio

CRUD Kotlin
CRUD Kotlin
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Aplikasi CRUD dengan Kotlin menggunakan Android Studio. Kalau biasanya kalian menemukan tutorial ini menggunakan bahasa Java, namun kali ini saya akan bagikan dalam versi bahasa Kotlin.

Jika kalian ingin mencoba membuat aplikasi menggunakan sample ini, berikut admin berikan Video Tutorialnya:

Gimana setelah melihat video preview diatas? Apa kalian tertarik? Untuk SOURCE CODE kalian bisa download di Github saya DISINI. Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya.

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

Tutorial Agar Teks di Android Justify menggunakan Android Studio

Android Justify
Android Justify
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Agar Teks di Android Justify menggunakan Android Studio. Mungkin sudah banyak yang memberikan tutorialnya, dan solusi membuat teks rata kanan kiri atau justify di Android adalah menggunakan HTML. Namun cara itu bagi saya cukup rumit dan tidak efesien. Kali ini saya akan membuat justify menggunakan library dari Github.
Jika kalian ingin mencoba membuat aplikasi menggunakan sample ini, berikut admin berikan Video Tutorialnya:

Gimana setelah melihat video preview diatas? Apa kalian tertarik? Untuk SOURCE CODE kalian bisa download di Github saya DISINI. Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya.

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

Tutorial Membuat Background Transisi seperti Instagram dengan Android Studio

Tutorial Membuat Background Transisi seperti Instagram
Tutorial Membuat Background Transisi seperti Instagram

Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel yang membahas tentang Tutorial Membuat Background Transisi seperti Instagram dengan Android Studio. Jika kalian menggunakan Instagram saat ingin Login, pasti kalian akan disuguhkan tampilan Login dengan latar belakang gradasi berwarna. Kali ini saya akan buatkan tutorialnya.
Jika kalian ingin mencoba membuat aplikasi menggunakan sample ini, berikut admin berikan Video Tutorialnya:


Gimana setelah melihat video preview diatas? Apa kalian tertarik? Untuk SOURCE CODE Tutorial Membuat Background Transisi seperti Instagram kalian bisa download di Github saya DISINI. Jangan lupa subscribe Channel Youtube saya juga ya Azhar Rivaldi, karena disana ada banyak tutorial-tutorial untuk membuat aplikasi lainnya.

Tutorial Membuat Background Transisi seperti Instagram

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