全部产品
Search
文档中心

Mobile Platform as a Service:Panduan lanjutan

更新时间:Jan 31, 2026

Pemindaian jendela merupakan fitur yang menggunakan UI standar lama. Untuk menggunakan fitur pemindaian layar penuh yang mendukung pengenalan multi-kode, Anda harus melakukan upgrade baseline mPaaS ke versi 10.1.68.33 atau lebih baru.

Gunakan fitur pemindaian di UI standar

Pemindaian layar penuh

Untuk memindai secara terus-menerus tanpa keluar setelah pemindaian berhasil, gunakan kode berikut.

ScanRequest scanRequest = new ScanRequest();
        MPScan.startMPaasScanFullScreenActivity(this, scanRequest, new MPScanCallbackAdapter() {
            @Override
            public boolean onScanFinish(Context context, MPScanResult mpScanResult, final MPScanStarter mpScanStarter) {
                new android.app.AlertDialog.Builder(context)
                        .setMessage(mpScanResult != null ? mpScanResult.getText() : "No code detected")
                        .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mpScanStarter.restart();
                            }
                        })
                        .create()
                        .show();
                // Kembalikan false untuk menunjukkan bahwa callback belum dikonsumsi. Callback akan dipanggil lagi untuk pemindaian berikutnya.
                return false;
            }
        });

Override metode lain dari MPScanCallbackAdapter untuk mendengarkan event lainnya:

MPScan.startMPaasScanFullScreenActivity(this, scanRequest, new MPScanCallbackAdapter() {
    @Override
    public boolean onScanFinish(final Context context, MPScanResult mpScanResult, final MPScanStarter mpScanStarter) {
        return true;
    }

    @Override
    public boolean onScanError(Context context, MPScanError error) {
        // Kesalahan pemindaian.
        return super.onScanError(context, error);
    }

    @Override
    public boolean onScanCancel(Context context) {
        // Pemindaian dibatalkan.
        return super.onScanCancel(context);
    }
});

Sebelum memulai fitur pemindaian layar penuh, atur parameter startup seperti yang ditunjukkan pada kode berikut.

ScanRequest scanRequest = new ScanRequest();

// Atur teks prompt.
scanRequest.setViewText("Prompt text");

// Atur teks prompt untuk menyalakan senter.
scanRequest.setOpenTorchText("Turn on flashlight");

// Atur teks prompt untuk mematikan senter.
scanRequest.setCloseTorchText("Turn off flashlight");

// Atur jenis pengenalan pemindaian.
// Pengaturan ini hanya berlaku untuk pemindaian langsung, bukan untuk mengenali gambar dari album foto.
scanRequest.setRecognizeType(
    ScanRequest.RecognizeType.QR_CODE,    // QR code
    ScanRequest.RecognizeType.BAR_CODE,   // Barcode
    ScanRequest.RecognizeType.DM_CODE,    // DM code
    ScanRequest.RecognizeType.PDF417_Code // PDF417 code
); // Jika tidak diatur, tiga jenis pertama akan dikenali secara default.

// Sembunyikan tombol album foto.
scanRequest.setNotSupportAlbum(true);

// Atur gambar penanda untuk pemindaian multi-kode.
scanRequest.setMultiMaMarker(R.drawable.green_arrow);

// Atur teks prompt untuk pemindaian multi-kode.
scanRequest.setMultiMaTipText("Tap the green arrow to select a code");

// Atur warna titik setelah memilih satu kode.
scanRequest.setMaTargetColor("#32CD32");

// Aktifkan AI untuk mengenali kode kecil dan memperbesar secara otomatis. Fitur ini hanya didukung pada baseline 10.2.3 ke atas dan memerlukan integrasi komponen Scan AI.
scanRequest.setEnableAI(true);

// Atur teks prompt yang tertunda. Fitur ini hanya didukung pada baseline 10.2.3 ke atas.
scanRequest.setDelayTipText("Toast will pop up after a delay of x seconds");

// Atur waktu tunda untuk prompt dalam milidetik. Fitur ini hanya didukung pada baseline 10.2.3 ke atas.
scanRequest.setDelayTipTime(5000);

// Aktifkan pengenalan beberapa kode (maksimal 4) dari album foto. Fitur ini hanya didukung pada baseline 10.2.3 ke atas.
scanRequest.setEnableAlbumMultiCode(true);

