Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pop up window over Android native incoming call screen like true caller Android app

I am developing a broadcast receiver for incoming calls in Android and on getting incoming calls I want to inflate a pop up over the native incoming call screen.

I completed that code. But now the problem is that in the Android 4.1 (Jelly Bean) API level 17 when a phone rings, the PHONE_STATE is coming as OFF HOOK, and if I am calling an activity, it gets called, but the code under it doesn't get executed. I am listing the code:

My broadcast receiver

package com.example.popwindowonincomingcallscreen;  import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService;  import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.TelephonyManager; import android.util.Log;  public class IncomingBroadcastReceiver extends BroadcastReceiver {      @Override     public void onReceive(Context context, Intent intent) {          Log.d("IncomingBroadcastReceiver: onReceive: ", "flag1");          String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);         Log.d("IncomingBroadcastReceiver: onReceive: ", state);         if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)                 || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {              Log.d("Ringing", "Phone is ringing");              Intent i = new Intent(context, IncomingCallActivity.class);             i.putExtras(intent);             i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);             i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);             Wait.oneSec();             context.startActivity(i);         }     } } 

An the activity which I am calling:

import android.app.Activity; import android.os.Bundle; import android.telephony.TelephonyManager; import android.util.Log; import android.view.View.MeasureSpec; import android.view.Window; import android.view.WindowManager; import android.widget.TextView;  public class IncomingCallActivity extends Activity {      @Override     protected void onCreate(Bundle savedInstanceState) {          try {             Log.d("IncomingCallActivity: onCreate: ", "flag2");              */ After this line, the code is not executed in Android 4.1 (Jelly Bean) only/*              // TODO Auto-generated method stub             super.onCreate(savedInstanceState);              getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);             getWindow().addFlags(                     WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);              Log.d("IncomingCallActivity: onCreate: ", "flagy");              setContentView(R.layout.main);              Log.d("IncomingCallActivity: onCreate: ", "flagz");              String number = getIntent().getStringExtra(                     TelephonyManager.EXTRA_INCOMING_NUMBER);             TextView text = (TextView) findViewById(R.id.text);             text.setText("Incoming call from " + number);         }          catch (Exception e) {             Log.d("Exception", e.toString());             // TODO Auto-generated catch block             e.printStackTrace();         }     } } 

After

try {     Log.d("IncomingCallActivity: onCreate: ", "flag2"); } 

The code is not executing in Android 4.1 (Jelly Bean), but in other versions it is working.

I have tried almost all ways I can do. This code is displaying an translucent activity over the native call screen, and it doesn't block background controls, like picking up the phone. But I want it like true caller. I have attached an snapshot on how the true caller is displaying a window on the incoming call screen.

How can I achieve this functionality for an Android app?

This is how a true caller works:

Enter image description here

My present output:

Enter image description here

Update 1

After bounty also I am not getting the exact thing I am looking for, but I will get back to all; I am working upon it. Anyway, this code works for most Android phones. If anybody is going to use and catch the solution for it, please write here so that everybody can get the benefit.

Update 2

I tried to implement Toast in the broadcast receiver's onReceive method because toast is a native component of Android, but it is also not getting displayed in Android 4.1 (Jelly Bean).

My idea was to implement Toast in the broadcast receiver's onReceive method and afterwards changing its design according to our needs and tuning its duration of display. But one more problem is that findViewById doesn't work in the broadcast receiver, so I think we have to make a LinearLayout programmatically for customizing the toast.

like image 319
Nikhil Agrawal Avatar asked Mar 28 '13 14:03

Nikhil Agrawal


People also ask

How do I show incoming call popup like Truecaller in react native?

Implementing this in react-native by registering Headless task. Registering the App as a Foreground service to run the app in the foreground. Open the App on receiving incoming calls using react-native-invoke-app. Navigate the user to Call PopupScreen and Show the user details.

How can I get true caller popup?

Go to Security > Auto start > Enable Truecaller. Go to Power management > Background app management > Enable Truecaller. Go to Notification Manager > Dropzone > Enable Truecaller.


1 Answers

I am not sure that your custom GUI will always be on top of the default one, because the system broadcast receiver and your receiver are both trying to display its GUI on top of the screen. We are not sure which one is called first, but one tricky work to make your GUI on top of the screen is when the phone is ringing call your activity after 1-2 second(s) used handler for that.

new Handler().postDelayed(new Runnable() {       @Override      public void run() {          // TODO Auto-generated method stub          Intent intent = new Intent(context, AcceptReject.class);          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);          context.startActivity(intent);      }  }, 2000); 

I hope it may help you.

like image 155
Hiren Dabhi Avatar answered Oct 03 '22 03:10

Hiren Dabhi