Как я могу заставить этот телефонный звонок вещать приемник, чтобы он работал все время? (нон-стоп)

Я создаю приложение, которое будет отображать всплывающие сообщения до и после состояния вызова. Я создал и установил свое приложение на свой мобильный. оно работало хорошо через несколько дней, а иногда и несколько часов. но после этого оно остановилось, чтобы запустить приложение, мне нужно снова открыть приложение. как я могу изменить свое приложение, чтобы оно работало очень хорошо? Спасибо

манифест

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.INTERNET" />


    <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">
        <activity android:name=".MainActivity"></activity>
        <activity android:name=".MainActivity2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> <!-- This part is inside the application -->
        <receiver
            android:name=".CallReceiver"
            android:enabled="true">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

MainActivity.класс

@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

       checkAndRequestPermissions();

      }
    private  boolean checkAndRequestPermissions() {
 int readPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
 int read_call_log = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG);

 List listPermissionsNeeded = new ArrayList<>();

 if (readPhoneState != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.READ_CALL_LOG);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.INTERNET);
 }

 if (!listPermissionsNeeded.isEmpty()) {
     ActivityCompat.requestPermissions(this,
             (String[]) listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
             REQUEST_ID_MULTIPLE_PERMISSIONS);

     return false;
 }
 return true;
}

CallReciver.класс

public class CallReceiver extends BroadcastReceiver{


    @Override
        public void onReceive(Context context, Intent intent) {

            try {

                runfirstTime(context,intent);
                Toast.makeText(context, "1st", Toast.LENGTH_SHORT).show();

            } catch (Exception ex) {
                try {

                }
                catch (Exception e)
                {

                }
            }
        }
      }

person Prasath    schedule 03.08.2020    source источник


Ответы (1)


Новые версии Android не позволяют вам делать то, чего вы пытаетесь достичь, если вы не создаете службу переднего плана.

Android не хочет, чтобы приложения работали в фоновом режиме без явного ведома пользователя.

Поэтому вам нужно создать службу переднего плана и отображать постоянное уведомление на панели уведомлений. Затем вы можете создать BroadcastReceiver из службы переднего плана.

Запустите свою службу в качестве службы переднего плана, используя приведенный ниже код.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   context.startForegroundService(intent);
}
else {
   context.startService(intent); 
}

А в сервисе onCreate() сделать что-то вроде этого:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   startForeground(1, new Notification());
}

Ссылки ниже дадут вам немного больше информации о Foreground Services.

https://blog.logimonk.com/post/foreground-service-in-android

https://medium.com/@debuggingisfun/android-o-work-around-background-service-limitation-e697b2192bc3

Создайте BroadcastReceiver из службы.

person Vishnuprasad R    schedule 04.08.2020
comment
Спасибо, я сделал это, но вещи в службе Android Foreground убиты приемником Broadcast, потому что, используя тот же поток, как я могу добиться этого stackoverflow.com/questions/63327282/ - person Prasath; 09.08.2020