iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现人脸支付的示例代码
  • 546
分享到

Android实现人脸支付的示例代码

2024-04-02 19:04:59 546人浏览 泡泡鱼
摘要

目录效果展示功能实现人脸支付密码框输入支付尾言效果展示 人脸支付效果视频 密码框输入支付效果视频 因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏

效果展示

人脸支付效果视频

密码框输入支付效果视频

因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏黑屏,故使用另一台手机拍摄。

功能实现

人脸支付

api初始化

        ftEngine = new FaceEngine();
        ftInitCode = ftEngine.init(this, DetectMode.ASF_DETECT_MODE_VIDEO, ConfigUtil.getFtOrient(this),
                16, MAX_DETECT_NUM, FaceEngine.ASF_FACE_DETECT);

        frEngine = new FaceEngine();
        frInitCode = frEngine.init(this, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_0_ONLY,
                16, MAX_DETECT_NUM, FaceEngine.ASF_FACE_RECOGNITION);

        flEngine = new FaceEngine();
        flInitCode = flEngine.init(this, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_0_ONLY,
                16, MAX_DETECT_NUM, FaceEngine.ASF_LIVENESS);

人脸特征提取

    private void searchFace(final FaceFeature frFace, final Integer requestId) {
        Observable.create(new ObservableOnSubscribe<CompareResult>() {
                    @Override
                    public void subscribe(ObservableEmitter<CompareResult> emitter) {
                        CompareResult compareResult = FaceServer.getInstance().getTopOfFaceLib(frFace);
                        emitter.onNext(compareResult);
                    }
                })
                .subscribeOn( Schedulers.computation())
                .observeOn( AndroidSchedulers.mainThread())
                .subscribe(new Observer<CompareResult>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(CompareResult compareResult) {
                        if (compareResult == null || compareResult.getUserName() == null) {
                            requestFeatureStatusMap.put(requestId, RequestFeatureStatus.FAILED);
                            faceHelper.setName(requestId, "VISITOR " + requestId);
                            return;
                        }
                        if (compareResult.getSimilar() > SIMILAR_THRESHOLD) {
                            boolean isAdded = false;
                            if (compareResultList == null) {
                                requestFeatureStatusMap.put(requestId, RequestFeatureStatus.FAILED);
                                faceHelper.setName(requestId, "VISITOR " + requestId);
                                return;
                            }
                            for (CompareResult compareResult1 : compareResultList) {
                                if (compareResult1.getTrackId() == requestId) {
                                    isAdded = true;
                                    break;
                                }
                            }
                            if (!isAdded) {
                                //对于多人脸搜索,假如最大显示数量为 MAX_DETECT_NUM 且有新的人脸进入,则以队列的形式移除
                                if (compareResultList.size() >= MAX_DETECT_NUM) {
                                    compareResultList.remove(0);
                                    adapter.notifyItemRemoved(0);
                                }
                                //添加显示人员时,保存其trackId
                                compareResult.setTrackId(requestId);
                                compareResultList.add(compareResult);
                                adapter.notifyItemInserted(compareResultList.size() - 1);
                            }
                            requestFeatureStatusMap.put(requestId, RequestFeatureStatus.SUCCEED);
                            faceHelper.setName(requestId, getString(R.string.recognize_success_notice, compareResult.getUserName()));

                        } else {
                            faceHelper.setName(requestId, getString(R.string.recognize_failed_notice, "NOT_REGISTERED"));
                            retryRecognizeDelayed(requestId);
                        }
                    }

返回支付结果

根据匹配人脸注册时所获取的trackid,判断识别结果

Integer recognizeStatus = requestFeatureStatusMap.get(facePreviewInfoList.get(i).getTrackId());

根据返回码修改识别框颜色,并修改跳转状态的值

if (recognizeStatus != null) {
                handler.sendEmptyMessageDelayed( 1,1000 );
                if (recognizeStatus == RequestFeatureStatus.FAILED) {
                    color = RecognizeColor.COLOR_FAILED;
                    returnFlag = false;
                }
                if (recognizeStatus == RequestFeatureStatus.SUCCEED) {
                    color = RecognizeColor.COLOR_SUCCESS;
                    returnFlag = true;
                }
            }

利用异步通信进行延迟跳转

    Handler handler = new Handler(  ){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage( msg );
            if (msg.what == 1){
                CountDown();
                handler.sendEmptyMessageDelayed( 1,1000 );
            }
        }
    };

密码框输入支付

自定义密码输入框控件

public class PayPwdEditText extends RelativeLayout {

    private EditText editText; //文本编辑框
    private Context context;

    private LinearLayout linearLayout; //文本密码的文本
    private TextView[] textViews; //文本数组

    private int pwdlength = 6; //密码长度, 默认6

    private OnTextFinishListener onTextFinishListener;


    public PayPwdEditText(Context context) {
        this(context, null);
    }

    public PayPwdEditText(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PayPwdEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
    }

    
    public void initStyle(int bgdrawable, int pwdlength, float splilinewidth, int splilinecolor, int pwdcolor, int pwdsize)
    {
        this.pwdlength = pwdlength;
        initEdit(bgdrawable);
        initShowInput(bgdrawable, pwdlength, splilinewidth, splilinecolor, pwdcolor, pwdsize);
    }

    
    private void initEdit(int bGColor)
    {
        editText = new EditText(context);
        editText.setBackgroundResource(bgcolor);
        editText.setCursorVisible(false);
        editText.setTextSize(0);
        //设置为密文输入模式和数字
        editText.setInputType( InputType.TYPE_NUMBER_VARIATION_PASSWord | InputType.TYPE_CLASS_NUMBER);
        //设置输入长度为6
        editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(pwdlength)});
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Editable etext = editText.getText();
                Selection.setSelection(etext, etext.length());
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                initDatas(s);
                if(s.length() == pwdlength)
                {
                    if(onTextFinishListener != null)
                    {
                        onTextFinishListener.onFinish(s.toString().trim());
                    }
                }
            }
        });
        LayoutParams lp = new LayoutParams( LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        lp.addRule( RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        addView(editText, lp);

    }

    
    public void initShowInput(int bgcolor, int pwdlength, float slpilinewidth, int splilinecolor, int pwdcolor, int pwdsize)
    {
        //添加密码框父布局
        linearLayout = new LinearLayout(context);
        linearLayout.setBackgroundResource(bgcolor);
        LayoutParams layoutParams = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        linearLayout.setLayoutParams(layoutParams);
        linearLayout.setOrientation( LinearLayout.HORIZONTAL);
        addView(linearLayout);

        //添加密码框
        textViews = new TextView[pwdlength];
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT);
        params.weight = 1;
        params.gravity = Gravity.CENTER;

        LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(dip2px(context, slpilinewidth), LayoutParams.MATCH_PARENT);
        for(int i = 0; i < textViews.length; i++)
        {
            final int index = i;
            TextView textView = new TextView(context);
            textView.setGravity( Gravity.CENTER);
            textViews[i] = textView;
            textViews[i].setTextSize(pwdsize);
            textViews[i].setTextColor(context.getResources().getColor(pwdcolor));
            textViews[i].setInputType( InputType.TYPE_NUMBER_VARIATION_PASSWORD | InputType.TYPE_CLASS_NUMBER);
            linearLayout.addView(textView, params);
            if(i < textViews.length - 1)
            {
                View view = new View(context);
                view.setBackgroundColor(context.getResources().getColor(splilinecolor));
                linearLayout.addView(view, params2);
            }
        }
    }

    
    public void setShowPwd(boolean showPwd) {
        int length = textViews.length;
        for(int i = 0; i < length; i++) {
            if (showPwd) {
                textViews[i].setTransfORMationMethod( PasswordTransformationMethod.getInstance());
            } else {
                textViews[i].setTransformationMethod( HideReturnsTransformationMethod.getInstance());
            }
        }
    }

    
    public void setInputType(int type)
    {
        int length = textViews.length;
        for(int i = 0; i < length; i++) {
            textViews[i].setInputType(type);
        }
    }

    
    public void clearText()
    {
        editText.setText("");
        for(int i = 0; i < pwdlength; i++)
        {
            textViews[i].setText("");
        }
    }

    public void setOnTextFinishListener(OnTextFinishListener onTextFinishListener) {
        this.onTextFinishListener = onTextFinishListener;
    }

    
    public void initDatas(Editable s)
    {
        if(s.length() > 0)
        {
            int length = s.length();
            for(int i = 0; i < pwdlength; i++)
            {
                if(i < length)
                {
                    for(int j = 0; j < length; j++)
                    {
                        char ch = s.charAt(j);
                        textViews[j].setText( String.valueOf(ch));
                    }
                }
                else
                {
                    textViews[i].setText("");
                }
            }
        }
        else
        {
            for(int i = 0; i < pwdlength; i++)
            {
                textViews[i].setText("");
            }
        }
    }

    public String getPwdText()
    {
        if(editText != null)
            return editText.getText().toString().trim();
        return "";
    }

    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    public interface OnTextFinishListener
    {
        void onFinish(String str);
    }

    public void setFocus()
    {
        editText.requestFocus();
        editText.setFocusable(true);
        showKeyBord(editText);
    }

    
    public void showKeyBord(View view)
    {
        InputMethodManager imm = (InputMethodManager) context.getSystemService( Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
    }

}

