Android 新手,求助如何读取短信内容 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stevenkang
V2EX    Android

Android 新手,求助如何读取短信内容

  •  
  •   stevenkang 2019-08-26 09:41:08 +08:00 19813 次点击
    这是一个创建于 2310 天前的主题,其中的信息可能已经有所发展或是发生改变。

    备用手机是 yunos 3.2,Android 5.1,双卡,卡槽 2 插了一张联通的卡,现在不用联通的卡了,但绑定了很多 app 平时需要接受短信。

    于是想在备用手机上安装一个能转发短信内容的 app,寻找了一番之后试了几款 app (绿芽短信转发),但是效果都不理想(无法转发或者转发太慢)。

    现在想自己开发一个 app,阅读了 Android 官方开发文档后,算是简单的入门,可以写一些简的功能。在网上找到了读取短信内容的方法:通过读取 “ content://sms/inbox ” 数据内容来查询短信,并且给了“ SMS_READ ”权限,编写代码检查权限也是 OK 的,但是读取短信内容显示 count 为 0.

    这是因为是双卡的并且电话卡在卡槽 2 的问题吗?还是因为 yunos 的禁止了读取短信内容权限。

    (抱歉没有截图,这会儿代码没在公司电脑上)

    23 条回复    2020-03-03 23:32:25 +08:00
    rb6221
        1
    rb6221  
       2019-08-26 09:46:11 +08:00
    tasker
    richard1122
        2
    richard1122  
       2019-08-26 09:52:41 +08:00
    ifttt
    stevenkang
        3
    stevenkang  
    OP
       2019-08-26 10:29:34 +08:00
    @janus77
    @richard1122
    安装不了梯子,这两个不用梯子可以正常使用吗。也装不了 gms
    theoran
        4
    theoran  
       2019-08-26 10:34:04 +08:00
    有些厂商会默认禁止读取短信,yunos 不清楚,类似 miui 需要自己在开发者选项里开启才行
    axlecho
        5
    axlecho  
       2019-08-26 13:23:55 +08:00 via Android
    跟手机卡没关系 你要是怀疑手机卡的问题 拔掉手机卡试试

    不过记得了很早以前手机卡能存短信那种形式用 Api 应该是获取不到的
    arrow8899
        6
    arrow8899  
       2019-08-26 13:47:18 +08:00
    Kzhii
        7
    Kzhii  
    &nsp;  2019-08-26 14:25:50 +08:00
    Uiautomator 了解一下
    Hansah
        8
    Hansah  
       2019-08-26 14:32:45 +08:00 via Android
    有个 APP 叫备用机,你可以试试
    wulu
        9
    wulu  
       2019-08-26 14:46:57 +08:00 via Android
    ifttt
    shily
        10
    shily  
       2019-08-26 17:37:37 +08:00 via Android
    卡槽 2 的原因吧,那个时代双卡的支持不是很好,都是魔改支持双卡的,但 app 层面没有 API 访问卡 2。
    iRiven
        11
    iRiven  
       2019-08-26 17:57:36 +08:00
    我也想做这个软件 楼主有联系方式吗
    wujl100
        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());
    }
    300
        13
    300  
       2019-08-26 18:33:10 +08:00 via Android
    我也自己写了个,读取短信太麻烦。用 tasker 将短信发到 app,app 发邮件到邮箱
    cz21ok
        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 之类的
    cz21ok
        15
    cz21ok  
       2019-08-26 18:58:12 +08:00
    国内定制 ROM 是有一些坑,测试机某米动态申请权限返回 granted, 但 系统-应用-权限 里发现并没有授权。
    demo06
        16
    demo06  
       2019-08-27 09:40:07 +08:00
    12 楼正解,用 ContentProvider
    stevenkang
        17
    stevenkang  
    OP
       2019-08-27 13:44:39 +08:00
    @wulu
    @richard1122
    下载安装了 ifttt,发现无法邮件通知成功,不知道是否是系统限制的问题。


    @wujl100 这种方式试了很多次,依然读取不到。奇怪的是我下载别的软件(例如:QQ 同步助手)都能读取到历史短信,真不知道他们是用的哪种方式。


    @cz21ok 申请权限 OK,代码调用时检测权限 OK、系统-应用-权限设置 OK,内置的安装软件里面都检测了权限没问题,就是读取不到内容。这种定制 rom 太坑爹了,相关的文档都不好找。
    wujl100
        18
    wujl100  
       2019-08-27 15:30:46 +08:00
    @stevenkang <uses-permission android:name="android.permission.READ_SMS"/> 读取短信的权限加了么?
    PerFectTime
        19
    PerFectTime  
       2019-08-28 15:03:49 +08:00
    目前用的 Tasker 转发到 Telegram 方案,基本上延时 20s 以内,用着还不错,就是需要自建一个 Telegram API 的反代。

    代码如下(别喷我...):
    https://gist.github.com/IcedMango/6007aed2d52872a43ef9986475f392df

    效果如下:
    stevenkang
        20
    stevenkang  
    OP
       2019-08-31 12:34:01 +08:00
    @wujl100 AndroidManifest.xml 里面加了这个权限的,通过 takePersistableUriPermission 授权也不行

    @PerFectTime Tasker 配置好了收到短信、通知触发推送,完全没反应,手动测试推送是没有问题的

    国产的 os 太 J8 坑比了
    PerFectTime
        21
    PerFectTime  
       2019-08-31 16:06:16 +08:00
    @stevenkang #20 白名单检查一下?
    ludan7h
        22
    ludan7h  
       2020-03-03 23:30:01 +08:00   1
    @PerFectTime 大佬,不用代码,仅使用 tasker 内置的功能,可以实现时间显示由 “11.44”→“11:44”的转化吗?
    不知道软件作者为什么使用“11.44”这种奇怪的时间显示格式……
    PerFectTime
        23
    PerFectTime  
       2020-03-03 23:32:25 +08:00
    @ludan7h #22 我就是烦这个点就把他替换了,貌似只能用代码解决
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2872 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 14:28 PVG 22:28 LAX 06:28 JFK 09:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86