SMS BroadcastReceiver не получает SMS после того, как приложение убито ИЛИ перезапуск устройства только на устройствах MI

Мой код получения SMS хорошо работает на всех устройствах, кроме устройств Xiomi Redmi

На устройствах Xiomi Redmi мое приложение (Broadcast Receiver) не может получать SMS-сообщения, когда приложение убивается при перелистывании из списка последних приложений ИЛИ после перезапуска устройства, пока я не запусту приложение вручную. (Проверено на приборах Mi Marshmallow и MI Lollipop).

Эта проблема возникает только на устройствах MI. Приложение хорошо работает на других устройствах, таких как Samsung, HTC, Sony, Motorola, 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());
    }
 }
}

2 ответа

На устройствах Xiomi Redmi ограничения приложений более строгие, чем на любом другом ПЗУ, из-за этих ограничений многие уведомления приложений не соответствуют временной шкале и доставляют уведомления только по истечении определенного периода времени. Причины могут быть разными: от облачного обмена сообщениями Google до расширенных режимов работы от батарей, которые позволяют приложениям спать, а не получать уведомления. Для решения этой проблемы внимательно прочитайте этот документ http://en.miui.com/forum.php?mod=viewthread&tid=268224&page=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); } }

Другие вопросы по тегам