当前位置:主页 > 移动开发 > Android代码 >

Android中监听短信的两种方法

时间:2020-10-24 21:30:10 | 栏目:Android代码 | 点击:

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" />

您可能感兴趣的文章:

相关文章