Android开发中,如何实现支付宝扫一扫功能,用Java写出完整代码,要有注释,不许省略。
<?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:gravity="center"
android:orientation="vertical">
<!-- 调用支付宝扫一扫的按钮 -->
<Button
android:id="@+id/btn_alipay_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用支付宝扫一扫"
android:textSize="18sp" />
</LinearLayout>
----------------------------------------------------------------------------------------------------
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
// 支付宝扫一扫请求码(用于识别返回结果)
private static final int REQUEST_CODE_ALIPAY_SCAN = 1001;
// 支付宝包名(需确认,主流版本为com.eg.android.AlipayGphone )
private static final String ALIPAY_PACKAGE_NAME = "com.eg.android.AlipayGphone";
// 支付宝扫一扫Action(固定)
private static final String ALIPAY_SCAN_ACTION = "android.intent.action.SCAN";
private Button btnAlipayScan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化按钮
btnAlipayScan = findViewById(R.id.btn_alipay_scan);
// 设置按钮点击事件
btnAlipayScan.setOnClickListener(v -> startAlipayScan());
}
/**
* 启动支付宝扫一扫功能
*/
private void startAlipayScan() {
// 1. 检查支付宝是否安装
if (!isAlipayInstalled()) {
Toast.makeText(this, "请先安装支付宝", Toast.LENGTH_SHORT).show();
return;
}
// 2. 构建调用支付宝扫一扫的Intent
Intent intent = new Intent();
// 设置支付宝包名(确保只启动支付宝)
intent.setPackage(ALIPAY_PACKAGE_NAME);
// 设置扫一扫Action
intent.setAction(ALIPAY_SCAN_ACTION);
// 可选:指定扫描类型(二维码),若需扫描条形码用PRODUCT_MODE
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
// 可选:设置扫描界面标题(部分版本支持)
intent.putExtra("SCAN_TITLE", "请扫描二维码");
try {
// 3. 启动支付宝扫一扫,并等待结果返回
startActivityForResult(intent, REQUEST_CODE_ALIPAY_SCAN);
} catch (Exception e) {
// 捕获异常(如版本过低、不支持该Action)
Toast.makeText(this, "无法启动支付宝扫一扫,请检查版本", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
/**
* 检查支付宝是否安装
* @return true:已安装;false:未安装
*/
private boolean isAlipayInstalled() {
PackageManager pm = getPackageManager();
try {
// 获取支付宝包信息(若抛出异常则未安装)
PackageInfo info = pm.getPackageInfo(ALIPAY_PACKAGE_NAME, 0);
return info != null;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/**
* 处理支付宝扫一扫返回的结果
* @param requestCode 请求码(与启动时一致)
* @param resultCode 结果码(RESULT_OK:成功;RESULT_CANCELED:取消)
* @param data 返回的Intent(包含扫描结果)
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 仅处理支付宝扫一扫的返回结果
if (requestCode != REQUEST_CODE_ALIPAY_SCAN) return;
// 结果处理逻辑
if (resultCode == RESULT_OK && data != null) {
// 获取扫描结果(键为SCAN_RESULT,需确认支付宝版本是否支持)
String scanResult = data.getStringExtra("SCAN_RESULT");
if (scanResult != null && !scanResult.isEmpty()) {
Toast.makeText(this, "扫描结果:" + scanResult, Toast.LENGTH_LONG).show();
// 在这里处理扫描结果(如跳转链接、解析支付信息)
handleScanResult(scanResult);
} else {
Toast.makeText(this, "扫描结果为空", Toast.LENGTH_SHORT).show();
}
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "扫描已取消", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "扫描失败", Toast.LENGTH_SHORT).show();
}
}
/**
* 处理扫描结果(根据业务需求自定义)
* @param result 扫描得到的字符串(如二维码内容)
*/
private void handleScanResult(String result) {
// 示例:若结果是URL,跳转至浏览器
if (result.startsWith("http://") || result.startsWith("https://")) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
browserIntent.setData(android.net.Uri.parse(result));
startActivity(browserIntent);
} else {
// 其他类型结果(如文本),直接显示
Toast.makeText(this, "扫描结果:" + result, Toast.LENGTH_LONG).show();
}
}
}