初始化控件

分别对应密码框背景、密码位数、分割线宽度、分割线颜色、字体颜色、字体大小

mPayPwdEditText.initStyle( R.drawable.bg_paypassword_style,6,0.8f,R.color.colorWhite,R.color.colorWhite,35);

布局内用法

<com.example.PayPackage.PayPwdEditText
    android:id="@+id/payPassWordEditText"
    android:layout_width="match_parent"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_height="35dp"/>

密码匹配

对控件进行输入事件监听,采用测试密码用例:123456,与回调接口所携带的数据进行匹配。

 mPayPwdEditText.setOnTextFinishListener( new PayPwdEditText.OnTextFinishListener() {
            @Override
            public void onFinish(String str) {
                if (str.equals( "123456" ))
                {
                    startActivity( new Intent( OrderInterface.this,PaySuccess.class ) );
                }else {
                    if (PassWordError == null) {
                        PassWordError = new Toast( OrderInterface.this );
                        View view = LayoutInflater.from( OrderInterface.this ).inflate( R.layout.passworderror,null,false );
                        ErrorTips = view.findViewById( R.id.ErrorTips );
                        PassWordError.setView( view );
                        //PassWordError.setGravity( Gravity.CENTER,0, ResHelper.dipToPx(OrderInterface.this, -100) );
                    }
                    PassWordError.show();
                    mPayPwdEditText.clearText();
                }
            }
        } );

