假设我的安卓手机上面有两个 SIM 卡,我在上面安装一个改装过后的 APP,这个 APP 可以获取到短信的接收号码吗?
我看了Android: how to get sender and receiver phone number from raw sms - Stack Overflow,但是这个问题已经很久了,现在的话,还是没有方法吗?
1
wukuai 2020-11-27 18:09:56 +08:00 1
APP 源码就懒得翻了,用 adb 不香吗,直接读库:
adb shell su -c content query --uri content://sms --projection _id,address,body,read,date,type,sim_id 其中 sim_id 表示 sim 卡编号 example: Row: 540 _id=1, address=10086, body= [公益短信] 居安思危 警钟长鸣: XX 市于 11 月 14 日 10:00 至 10:20 进行防空防灾警报试鸣,请广大市民朋友们届时注意辨听和识别防空防灾警报信号。(市人防办), read=0, date=1605270457272, type=1, sim_id=1 |
2
watzds 2020-11-27 18:18:51 +08:00
安卓短信数据库都能读到,不过现在的安卓版本,要先成为默认短信应用才有权限读取,不过这样系统原先的短信应用就读不到了
|
3
qwe7002 2020-11-28 20:18:48 +08:00
这个消息在 PDU 里,你可以直接调用 getOriginatingAddress()方法获取。从 SmsMessage[]数组中的任意一个对象都可以获得到它
|
4
JasonLaw OP |
5
itgoyo 2020-11-29 11:15:19 +08:00
你如果申请了阅读短信的权限,然后有方法可以读取到,但是有问题就是现在手机在短信列表的设置里面把允许第三放读取短信的设置给关了,所以有这两个步骤。因为最近在做一个读取短信然后自动填充的功能。
|
8
itgoyo 2020-11-30 09:58:04 +08:00
```
public class PhoneCode extends ContentObserver { private Context mContext; private String code; private SmsListener mListener; private Cursor mCursor; private int index = 0; public PhoneCode(Context context, Handler handler, SmsListener listener) { super(handler); this.mContext = context; this.mListener = listener; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.d("验证码", "onChange"); index++; mCursor = mContext.getContentResolver().query(Uri.parse("content://sms/"), new String[]{"_id", "address", "read", "body", "date"}, null, null, "date desc"); if (mCursor == null) { return; } while (mCursor.moveToNext()) { String address = mCursor.getString(mCursor.getColumnIndex("address")); String body = mCursor.getString(mCursor.getColumnIndex("body")); if (!address.endsWith("268082")) { return; } String regEx = "(?<![0-9])([0-9]{" + 4 + "})(?![0-9])"; Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(body); if (matcher.find()) { code = matcher.group(); if (mListener != null) { mListener.onResult(code, index); } } } if (mCursor != null) { mCursor.close(); } } public interface SmsListener { void onResult(String result, int index); } } ``` |
9
JasonLaw OP @itgoyo #8 你是说 address 吗? address 是 sender 的号码还是 receiver 的号码?
|
10
itgoyo 2020-11-30 13:46:39 +08:00
sender 的发送端的号码,大多数都是 10690 开头的
|