All Products
Search
Document Center

SuperApp:Konfigurasi fungsi pemindaian pratinjau mini program

Last Updated:Apr 01, 2026

Artikel ini menjelaskan cara mengonfigurasi fungsi pemindaian pratinjau mini program di sisi Android.

1. Pendahuluan

Setelah mini app dikirimkan ke open platform tetapi sebelum administrator menyetujui rilisnya, pihak terkait dapat memindai QR code untuk melihat pratinjau mini app tersebut.

image

2. Konfigurasi fungsi pemindaian pratinjau

2.1. Impor library QR code

implementation 'com.aliyun.emas.suite.foundation:lib-scan:1.0.7'

2.2. Tambahkan kelas & kode berikut

ScanQRCodeActivity.java

package com.alibaba.module.android.mini.app;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;

import com.alibaba.emas.android.mini.app.MiniAppService;
import com.alibaba.module.android.core.servicebus.service.ServiceManager;
import com.alibaba.module.android.mini.app.api.IMiniAppService;
import com.alibaba.module.android.mini.app.api.MiniAppInitConfig;
import com.alibaba.module.android.mini.app.api.OnOpenMiniAppListener;
import com.superapp.lib.scan.common.IScan;
import com.superapp.lib.scan.common.ScanFactory;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

public class ScanQRCodeActivity extends FragmentActivity {

    private static final String TAG = "ScanQRCodeActivity";
    private static final int REQUEST_SCAN = 10;

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


        setContentView(R.layout.activity_preview_scan);
        findViewById(R.id.scan).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startQRCodeScan();
            }
        });


        initSDK();
    }

    private void initSDK() {
        MiniAppInitConfig config = new MiniAppInitConfig.Builder()
                .setUseWindVane(true)
                .setUseUniApp(true)
                .setHost("your Host")
                .setAppCode("your App Code")
                .setAccessKey("your access key")
                .setSecretKey("your secret key")

                .setNeedAuthFromApp(true)

                .openLog(true)
                .build();
        IMiniAppService miniAppService = new MiniAppService();
        miniAppService.initialize(this.getApplication(), config);
        ServiceManager.getInstance().registerService(IMiniAppService.class.getName(), miniAppService);
    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != Activity.RESULT_OK || data == null) {
            Toast.makeText(ScanQRCodeActivity.this, "User cancel scan", Toast.LENGTH_SHORT).show();
            return;
        }

        if (requestCode != REQUEST_SCAN) {
            Toast.makeText(ScanQRCodeActivity.this, "Request code error", Toast.LENGTH_SHORT).show();
            return;
        }

        String content = data.getStringExtra("content");
        String format = data.getStringExtra("format");
        if (TextUtils.isEmpty(content)) {
            Toast.makeText(ScanQRCodeActivity.this, "Scan not result", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(ScanQRCodeActivity.this, "content " + content + " format " + format, Toast.LENGTH_SHORT).show();
        }

        Log.i(TAG, "onActivityResult: " + "content " + content + " format " + format);
        handleScanResult(content);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode != REQUEST_SCAN) {
            return;
        }

        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startQRCodeScanImpl();
        } else {
            Toast.makeText(ScanQRCodeActivity.this, "Please grant camera permission", Toast.LENGTH_SHORT).show();
        }
    }

    private void startQRCodeScan() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(ScanQRCodeActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                startQRCodeScanImpl();
            } else {
                ActivityCompat.requestPermissions(ScanQRCodeActivity.this, new String[]{ Manifest.permission.CAMERA }, REQUEST_SCAN);
            }
        } else {
            startQRCodeScanImpl();
        }

    }

    private void startQRCodeScanImpl() {
        boolean isOpenFlight = false;
        String title = "";

        IScan iScan = ScanFactory.createScan("com.superapp.lib.scan.zxing.ZxingScan");
        if (iScan != null) {
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("openFlight", isOpenFlight);
            hashMap.put("title", title);
            iScan.startScan(ScanQRCodeActivity.this, hashMap);
        }
    }

    private boolean handleScanResult(String content) {
        try {
            URL url = new URL(content);
            String path = url.getPath();

            Log.d(TAG, "handleScanResult: " + path);

            if (TextUtils.equals(path, "/emas/preview") || TextUtils.equals(path, "//emas/preview")) {
                String query = url.getQuery();
                String[] keyValues = query.split("&");
                String publishId = null;
                String appId = null;
                for (String keyValue : keyValues) {
                    String[] key2value = keyValue.split("=");
                    if (key2value.length != 2) {
                        continue;
                    }
                    if (TextUtils.equals(key2value[0], "publishId")) {
                        publishId = key2value[1];
                    } else if (TextUtils.equals(key2value[0], "appId")) {
                        appId = key2value[1];
                    }
                }

                Log.i(TAG, "onActivityResult: " + "appId " + appId + " publishId " + publishId);

                if (!TextUtils.isEmpty(appId) && !TextUtils.isEmpty(publishId)) {
                    IMiniAppService miniAppService = ServiceManager.getInstance().getService(IMiniAppService.class.getName());
                    if (miniAppService != null) {
                        miniAppService.previewMiniApp(ScanQRCodeActivity.this, appId, publishId, null, new OnOpenMiniAppListener() {
                            @Override
                            public void onOpenMiniApp() {
                                Toast.makeText(ScanQRCodeActivity.this, "opening", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onOpenSuccess(String appId) {
                                Toast.makeText(ScanQRCodeActivity.this, "success", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onOpenFailed(String appId, int errorCode) {
                                Toast.makeText(ScanQRCodeActivity.this, "open failed", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                    return true;
                }
            }
        } catch (MalformedURLException e) {
            Log.e(TAG, "handleScanResult: " + e.getMessage());
        }

        return false;
    }


}

activity_preview_scan.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#F0EFFD"
  android:fitsSystemWindows="true"
  android:orientation="vertical">

  <Button
    android:id="@+id/scan"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_marginStart="20dp"
    android:text="Preview" />

</LinearLayout>