// Atur alur permintaan izin kustom.
scanRequest.setPermissionDelegate(new PermissionDelegate() {
            /**
             * Memulai permintaan izin. Anda dapat mengimplementasikan interaksi permintaan izin sendiri atau memberikan penjelasan di sini.
             * Catatan:
             *    1. Setelah menangani logika Anda sendiri, Anda harus meminta izin. Jika tidak, proses akan diblokir.
             *    2. Jika pengguna menolak izin, `onPermissionDenied` dan `MPScanCallbackAdapter.onScanError` akan dipanggil.
             *       `MPScanCallbackAdapter.onScanError` menyediakan implementasi default untuk menangani kegagalan permintaan izin. Anda dapat meng-override metode ini untuk menangani error tersebut.
             * @param fragment      Halaman pemindaian.
             * @param requestCode   1: Izin kamera.
             * @param permissions   Izin yang diminta.
             *
             */
            @Override
            public void onRequestPermission(Fragment fragment, final int requestCode, final String[] permissions) {
                // Tangani izin kamera.
                if(requestCode == 1){
                    // Tangani logika bisnis Anda.
                    showPermissionTipDialog();
                }
                // Ini harus dipanggil untuk memulai permintaan izin.
                fragment.requestPermissions(permissions, requestCode);
            }

            /**
             * Callback ketika izin berhasil diberikan.
             */
            @Override
            public void onPermissionGranted(Fragment fragment, int requestCode, String[] permissions, int[] grantResults) {
                dismissPermissionTipDialog();
            }

            /**
             * Callback ketika izin ditolak.
             */
            @Override
            public void onPermissionDenied(Fragment fragment, int requestCode, String[] permissions, int[] grantResults) {
                dismissPermissionTipDialog();
            }
            
});

Pemindaian jendela

Saat menggunakan fitur pemindaian jendela, atur parameter startup seperti yang ditunjukkan pada kode berikut.

ScanRequest scanRequest = new ScanRequest();

// Atur gaya UI halaman pemindaian.
scanRequest.setScanType(ScanRequest.ScanType.QRCODE);  // Gaya QR code
scanRequest.setScanType(ScanRequest.ScanType.BARCODE); // Gaya barcode, default

// Atur judul antarmuka pemindaian.
scanRequest.setTitleText("Standard Scan");

// Atur teks prompt di bawah jendela pemindaian.
scanRequest.setViewText("Prompt text");

// Atur teks prompt untuk menyalakan senter. Didukung hanya pada baseline 10.1.60 ke atas.
scanRequest.setOpenTorchText("Turn on flashlight");

// Atur teks prompt untuk mematikan senter. Didukung hanya pada baseline 10.1.60 ke atas.
scanRequest.setCloseTorchText("Turn off flashlight");

// Atur jenis pengenalan pemindaian. Didukung hanya pada baseline 10.1.60.6+ dan 10.1.68.2+.
// Pengaturan ini hanya berlaku untuk pemindaian langsung, bukan untuk mengenali gambar dari album foto.
scanRequest.setRecognizeType(
    ScanRequest.RecognizeType.QR_CODE,    // QR code
    ScanRequest.RecognizeType.BAR_CODE,   // Barcode
    ScanRequest.RecognizeType.DM_CODE,    // DM code
    ScanRequest.RecognizeType.PDF417_Code // PDF417 code
); // Jika tidak diatur, tiga jenis pertama akan dikenali secara default.

// Atur status bar transparan (berlaku pada Android 4.4+). Didukung hanya pada baseline 10.1.68.15+.
scanRequest.setTranslucentStatusBar(true);

// Sembunyikan tombol album foto. Didukung hanya pada baseline 10.1.68.22+.
scanRequest.setNotSupportAlbum(true);

Gunakan fitur pemindaian dengan UI kustom

Untuk informasi lebih lanjut, lihat contoh kode.

