您的位置:首页 > 移动开发 > Android开发

Android 识别带验证码的短信(非原创)

2016-06-30 13:52 711 查看
这个需求非常实在

项目中可能也需要用到,很急很关键

不废话了,直接上代码:

[java] view
plain copy

import android.Manifest;  

import android.app.Activity;  

import android.content.BroadcastReceiver;  

import android.content.Context;  

import android.content.Intent;  

import android.content.IntentFilter;  

import android.content.pm.PackageManager;  

import android.os.Bundle;  

import android.telephony.SmsMessage;  

import android.text.TextUtils;  

import android.util.Log;  

  

  

public class TestActivity extends Activity{  

  

    private BroadcastReceiver smsReceiver;  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        if(checkPermission(Manifest.permission.RECEIVE_SMS)){  

            smsReceiver = new SmsReceiver();  

            IntentFilter filter2 = new IntentFilter();  

            filter2.addAction("android.provider.Telephony.SMS_RECEIVED");
//这两个意图优先级是关键 

            filter2.setPriority(Integer.MAX_VALUE);  

            registerReceiver(smsReceiver, filter2);  

        }  

    }  

  

    @Override  

    protected void onDestroy() {  

        super.onDestroy();  

        if(smsReceiver != null){  

            unregisterReceiver(smsReceiver);  

        }  

    }  

  

    public boolean checkPermission(String permissionName) {  

        PackageManager pm = getPackageManager();  

        boolean hasPermission = (PackageManager.PERMISSION_GRANTED ==  

                pm.checkPermission(permissionName, getPackageName()));  

        Log.i("hdt","has permission:"+permissionName+" "+hasPermission);  

        return hasPermission;  

    }  

  

  

  

    class SmsReceiver extends BroadcastReceiver{  

  

        @Override  

        public void onReceive(Context context, Intent intent) {  

            Object[] objs = (Object[]) intent.getExtras().get("pdus");  

            for (Object obj : objs) {  

                byte[] pdu = (byte[]) obj;  

                SmsMessage sms = SmsMessage.createFromPdu(pdu);  

                // 短信的内容  

                String message = sms.getMessageBody();  

                Log.d("hdt", "message     " + message);  

                String from = sms.getOriginatingAddress();  

                Log.d("hdt", "from     " + from);  

                

  

                // handler.sendEmptyMessage(1);  

                if (!TextUtils.isEmpty(from)) {  

                    String code = CodeTest.patternCode(message);  

                    if (!TextUtils.isEmpty(code)) {  

                        //存在6位数的验证码  

                        //handler.sendEmptyMessage(1);  

                        Log.d("hdt", "验证码:     " + code);  

                    }  

                }  

            }  

        }  

    }  

}  

注意app当前是否有读取短信的权限:

Android 6.0 对权限的控制变得非常严格。

运行时权限管理,有可能申请了权限但是还是获取不到。
识别解析短信中的验证码:

[java] view
plain copy

private static String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";  

  

    /** 

     * 匹配短信中间的6个数字(验证码等) 

     * 

     * @param patternContent 

     * @return 

     */  

    public static String patternCode(String patternContent) {  

        if (patternContent == null || patternContent.length() == 0) {  

            return null;  

        }  

        Pattern p = Pattern.compile(patternCoder);  

        Matcher matcher = p.matcher(patternContent);  

        if (matcher.find()) {  

            return matcher.group();  

        }  

        return null;  

    }  

实现很简单就是通过系统广播注册 接受到短信读取短信内容 用正则表达式解析.

如果碰到四位数验证码思路也是一样的。

over....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: