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

SmsManager相关:Android短信应用真机部署后无法接收短信咨询

解决Android真机无法接收短信的问题

看起来你在模拟器上测试短信接收一切正常,但换到菲律宾真机号码(+639123456789)就掉链子了,这种模拟器和真机的差异问题很常见,咱们一步步拆解排查:

1. 权限问题:别让权限挡住短信

Android 6.0(API 23)及以上版本对危险权限要求动态申请,模拟器可能默认给了权限,但真机必须手动授权:

  • 先检查Manifest权限:确保你已经在AndroidManifest.xml中添加了必要的短信权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
  • 动态申请权限:如果你的targetSdkVersion >=23,必须在代码中主动请求权限,比如在MainActivity的onCreate里:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 检查并请求短信接收权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1001);
    }
}

// 处理权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1001) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限到手,初始化短信接收逻辑
        } else {
            Toast.makeText(this, "需要短信权限才能接收消息", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 广播接收器:抢在系统APP前面拿到短信

真机上可能有系统短信APP或第三方短信应用,它们的广播优先级更高,会先拦截短信。你需要确保你的广播接收器优先级足够高:

  • 静态注册接收器(Manifest中):
<receiver 
    android:name=".SmsReceiver"
    android:exported="true"> <!-- 必须开启,才能接收系统广播 -->
    <intent-filter android:priority="1000"> <!-- 优先级设高,确保先收到广播 -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
  • 动态注册接收器(代码中):
private SmsReceiver smsReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    smsReceiver = new SmsReceiver();
    IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    filter.setPriority(1000);
    registerReceiver(smsReceiver, filter);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(smsReceiver); // 记得销毁时注销
}

3. 号码格式:别让格式不匹配坑了你

模拟器用的是短号5554,但真机是国际号码+639123456789,你的代码可能对号码的处理逻辑有问题:

比如在接收器中获取发送方号码时,打印日志确认实际收到的格式:

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null) {
                    for (Object pdu : pdus) {
                        SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
                        String senderNum = sms.getOriginatingAddress();
                        Log.d("SmsDebug", "实际收到的号码:" + senderNum); // 查看日志确认格式
                        String message = sms.getMessageBody();
                        
                        // 处理你的业务逻辑,比如匹配号码时要兼容带+号或不带的情况
                        if (senderNum.equals("+639123456789") || senderNum.equals("639123456789")) {
                            // 处理该号码的短信
                        }
                    }
                }
            }
        }
    }
}

4. 默认短信应用:系统可能把短信发给了别家

如果你的APP不是手机的默认短信应用,系统可能会把短信广播优先发给默认应用,导致你的APP收不到:

  • 检测并设置默认应用:在代码中添加检测逻辑,引导用户设置你的APP为默认短信应用:
private void checkDefaultSmsApp() {
    String defaultPackage = Telephony.Sms.getDefaultSmsPackage(this);
    if (!getPackageName().equals(defaultPackage)) {
        Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
        startActivity(intent);
        Toast.makeText(this, "请设置本应用为默认短信应用", Toast.LENGTH_SHORT).show();
    }
}

5. 最后排查:运营商/网络问题

如果以上都没问题,先确认用其他手机给这个菲律宾号码发短信,系统自带的短信APP能不能收到:

  • 如果系统短信也收不到:那是运营商或网络问题,联系运营商排查;
  • 如果系统短信能收到但你的APP收不到:回到代码检查广播接收器逻辑,或者看看手机有没有开启短信拦截功能(比如安全软件)。

内容的提问来源于stack exchange,提问作者Mr.Kraken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:43