Menyesuaikan UI kustom untuk upgrade

  • Mulai dari versi 10.2.3.35, Scan SDK menyediakan kelas MPCustomScanView dan antarmuka terkait untuk menggantikan MPScanner dalam mengimplementasikan UI kustom. Dibandingkan dengan MPScanner, solusi MPCustomScanView mengenkapsulasi proses inti layanan Scan, seperti manajemen kamera, pengenalan kode, pengenalan multi-kode, pembesaran gambar, dan penguraian hasil kode. Hal ini memungkinkan Anda fokus pada implementasi UI kustom di dalam MPCustomScanView tanpa perlu mengelola operasi dasar tersebut. Anda masih dapat menggunakan MPScanner, tetapi kelas ini tidak lagi dipelihara dan tidak akan menerima pembaruan fitur yang selaras dengan UI layar penuh, seperti pengenalan multi-kode. Kami menyarankan Anda beralih ke solusi MPCustomScanView untuk mengimplementasikan UI kustom Anda saat memungkinkan. Solusi ini akan tetap selaras dengan UI layar penuh dalam pembaruan fitur di masa depan.

  • Mulai dari versi 10.1.68.5 dan 10.1.60.11, Scan SDK menyertakan kelas MPScanner dan antarmuka terkait. Antarmuka ini menggantikan antarmuka lama, seperti BQCScanCallback dan MaScanCallback, untuk pemindaian kustom. Dibandingkan dengan antarmuka lama, MPScanner menawarkan enkapsulasi lengkap, API yang sederhana, serta dukungan fitur tambahan, seperti callback untuk cahaya sekitar yang tidak mencukupi. Jika Anda masih menggunakan antarmuka lama seperti BQCScanCallback dan MaScanCallback, Anda mungkin perlu menyesuaikan perubahan berikut saat melakukan upgrade dari versi lama:

    • Versi 10.1.68.22: Antarmuka baru ditambahkan ke kelas MaScanCallback, BQCScanCallback, dan IOnMaSDKDecodeInfo. Berikan implementasi kosong untuk antarmuka ini dan pastikan metode MaScanCallback.onMaCodeInterceptor mengembalikan nilai `false`.

    • Versi 10.1.60.6: Antarmuka baru ditambahkan ke kelas BQCScanCallback. Berikan implementasi kosong untuk antarmuka ini.

    • Versi 10.1.60: Antarmuka baru ditambahkan ke kelas BQCScanCallback. Berikan implementasi kosong untuk antarmuka ini.

    • Versi 10.1.20: Antarmuka kelas MaScanCallback berubah dari void onResultMa(MaScanResult maScanResult) menjadi void onResultMa(MultiMaScanResult multiMaScanResult). Anda dapat memperoleh MaScanResult sebagai berikut:

      MaScanResult maScanResult = multiMaScanResult.maScanResults[0];

Referensi API UI kustom

MPCustomScanView

Untuk menggunakan MPCustomScanView, buat kelas Activity Anda mewarisi dari MPaasToolsCaptureActivity. Lalu, implementasikan metode getCustomScanView untuk mengembalikan MPCustomScanView kustom Anda.

public class MyScanActivity extends MPaasToolsCaptureActivity {

    private MyScanView myScanView;

    @Override
    protected MPCustomScanView getCustomScanView() {
        myScanView = new MyScanView(this);
        // Untuk detailnya, lihat contoh kode di GitHub.
        return myScanView;
    }
  
}

Anda dapat mengimplementasikan atau memanggil metode berikut di dalam MPCustomScanView:

/**
 * Callback saat pemindaian dimulai.
 */
public void onStartScan();

/**
 * Callback saat frame pertama dari kamera ditampilkan.
 * 
 * Urutan eksekusi metode ini dan callback pemindaian dimulai tidak dijamin.
 */
public void onPreviewShow();

/**
 * Callback saat pemindaian dihentikan.
 */
public void onStopScan();

/**
 * Callback untuk nilai grayscale frame kamera.
 * Ini dipanggil untuk setiap frame selama pemindaian.
 * 
 * @param gray Nilai rata-rata grayscale, yang dapat digunakan untuk mengukur kecerahan sekitar.
 */
public void onGetAvgGray(int gray);

/**
 * Callback saat pemindaian berhasil (kode dikenali).
 * 
 * @param context Konteks saat ini.
 * @param list Hasil kode yang dikenali.
 */
public abstract void onScanFinished(Context context, List<MPScanResult> list);

/**
 * Callback saat pemindaian gagal.
 * 
 * @param context Konteks saat ini.
 * @param error Alasan kegagalan.
 */
public abstract void onScanFailed(Context context, MPScanError error);

/**
 * Callback saat kamera gagal dibuka.
 */
public void onCameraOpenFailed();

/**
 * Mengaktifkan atau menonaktifkan senter.
 * 
 * @return Status senter setelah metode ini dipanggil.
 */
public boolean switchTorch();

/**
 * Mengenali kode dari file.
 * 
 * @param path Path file.
 * @return Hasil kode yang dikenali.
 */
public List<MPScanResult> scanFromPath(String path);

MPScanResult

/**
 * String hasil yang dikenali.
 */
private String text;

/**
 * Jenis kode yang dikenali.
 */
private MPRecognizeType mpRecognizeType;

/**
 * Koordinat pusat kode yang dikenali.
 */
private Point centerPoint;

Alur permintaan izin kustom

Untuk menyesuaikan alur permintaan izin, implementasikan antarmuka PermissionDelegate:

public class MyScanActivity extends MPaasToolsCaptureActivity implements PermissionDelegate{

    /**
     * Memulai permintaan izin. Pengguna dapat mengimplementasikan interaksi permintaan izin sendiri atau memberikan penjelasan di sini.
     * Catatan: Setelah menangani logika Anda sendiri, Anda harus meminta izin. Jika tidak, proses akan diblokir.
     * @param fragment      Halaman pemindaian.
     * @param requestCode   1: Izin kamera.
     * @param permissions   Izin yang diminta.
     */
    @Override
    public void onRequestPermission(Fragment fragment, final int requestCode, final String[] permissions) {
        // Tangani izin kamera.
        if(requestCode == 1){
            // Tangani logika bisnis Anda.
            showPermissionTipDialog();
        }
        // Ini harus dipanggil untuk memulai permintaan izin.
        fragment.requestPermissions(permissions, requestCode);
    }

