备用手机是 yunos 3.2,Android 5.1,双卡,卡槽 2 插了一张联通的卡,现在不用联通的卡了,但绑定了很多 app 平时需要接受短信。
于是想在备用手机上安装一个能转发短信内容的 app,寻找了一番之后试了几款 app (绿芽短信转发),但是效果都不理想(无法转发或者转发太慢)。
现在想自己开发一个 app,阅读了 Android 官方开发文档后,算是简单的入门,可以写一些简单的功能。在网上找到了读取短信内容的方法:通过读取 “ content://sms/inbox ” 数据内容来查询短信,并且给了“ SMS_READ ”权限,编写代码检查权限也是 OK 的,但是读取短信内容显示 count 为 0.
这是因为是双卡的并且电话卡在卡槽 2 的问题吗?还是因为 yunos 的禁止了读取短信内容权限。
(抱歉没有截图,这会儿代码没在公司电脑上)
1
janus77 2019-08-26 09:46:11 +08:00
tasker
|
2
richard1122 2019-08-26 09:52:41 +08:00
ifttt
|
3
stevenkang OP |
4
theoran 2019-08-26 10:34:04 +08:00
有些厂商会默认禁止读取短信,yunos 不清楚,类似 miui 需要自己在开发者选项里开启才行
|
5
axlecho 2019-08-26 13:23:55 +08:00 via Android
跟手机卡没关系 你要是怀疑手机卡的问题 拔掉手机卡试试
不过记得了很早以前手机卡能存短信那种形式用 Api 应该是获取不到的 |
6
arrow8899 2019-08-26 13:47:18 +08:00
|
7
Kzhii 2019-08-26 14:25:50 +08:00
Uiautomator 了解一下
|
8
siknet 2019-08-26 14:32:45 +08:00 via Android
有个 APP 叫备用机,你可以试试
|
9
wulu 2019-08-26 14:46:57 +08:00 via Android
ifttt
|
10
shily 2019-08-26 17:37:37 +08:00 via Android
卡槽 2 的原因吧,那个时代双卡的支持不是很好,都是魔改支持双卡的,但 app 层面没有 API 访问卡 2。
|
11
iRiven 2019-08-26 17:57:36 +08:00
我也想做这个软件 楼主有联系方式吗
|
12
wujl100 2019-08-26 18:20:59 +08:00
正好手边有,给你一段代码参考下:
try{ ContentResolver cr = this.getApplicationContext().getContentResolver(); String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"}; Uri uri = Uri.parse("content://sms/inbox"); Cursor cur = cr.query(uri, projection, null, null, "date desc"); if (cur.moveToFirst()) { String name; String phoneNumber; String smsbody; String date; int nameColumn = cur.getColumnIndex("person"); int phoneNumberColumn = cur.getColumnIndex("address"); int smsbodyColumn = cur.getColumnIndex("body"); int dateColumn = cur.getColumnIndex("date"); do{ name = cur.getString(nameColumn); phoneNumber = cur.getString(phoneNumberColumn); smsbody = cur.getString(smsbodyColumn); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date d = new Date(Long.parseLong(cur.getString(dateColumn))); date = dateFormat.format(d); }while(cur.moveToNext()); } } catch(SQLiteException ex) { Log.d("SQLiteException in getSmsInPhone", ex.getMessage()); } |
13
winterbells 2019-08-26 18:33:10 +08:00 via Android
我也自己写了个,读取短信太麻烦。用 tasker 将短信发到 app,app 发邮件到邮箱
|
14
cz21ok 2019-08-26 18:52:27 +08:00
只接收新短信并转发的话,可以用 BroadcastReceiver, 前几天刚给测试做了个转发验证码到钉钉 bot 的 app,正好有代码可以参考下:
~~~ override fun onReceive(context: Context?, intent: Intent?) { if(intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")) { val bundle = intent!!.extras val pdus = bundle.get("pdus") as Array<Any> if (pdus.isEmpty()) { return } val messages = arrayOfNulls<SmsMessage>(pdus.size) val sb = StringBuilder() for (i in pdus.indices) { messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray) sb.append(messages[i]?.messageBody) } val messageText = sb.toString() //可以用正则做一些过滤处理 send(messageText) } } ~~~ fun send(string: String) 自己实现,可以做个 tg bot 之类的 |
15
cz21ok 2019-08-26 18:58:12 +08:00
国内定制 ROM 是有一些坑,测试机某米动态申请权限返回 granted, 但 系统-应用-权限 里发现并没有授权。
|
16
demo06 2019-08-27 09:40:07 +08:00
12 楼正解,用 ContentProvider
|
17
stevenkang OP @wulu
@richard1122 下载安装了 ifttt,发现无法邮件通知成功,不知道是否是系统限制的问题。 @wujl100 这种方式试了很多次,依然读取不到。奇怪的是我下载别的软件(例如:QQ 同步助手)都能读取到历史短信,真不知道他们是用的哪种方式。 @cz21ok 申请权限 OK,代码调用时检测权限 OK、系统-应用-权限设置 OK,内置的安装软件里面都检测了权限没问题,就是读取不到内容。这种定制 rom 太坑爹了,相关的文档都不好找。 |
18
wujl100 2019-08-27 15:30:46 +08:00
@stevenkang <uses-permission android:name="android.permission.READ_SMS"/> 读取短信的权限加了么?
|
19
PerFectTime 2019-08-28 15:03:49 +08:00
目前用的 Tasker 转发到 Telegram 方案,基本上延时 20s 以内,用着还不错,就是需要自建一个 Telegram API 的反代。
代码如下(别喷我...): https://gist.github.com/IcedMango/6007aed2d52872a43ef9986475f392df 效果如下: |
20
stevenkang OP @wujl100 AndroidManifest.xml 里面加了这个权限的,通过 takePersistableUriPermission 授权也不行
@PerFectTime Tasker 配置好了收到短信、通知触发推送,完全没反应,手动测试推送是没有问题的 国产的 os 太 J8 坑比了 |
21
PerFectTime 2019-08-31 16:06:16 +08:00
@stevenkang #20 白名单检查一下?
|
22
ludan7h 2020-03-03 23:30:01 +08:00 1
@PerFectTime 大佬,不用代码,仅使用 tasker 内置的功能,可以实现时间显示由 “11.44”→“11:44”的转化吗?
不知道软件作者为什么使用“11.44”这种奇怪的时间显示格式…… |
23
PerFectTime 2020-03-03 23:32:25 +08:00
@ludan7h #22 我就是烦这个点就把他替换了,貌似只能用代码解决
|