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