    /**
     * Callback saat izin berhasil diberikan.
     */
    @Override
    public void onPermissionGranted(Fragment fragment, int requestCode, String[] permissions, int[] grantResults) {
        dismissPermissionTipDialog();
    }

    /**
     * Callback saat izin ditolak.
     */
    @Override
    public void onPermissionDenied(Fragment fragment, int requestCode, String[] permissions, int[] grantResults) {
        dismissPermissionTipDialog();
    }
}

MPScanner (Deprecated)

Pengaturan terkait UI kustom adalah sebagai berikut:

/**
 * Menetapkan View yang menampilkan konten kamera.
 * Panggil ini di metode `onConfiguration` dari `{@link MPScanListener}`.
 *
 * @param textureView TextureView di halaman pemindaian kustom.
 */
public void setDisplayView(TextureView textureView);

/**
 * Menetapkan area untuk pengenalan pemindaian.
 * 
 * @param rect Area pengenalan.
 */
public void setScanRegion(Rect rect);

/**
 * Menetapkan pendengar pemindaian.
 */
public void setMPScanListener(MPScanListener mpScanListener);

/**
 * Menetapkan pendengar untuk nilai grayscale gambar.
 */
public void setMPImageGrayListener(MPImageGrayListener mpImageGrayListener);

/**
 * Mendapatkan objek Camera.
 * 
 * @return Objek Camera.
 */
public Camera getCamera();

/**
 * Menetapkan jenis kode yang akan dikenali.
 * Ini hanya berlaku untuk pemindaian langsung, bukan untuk mengenali kode dari bitmap.
 *
 *
 * @param recognizeTypes BAR_CODE untuk barcode, QR_CODE untuk QR code, DM_CODE untuk DM code, dan PDF417_CODE untuk kode PDF417.
 *                       Jika tidak diatur, tiga jenis pertama akan dikenali secara default.
 */
public void setRecognizeType(MPRecognizeType... recognizeTypes);

Operasi pemindaian terkait UI kustom adalah sebagai berikut:

/**
 * Membuka kamera dan memulai pemindaian.
 * 
 * Panggil ini saat pertama kali masuk ke halaman atau saat kamera mati.
 */
public void openCameraAndStartScan();

/**
 * Menutup kamera dan menghentikan pemindaian.
 */
public void closeCameraAndStopScan();

/**
 * Memulai pemindaian.
 * 
 * Ini tidak mengubah status kamera. Harus dipanggil saat kamera menyala agar berlaku.
 */
public void startScan();

/**
 * Menghentikan pemindaian.
 *
 * Ini tidak mengubah status kamera.
 */
public void stopScan();

/**
 * Mengenali kode dari bitmap.
 *
 * @param bitmap Bitmap yang akan dikenali.
 * @return Hasil pemindaian.
 */
public MPScanResult scanFromBitmap(Bitmap bitmap);

Lainnya:

/**
 * Menyalakan atau mematikan senter.
 *
 * @return Apakah senter menyala setelah metode ini dipanggil.
 */
public boolean switchTorch();

/**
 * Menyalakan senter.
 */
public void openTorch();

/**
 * Mematikan senter.
 */
public void closeTorch();

/**
 * Memainkan suara beep default.
 */
public void beep();

/**
 * Melepaskan sumber daya.
 * 
 * Panggil metode ini di onDestroy.
 */
public void release();

MPScanListener (Deprecated)

/**
 * Dipanggil saat konfigurasi parameter pemindaian selesai.
 */
void onConfiguration();

/**
 * Dipanggil saat proses pemindaian dan deteksi dimulai.
 */
void onStart();

/**
 * Dipanggil saat deteksi berhasil.
 *
 * @param result Hasil deteksi.
 */
void onSuccess(MPScanResult result);

/**
 * Dipanggil saat terjadi error deteksi.
 *
 * @param error Error tersebut.
 */
void onError(MPScanError error);

MPImageGrayListener (Deprecated)

/**
 * Mendapatkan nilai rata-rata grayscale gambar.
 *
 * Rentang normal kira-kira 50 hingga 140.
 * Jika nilai grayscale berada di luar rentang ini, biasanya menunjukkan kecerahan sekitar terlalu rendah atau terlalu tinggi. Anda dapat menggunakan informasi ini untuk meminta pengguna menyalakan atau mematikan senter.
 * Catatan: Metode ini dipanggil terus-menerus selama proses pengenalan.
 *
 * @param gray Nilai rata-rata grayscale gambar.
 */
void onGetImageGray(int gray);