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