How can I make this phone call states Broadcast receiver to work all the times?(non-stops)

﹥>﹥吖頭↗ 提交于 2020-08-20 06:38:19

问题


I'm creating an application, which will show toast messages before and after the call states. I generated and installed my application on my mobile. it was working well after a few days or sometimes a few hours. but after that, it's stopped, in order to run the application I need to open the application again. how can I modify my application to work very well? Thank you

manifest

<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.class

@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.class

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)
                {

                }
            }
        }
      }

回答1:


New versions of Android does not allow you to do what you are trying to achieve, unless you create foreground service.

Android does not want apps to run in background without explicit knowledge of the user.

So you need to create a foreground service and show a persistent notification in notification panel. Then you can create a BroadcastReceiver from the Foreground Service.

Launch your service as a foreground service using the code below

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

And in service onCreate() make something like that:

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

Links below will give you a little more insight into Foreground Services.

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

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

Create your BroadcastReceiver from the service.



来源:https://stackoverflow.com/questions/63227315/how-can-i-make-this-phone-call-states-broadcast-receiver-to-work-all-the-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!