zoukankan      html  css  js  c++  java
  • Android 接收短信

    注意一点,android app无法修改短信或者删除短信,所以,查询最新短信,需要利用date字段

    package com.lr.smsreaderforserver;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.RequiresApi;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    
    import android.Manifest;
    import android.content.ContentResolver;
    import android.content.ContentValues;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.widget.LinearLayout;
    import android.widget.ScrollView;
    import android.widget.TextView;
    
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class MainActivity extends AppCompatActivity {
        Handler handler;
        LinearLayout _linerRoot;
        ScrollView _scrollview;
        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            _linerRoot = (LinearLayout) this.findViewById(R.id.linerRoot);
            _scrollview= (ScrollView) this.findViewById(R.id.scrollview);
            handler = new Handler();
    
            //申请写的权限
            String[] permissions = {Manifest.permission.READ_SMS};
            if(PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS)){
                requestPermissions(permissions,200);
    
            }
            else
            {
                start();
            }
        }
    
        void start()
        {
            getLastSmsDate();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true)
                    {
                        getSMS();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                }
            }).start();
        }
    
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            if( grantResults[0] ==  PackageManager.PERMISSION_GRANTED )
            {
                start();
            }
        }
    
        long _lastReadDate;
        void getLastSmsDate()
        {
            String SMS_URI_INBOX = "content://sms/";
    
            Uri uri = Uri.parse(SMS_URI_INBOX);
            String[] projection = new String[]{"date"};
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(uri, projection, null, null, "date desc");
    
            if(cur.moveToFirst()){
    
                _lastReadDate = cur.getLong(0);
    
                if (!cur.isClosed()) {
                    cur.close();
                    cur = null;
                }
            }
        }
    
        private  void appendLine(final String line)
        {
    
    
           handler.post(new Runnable() {
               @Override
               public void run() {
                   SimpleDateFormat dateFormat = new SimpleDateFormat(
                           "yyyy-MM-dd hh:mm:ss");
                   Date d = new Date();
                   final String strDate = dateFormat.format(d);
    
                   TextView textView = new TextView(MainActivity.this);
                   textView.setTextSize(18);
                   textView.setText(strDate + "" + line);
                   _linerRoot.addView(textView);
                   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                       _scrollview.scrollToDescendant(textView);
                   }
    
                   while(_linerRoot.getChildCount() > 100)
                   {
                       _linerRoot.removeViewAt(0);
                   }
               }
           });
        }
    
    
        public void submitCode(final String code) {
    
            try {
    
    //String urlPath = "http://192.168.1.9:80/JJKSms/RecSms.php";
                URL url = new URL("https://www.aaa.com/test?code=" + code);
    
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                httpURLConnection.setConnectTimeout(8000);     //设置连接超时时间
                //httpURLConnection.setDoInput(true);                  //打开输入流,以便从服务器获取数据
               //httpURLConnection.setDoOutput(true);                 //打开输出流,以便向服务器提交数据
                httpURLConnection.setRequestMethod("GET");     //设置以Post方式提交数据
                httpURLConnection.setUseCaches(false);               //使用Post方式不能使用缓存
                //设置请求体的类型是文本类型
                //httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    //设置请求体的长度
                //httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));
    //获得输出流,向服务器写入数据
                //OutputStream outputStream = httpURLConnection.getOutputStream();
                //outputStream.write(data);
    
                int response = httpURLConnection.getResponseCode();            //获得服务器的响应码
                if(response == HttpURLConnection.HTTP_OK) {
                    appendLine("SetVerifyCode successfully " + code);
                }
                else
                {
                    throw  new Exception("提交验证码到服务器失败,status:" + response);
                }
            } catch (Exception e) {
                e.printStackTrace();
                appendLine(e.getMessage());
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                        submitCode(code);
                    }
                }).start();
            }
        }
    
        private void getSMS() {
            final String SMS_URI_INBOX = "content://sms/";
            Pattern pattern = Pattern.compile("[0-9]{6}");
    
            Uri uri = Uri.parse(SMS_URI_INBOX);
            String[] projection = new String[]{"_id", "address", "person", "body", "date", "type","read"};
            ContentResolver cr = getContentResolver();
            Cursor cur = cr.query(uri, projection, "date>" + _lastReadDate, null, "date desc");
    
    
            if(cur.moveToFirst()){
                int index_Address = cur.getColumnIndex("address");
                int index_Person = cur.getColumnIndex("person");
                int index_Body = cur.getColumnIndex("body");
                int index_Date = cur.getColumnIndex("date");
                int index_Type = cur.getColumnIndex("type");
                int index_id = cur.getColumnIndex("_id");
                int index_read = cur.getColumnIndex("read");
                do {
                    String strAddress = cur.getString(index_Address);
                    int intPerson = cur.getInt(index_Person);
                    String strbody = cur.getString(index_Body);
                    long longDate = cur.getLong(index_Date);
                    int intType = cur.getInt(index_Type);
                    int id = cur.getInt(index_id);
                    int read = cur.getInt(index_read);
    
                    if(longDate > _lastReadDate)
                        _lastReadDate = longDate;
    
    //                SimpleDateFormat dateFormat = new SimpleDateFormat(
    //                        "yyyy-MM-dd hh:mm:ss");
    //                Date d = new Date(longDate);
    //                String strDate = dateFormat.format(d);
    
                    String strType = "";
                    if (intType == 1) {
                        strType = "接收";
                        Log.d("SMS_Server" , "收到短信:" + strbody);
    
                        appendLine("收到短信:" + strbody);
    
                        strbody = strbody.toLowerCase();
                        if(strbody.contains("apple id"))
                        {
                            Matcher mc=pattern.matcher(strbody);
                            if(mc.find())
                            {
                                String content = mc.group();
                                appendLine("过滤出验证码:" + content);
                                submitCode(content);
                            }
                        }
    
                    } else if (intType == 2) {
                        strType = "发送";
                    } else if (intType == 3) {
                        strType = "草稿";
                    } else if (intType == 4) {
                        strType = "发件箱";
                    } else if (intType == 5) {
                        strType = "发送失败";
                    } else if (intType == 6) {
                        strType = "待发送列表";
                    } else if (intType == 0) {
                        strType = "所以短信";
                    } else {
                        strType = "null";
                    }
    
                } while (cur.moveToNext());
    
                if (!cur.isClosed()) {
                    cur.close();
                    cur = null;
                }
            }
        }
    
    }
  • 相关阅读:
    B树/[oracle]connect BY语句
    使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)
    goldengate常用命令
    GoldenGate 之 Bounded Recovery说明
    RAC环境中threads变更后如何确保goldengate继续正常复制
    简述Oracle IOT(Index Organized Table)
    mybatis-spring最新版下载地址
    12 个 CSS 高级技巧汇总
    Linux命令:useradd
    PHP date()函数详解
  • 原文地址:https://www.cnblogs.com/IWings/p/11866015.html
Copyright © 2011-2022 走看看