在完成调用芝麻信用人脸识别的时候,有一些可以记录下来的内容
/**
* 启动支付宝进行认证
* @param url 开放平台返回的URL
*/private void doVerify(String url) {
if (hasApplication()) {
Intent action = new Intent(Intent.ACTION_VIEW);
StringBuilder builder = new StringBuilder();
// 这里使用固定appid 20000067
builder.append("alipays://platformapi/startapp?appId=20000067&url=");
builder.append(URLEncoder.encode(url));
action.setData(Uri.parse(builder.toString()));
startActivity(action);
} else {
// 处理没有安装支付宝的情况
new AlertDialog.Builder(this)
.setMessage("是否下载并安装支付宝完成认证?")
.setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent action = new Intent(Intent.ACTION_VIEW);
startActivity(action);
}
}).setNegativeButton("算了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
/**
* 判断是否安装了支付宝
* @return true 为已经安装
*/private boolean hasApplication() {
PackageManager manager = getPackageManager();
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("alipays://"));
List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER);
return list != null && list.size() > 0;
}
此处是通过服务端返回的url,给到芝麻信用官方给的调用支付宝人脸识别的方法,但是此处的url中包含认证成功或者失败之后回调的地址,其实这边不能叫回调,相当于H5打开app的那种链接URL Scheme
URL Scheme 当前页面发送出去的给支付宝的消息,支付宝如何回复?然后回复还能到达指定界面呢?
在需要调用芝麻信用人脸的页面,在AndroidManifest中配置
<!--要想在别的App上能成功调起App,必须添加intent过滤器-->
<intent-filter>
<!--协议部分,随便设置-->
<data android:scheme="xl" android:host="goods" android:path="/goodsDetail" android:port="8888"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
android:exported="false"
与
<action android:name="android.intent.action.VIEW"/>
冲突,所以不能设置
android:exported="false"
Uri data = getIntent().getData();
String goodsId = data.getQueryParameter("goodsId");
会得到下面数据:
params=YFK2tv7LqO05yH3sYA3XGSzUiEPDuWPk9AuAvT7ufMLscnDtqeSIATBRqZQgPw1dbxzJOCTbXEyCpizTa7hdFqB2FMo6o%2F1hDFjPyHIdkIFEv13Sj8PfCtcN2szcGeJDxmbsN2XoYgadDBFXBg5Y4F2CA4lKeksdotSKAnymaMc%3D&sign=By1D32vhk0QmewDQYQK50dwHtNv73Tdio7PPd%2FvjJJWKhhNCA2kl3hchApqDib4LlLDtDEOQxxLBKujiepjbmQN%2F2N2PNj9lJLluKnpBVEpTMvKbPLhn3opFmbdky%2F9Esj%2BuJRd8HENykCUsUKHXlYpSZKma7K%2F9%2FuTRY2sU%2FPY%3D
返回的数据需要后端解析,才能得出认证的结果.
最后几个小问题
1.在设置intent-filter中的data的时候,如果是放在app的入口Activity上,host和scheme的首字母要小写,不然会出现app图标找不到的情况
2.如何判断一个Scheme是否有效
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
startActivity(intent);
}