Broadcaster Receiver не работает

282
01 сентября 2021, 22:40

У меня есть два слушателя BroadcastReceiverSms и BroadcastReceiverCall которые отслеживают когда на телефон ЗВОНЯТ и приходит СМС и выводят оповещение с вибрацией. Когда приложение работает в фоне то оповещение по середине экрана при получении СМС работает корректно, но когда звонят не работает. Так-же когда я закрываю приложение то оповещение не появляется при СМС и при ЗВОНКЕ, хотя по идее BroadcastReceiver работает.

Манифест

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.service.detector">
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name="detector.sakuraso13.Service.ServiceMain"
            android:enabled="true"
            android:exported="true"></service>
        <receiver
            android:name="detector.sakuraso13.Broadcaster.MyReceiverCall"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="detector.sakuraso13.Broadcaster.MyReceiverSms"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>
        <activity android:name="detector.sakuraso13.Main.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MyReceiverCall

public class MyReceiverCall extends BroadcastReceiver {
    private static final String TAG = "MyReceiverCall";
    private static final String ACTION = "android.intent.action.PHONE_STATE";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction() != null) {
            String action = intent.getAction();
            if (action.equals(ACTION)) {
                String phoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (phoneState.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                        // логика
                        Intent intentService = new Intent(context, ServiceMain.class);
                        intentService.putExtra("type", "call");
                        intentService.putExtra("content", call);
                        context.startService(intentService);
                }
                }
            }
        }

MyReceiverSms

public class MyReceiverSms extends BroadcastReceiver {
    private static final String TAG="MyReceiverSms";
    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED";
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent !=  null && intent.getAction()!=null) {
            String action = intent.getAction();
            if (action.equals(ACTION)) {
                    Intent intentService=new Intent(context, ServiceMain.class);
                    intentService.putExtra("type","sms");
                    intentService.putExtra("content",sms);
                    context.startService(intentService);

            }
        }
    }
}

ServiceMain

public class ServiceMain extends Service {
    private static WindowManager windowManager;
    private static ViewGroup windowLayout;
    private final String TAG = "ServiceMain";
    public ServiceMain() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        showWindow("heh");
        stopSelf();
        return super.onStartCommand(intent, flags, startId);
    }

    private void showWindow(String phone) {
        closeWindow();
        Context context = getApplicationContext();
        windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                        ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                        : WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.CENTER;
        windowLayout = (ViewGroup) layoutInflater.inflate(R.layout.info, null);
        TextView textViewNumber=(TextView) windowLayout.findViewById(R.id.textViewNumber);
        Button buttonClose=(Button) windowLayout.findViewById(R.id.buttonClose);
        textViewNumber.setText(phone);
        buttonClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                closeWindow();
            }
        });
        windowManager.addView(windowLayout, params);long mills = 1000L;
        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        if(vibrator!=null) {
            if (vibrator.hasVibrator()) {
                vibrator.vibrate(mills);
            }
        }
    }
    private void closeWindow() {
        if (windowLayout !=null){
            windowManager.removeView(windowLayout);
            windowLayout =null;
        }
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
}
Answer 1

Вам не нужно программно регистрировать ресивер в коде. Скорее всего, вы регистрируете его в Activity.onStart() и снимаете регистрацию в Activity.onStop()

У вас ресивер уже зарегистрирован в манифесте, поэтому это лишняя операция.

Кстати, у меня в коде немного не так:

  <!-- SMS receiver -->
    <receiver
        android:name=".SmsReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS" >
        <intent-filter android:priority="2147483647" > <!-- 999 is highest system priority, so it's hack 2147483647 -->
            <action android:name="android.provider.Telephony.SMS_RECEIVED" /> <!-- pre kitkat action -->
            <action android:name="android.provider.Telephony.SMS_DELIVER" /> <!-- kitkat action -->
        </intent-filter>
    </receiver>
READ ALSO
Как превратить String[][] в Map&lt;String, Map&lt;Integer, List&lt;String[]&gt;&gt;&gt;

Как превратить String[][] в Map<String, Map<Integer, List<String[]>>>

интересует красивый способ преобразования двумерного массива строк в мапу, значениями которой будет мапа, значениями которой будет список...

167
Почему здесь прибавляют 1?

Почему здесь прибавляют 1?

Добрый день не могу разобраться с кодом почему к переменной in добавляют 1

89
Не могу присвоить в переменную значение &quot;+&quot;, считанное Scannerом

Не могу присвоить в переменную значение "+", считанное Scannerом

Программа - калькуляторВвожу в консоли в строку значения, сканер их считывает

188
динамическое добавление input с уникальным id

динамическое добавление input с уникальным id

Передо мной стоит задача по нажатию добавлять input с кнопкой удаления этого инпутаМаксимальное кол-во инпутов 4

256