zoukankan      html  css  js  c++  java
  • 监听短信的两种方法

    1、监听广播

    缺点,因为优先级的原因可能接收不到。

    代码:

    public static final String TAG = "ImiChatSMSReceiver";
    
        public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    
        public void onReceive(Context context, Intent intent)
        {
            if (intent.getAction().equals(SMS_RECEIVED_ACTION))
            {
                SmsMessage[] messages = getMessagesFromIntent(intent);
    
                for (SmsMessage message : messages)
                {
    
                    String text = message.getOriginatingAddress() + " : " +
    
                    message.getDisplayOriginatingAddress() + " : " +
    
                    message.getDisplayMessageBody() + " : " +
    
                    message.getTimestampMillis();
    
                    String num = message.getOriginatingAddress();
                    Log.i(TAG, "-------------" + text);
                    Toast.makeText(context, text, Toast.LENGTH_LONG).show();
                    sendMessage(num, "来自" + num + "的短信已经收到", context);
    
                    context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, new SmsObserver(new Handler(), context));
                }
            }
        }
    
        public void sendMessage(String num, String text, Context context)
        {
            SmsManager smsManager = SmsManager.getDefault();
            PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
            String strContent = text;
    
            smsManager.sendTextMessage(num, null, strContent, sentIntent, null);
    
            TelephonyManager tl = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            int itype = tl.getPhoneType();
            Log.i(TAG, "-------------" + "当前卡类型为:" + itype);
            if (itype == TelephonyManager.PHONE_TYPE_GSM)
            {
                Toast.makeText(context, "当前卡类型为:GSM", Toast.LENGTH_LONG).show();
            }
            else if (itype == TelephonyManager.PHONE_TYPE_CDMA)
            {
                Toast.makeText(context, "当前卡类型为 : CDMA", Toast.LENGTH_LONG).show();
            }
            else if (itype == TelephonyManager.PHONE_TYPE_NONE)
            {
                Toast.makeText(context, "当前卡类型为:NONE", Toast.LENGTH_LONG).show();
            }
        }
    
        public final SmsMessage[] getMessagesFromIntent(Intent intent)
        {
    
            Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
    
            byte[][] pduObjs = new byte[messages.length][];
    
            for (int i = 0; i < messages.length; i++)
    
            {
    
                pduObjs[i] = (byte[]) messages[i];
    
            }
    
            byte[][] pdus = new byte[pduObjs.length][];
    
            int pduCount = pdus.length;
    
            SmsMessage[] msgs = new SmsMessage[pduCount];
    
            for (int i = 0; i < pduCount; i++)
    
            {
    
                pdus[i] = pduObjs[i];
    
                msgs[i] = SmsMessage.createFromPdu(pdus[i]);
    
            }
    
            return msgs;
    
        }

    2、采用观察方法,监听短信数据库

    public class SmsObserver extends ContentObserver
    {
    
        private Context mContext;
    
        public SmsObserver(Handler handler , Context context)
        {
            super(handler);
            mContext = context;
        }
        
        public void onChange(boolean selfChange) 
        { 
            super.onChange(selfChange); 
            Cursor cursor =null; 
            try
            {
                //读取收件箱中的短信 
                cursor = mContext.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc"); 
                String body;
                boolean hasDone =false;
                if (cursor !=null)
                { 
                    while (cursor.moveToNext())
                    {
                        body = cursor.getString(cursor.getColumnIndex("body"));
                        if(body !=null)//&& body.equals("【startMyActivity】"
                        {
                            hasDone =true;
                            break;
                        }
                        if (hasDone)
                        {
                            break;
                        }
                    } 
                } 
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if(cursor!=null)        cursor.close();
            }
        }
    
    }

    用到的权限:

    <uses-permission android:name="android.permission.SEND_SMS" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
  • 相关阅读:
    分布式事务中间件你知道哪些?
    SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4构建你的微服务体系
    Nginx用做静态资源服务器和动静分离
    物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
    物联网温度服务器-ECharts、HTML5、JavaScript / ECharts gauge使用示例
    impala
    impala
    impala
    impala
    代码中的禅机
  • 原文地址:https://www.cnblogs.com/lipeil/p/2700469.html
Copyright © 2011-2022 走看看