sms BroadcastReceiver 仅在应用程序终止或设备重启后在 MI 设备上不接收短信

Posted

技术标签:

【中文标题】sms BroadcastReceiver 仅在应用程序终止或设备重启后在 MI 设备上不接收短信【英文标题】:sms BroadcastReceiver doesn't receive SMS after app killed OR device restart on MI devices only 【发布时间】:2017-05-21 05:45:43 【问题描述】:

我的短信接收代码在除小米红米设备之外的所有设备上都能正常工作

小米红米设备上,我的应用程序(广播接收器)当应用程序被从最近的应用程序列表中滑动或设备重启后直到我启动应用程序被杀死时,无法接收短信强>手动。 (在 Mi Marshmallow 和 MI Lollipop 设备上测试)。

此问题仅发生在 MI 设备上。应用在三星、HTC、索尼、摩托罗拉、Micromax 等其他设备上运行良好。

我在清单中的代码:

 <uses-permission android:name="android.permission.SEND_SMS" />
 <uses-permission android:name="android.permission.RECEIVE_SMS" />
 <receiver
        android:name=".receiver.SMSBroadcastReceiver"
        android:enabled="true"
        android:priority="999">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
  </receiver>

广播接收器:

public class SMSBroadcastReceiver extends BroadcastReceiver 

 public void onReceive(Context context, Intent intent) 
    if (Constants.SMS_RECEIVED_ACTION.equals(intent.getAction())) 
        mContext = context.getApplicationContext();
        mIntent = intent;
        sendIntent();
     else 
        LogUtil.e(TAG, "Intent action: " + intent.getAction());
    
 

【问题讨论】:

收到短信时至少调用onReceive 不,onReceive 没有被邀请 【参考方案1】:

终于找到了解决办法(实际上是解决方法)

1.首先检查是否有MI设备

if (!TextUtils.isEmpty(getMiUiVersionProperty())) // its a MI device

public String getMiUiVersionProperty() 
    BufferedReader reader = null;
    try 
        reader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("getprop ro.miui.ui.version.name").getInputStream()), 1024);
        String line = reader.readLine();
        reader.close();
        return line;
     catch (IOException e) 

2。向用户显示一个对话框,为您的应用程序启用Autostart 例如

3.然后直接将用户导航到“自动启动”屏幕,为您的应用启用它

public void openMiuiAutoStartPermissionActivity(Context context) Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR"); String ROM = getMiUiVersionProperty(); if (TextUtils.equals(ROM, "V5")) PackageInfo pInfo = null; try pInfo = context.getPackageManager().getPackageInfo( context.getPackageName(), 0); catch (NameNotFoundException e) e.printStackTrace(); intent.setClassName("com.android.settings", "com.miui.securitycenter. permission.AppPermissionsEditor"); intent.putExtra("extra_package_uid", pInfo.applicationInfo.uid); else if (TextUtils.equals(ROM, "V6") || TextUtils.equals(ROM, "V7") || TextUtils.equals(ROM, "V8")) intent.setClassName( "com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"); intent.putExtra( "extra_pkgname", context.getPackageName()); else intent.setClassName( "com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"); intent.putExtra( "extra_pkgname", context.getPackageName()); if (isIntentAvailable(context, intent) && (context instanceof Activity)) ((Activity) context).startActivityForResult(intent, AUTO_START_ENABLE_REQUEST);

【讨论】:

【参考方案2】:

小米 Redmi 设备,应用限制比任何其他 ROM 都更严格,由于这些限制,许多应用通知不符合时间表,并且仅在一定时间后才会发送通知。原因可能有不同的范围,从 Google 的云消息传递到高级电池模式,这些模式使应用程序进入睡眠状态而不是收到通知。要解决此问题,请仔细阅读此文档 http://en.miui.com/forum.php?mod=viewthread&tid=268224&page=1

【讨论】:

非常感谢,支持您的帮助。但请回复;我可以检查用户是否给了我的应用必要的自动启动(或任何其他 MI 相关)权限?这样我将显示一个对话框,要求用户提供必要的权限(例如 Marshmallow 运行时权限) 对不起@Shirish Herwade 我对此一无所知

以上是关于sms BroadcastReceiver 仅在应用程序终止或设备重启后在 MI 设备上不接收短信的主要内容,如果未能解决你的问题,请参考以下文章

Oreo BroadcastReceiver短信收到不起作用

GCM BroadcastReceiver 仅在应用程序正在运行或在后台运行时触发

用户离开活动后如何接收个人 SMS 发送/传递的 SMS 反馈

我的传入 SMS 处理接收器应从系统获得啥许可?

检查应用程序是不是正在运行(后台或前台)Android

短信监听器