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());
    }
 }
}

person Shirish Herwade    schedule 06.01.2017    source источник
comment
по крайней мере onReceive вызывается при получении SMS?   -  person AADProgramming    schedule 06.01.2017
comment
НЕТ, onReceive не вызывается   -  person Shirish Herwade    schedule 09.01.2017


Ответы (2)


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

person Shailendra Kushwah    schedule 06.01.2017
comment
Большое спасибо, голосую за вашу помощь. Но, пожалуйста, ответьте; Могу ли я проверить, дал ли пользователь моему приложению необходимое разрешение на автозапуск (или любое другое разрешение, связанное с MI)? Так что я покажу диалоговое окно с просьбой предоставить необходимые разрешения (что-то вроде разрешения Marshmallow во время выполнения) - person Shirish Herwade; 09.01.2017
comment
извини @Шириш Херваде, я понятия не имею об этом - person Shailendra Kushwah; 09.01.2017

Наконец-то нашел решение (на самом деле обходной путь)

<сильный>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); } }

person Shirish Herwade    schedule 13.01.2017