其内部是对EditText控件进行输入事件监听。然后通过比对输入字符串长度与密码长度,然后返回其输入的字符串

            @Override
            public void afterTextChanged(Editable s) {
                initDatas(s);
                if(s.length() == pwdlength)
                {
                    if(onTextFinishListener != null)
                    {
                        onTextFinishListener.onFinish(s.toString().trim());
                    }
                }
            }

尾言

此人脸识别API采用虹软ArcSoft

到此这篇关于Android实现人脸支付的文章就介绍到这了,更多相关Android 人脸支付内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android实现人脸支付的示例代码

本文链接: https://www.lsjlt.com/news/139849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现人脸支付的示例代码
    目录效果展示功能实现人脸支付密码框输入支付尾言效果展示 人脸支付效果视频 密码框输入支付效果视频 因为密码支付时会调起系统安全键盘,开启自动保护功能,防止泄露,会导致输入密码时录屏...
    99+
    2024-04-02
  • Android支付宝支付的示例代码
    上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程。1、首先给出官方文档的地址Android集成支付宝流程...
    99+
    2023-05-30
    android 支付宝 支付
  • Vue+SpringBoot实现支付宝沙箱支付的示例代码
    首先去下载支付宝沙箱的一系列东西,具体的配置什么的我就不说了,有很多博客都讲了,还有蚂蚁金服官方也说的很详细,我就直接说怎么样把后端的支付页面显示到Vue前端来: 在你配置好Ali...
    99+
    2024-04-02
  • JavaCV实现图片中人脸检测的示例代码
    目录前言一、javaCV是什么二、使用步骤1.引入库2.代码教程总结前言 今天微信群里聊天,群友问道有没有能让人脸露牙齿的接口,我记得想百度阿里的都应该有类似人脸识别,分析、融合的a...
    99+
    2022-11-13
    JavaCV图片人脸检测 JavaCV 人脸检测
  • Python三十行代码实现简单人脸识别的示例代码
    一、库介绍 opencv,face_recognition,numpy,以及dlib 注意: 安装opencv速度可能过慢,需要更换国内镜像源,参考:https://www.jb...
    99+
    2024-04-02
  • vue+axios实现图片上传识别人脸的示例代码
    目录Axios请求 Qs处理数据分析 Vant上传文件格式 完整代码 本文主要介绍了vue+axios实现图片上传识别人脸的示例代码,分享给大家,具体如下: 先看最终效果: 这里采...
    99+
    2024-04-02
  • Java微信支付之服务号支付代码示例
    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servlet,一个是统一下单Unifiedord...
    99+
    2023-05-30
    java 微信开发 ava
  • Android实现支付宝支付密码输入界面
    本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下 效果图: 主要代码: import java.util.ArrayList;   ...
    99+
    2024-04-02
  • SpringBoot集成支付宝沙箱支付的实现示例
    目录开发前准备1、密钥工具2、沙箱环境3、内网穿透工具代码集成1、Java SDK2、支付宝配置3、支付和回调接口4、前端Vue调用开发前准备 1、密钥工具 在线工具地址:https...
    99+
    2024-04-02
  • Java实现支付对接常用加密方式的示例代码
    目录一、术语表1.对称算法2.非对称算法3.可逆加密算法4.不可逆算法5.加密盐二、传统加密算法介绍DES(Data Encryption Standard)AES算法RSA算法MD...
    99+
    2023-02-09
    Java实现支付加密方式 Java支付加密 Java 加密
  • uniapp app 人脸识别的实现示例
    由于 小程序端 有camera组件 直接就可以调起摄像头 但是 app端是不支持这个标签的 所以只能用其他的方法 使用 nvue 中 live-pusher 组件 子组件&...
    99+
    2024-04-02
  • 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)
    人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目...
    99+
    2023-08-31
    android 人脸识别 人脸检测 android人脸识别
  • vue项目中扫码支付的实现示例(附demo)
    目录需求背景思路分析UI展示开始使用一 编写支付组件模板二 支付组件的JS相关代码和说明附:组件JS完整的源码需求背景 市场报告列表展示的报告有两种类型,一种是免费报告,另一种是付...
    99+
    2024-04-02
  • Android实现调取支付宝健康码
    目录前言1.setOnClickListener事件,首先看源码2.Intent类总结前言 调取支付宝健康码,其实可以不使用接口去调用;我们可以通过俩个简单的小功能去调取: 1.se...
    99+
    2024-04-02
  • Android 实例开发基于ArcSoft实现人脸识别
    目录效果图激活引擎第一步配置APP_ID和SDK_KEY第二步:判断是否添加动态链接库(so文件与jar包)第三步:判断是否申明所有权限人脸比对 1:N第一步:初始化本地人脸库第二步...
    99+
    2024-04-02
  • vue2+tracking实现PC端的人脸识别示例
    目录需求分析实现思路使用 tracking.js最后总是会有一些奇奇怪怪的需求无法避免。记录一下曾经项目遇到的一个需求。 需求 上传患者真实头像,可以有两种选择,一种是通过常规的文件...
    99+
    2024-04-02
  • 怎么用Python代码实现人脸识别
    这篇文章主要介绍“怎么用Python代码实现人脸识别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Python代码实现人脸识别”文章能帮助大家解决问题。正文:环境要求:Ubuntu17.10P...
    99+
    2023-06-29
  • uniapp实现人脸识别功能的具体实现代码
    目录前言问题解决办法详细实现思路具体代码总结前言 对于前端来说,需要后端提供一个人脸识别接口,前端传入图片,接口识别并返回结果,如此看来,其实前端只需实现图片传入即可,但是其实不然,...
    99+
    2022-12-08
    uniapp 人脸识别 uniapp小程序人脸识别 uniapp人脸识别功能
  • JS支付页面倒计时的实现示例
    js简单实现支付页面跳转: 点击支付,跳出提示框,点击确定跳转支付成功页面二,从10开始倒计时,跳转到主页面,主页面连接到百度页面 页面1,代码如下: <!DOCTYPE ht...
    99+
    2024-04-02
  • Android底部弹窗的实现示例代码
    本文主要是介绍Android中实现底部弹窗的的正确姿势,如果你在实现底部弹窗时遇到了一些问题,那么请仔细阅读本文,相信文章会对你有所帮助。收获早知道阅读完本文后,你可以有以下收获 利用PopupWindow实现底部弹窗 PopupWin...
    99+
    2023-05-30
    android 底部弹窗 roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作