You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram无法接收短信转发且无日志记录,代码运行无响应问题排查求助

Telegram无法接收短信转发且无日志记录,代码运行无响应问题排查求助

嘿,我之前做过类似的短信转发需求,看了你贴的代码片段,先给你梳理几个最可能导致没反应的坑,你逐个排查下:


1. 权限缺失(最常见的问题)

Android对短信和网络权限管控很严,你得确保两步都做了:

  • 在AndroidManifest.xml里声明静态权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
  • 在MainActivity里动态申请运行时权限(Android 6.0+必须做,不然权限会被拒绝):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS}, 100);
}

要是没权限,BroadcastReceiver根本收不到任何短信广播,自然没动静。

2. BroadcastReceiver的注册方式不对

你把Receiver嵌套在Activity里动态注册了,但只要Activity被销毁(比如切后台、锁屏),这个Receiver就会失效。如果要长期监听短信,建议把Receiver单独写成类,然后在Manifest里注册:

<receiver android:name=".SmsReceiver" android:exported="true">
    <intent-filter android:priority="999"> <!-- 设高优先级,避免被其他应用抢了广播 -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

这样哪怕Activity关闭,Receiver也能正常工作。

3. 主线程做网络请求直接卡壳

你大概率是在BroadcastReceiver里直接调用Telegram API了,但Android严禁在主线程做网络操作,会触发NetworkOnMainThreadException,要么崩溃要么请求直接失败。必须把网络请求放到子线程里:

// 在Receiver的onReceive里启动子线程
new Thread(new Runnable() {
    @Override
    public void run() {
        sendToTelegram(解析好的短信内容);
    }
}).start();

而且记得在sendToTelegram方法里加异常日志,看看请求到底哪出问题了:

private void sendToTelegram(String message) {
    try {
        URL url = new URL("https://api.telegram.org/bot" + TELEGRAM_BOT_TOKEN + "/sendMessage");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        JSONObject json = new JSONObject();
        json.put("chat_id", TELEGRAM_CHAT_ID);
        json.put("text", message);

        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
        writer.write(json.toString());
        writer.flush();
        writer.close();

        // 打印响应码,判断请求是否成功
        Log.d("TelegramSms", "响应码: " + conn.getResponseCode());
        conn.disconnect();
    } catch (Exception e) {
        Log.e("TelegramSms", "发送失败: " + e.getMessage());
        e.printStackTrace();
    }
}

4. 先确认广播能不能收到

在Receiver的onReceive开头加个日志,先确认有没有拿到短信广播:

@Override
public void onReceive(Context context, Intent intent) {
    Log.d("SmsReceiver", "收到新短信广播啦!");
    // 后面的短信解析逻辑...
}

然后打开Android Studio的Logcat,过滤你设置的TAG(比如SmsReceiver),看看有没有日志输出——要是连这个日志都没有,那就是权限或者广播注册的问题;要是有日志,那就是后面发Telegram的环节出问题了。

5. Telegram Bot配置要先手动验证

先别靠代码,手动测下你的Bot能不能发消息到群组:在浏览器里访问 https://api.telegram.org/bot<你的TOKEN>/sendMessage?chat_id=<你的CHAT_ID>&text=测试消息,如果返回{"ok":true}说明配置没问题,否则检查token是否正确、Bot有没有加入目标群组、有没有发消息的权限。


备注:内容来源于stack exchange,提问作者Bacha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:28:05