I have used the below approach for my app,wherein I wanted to show a view ontop of the Dialer app when it launches(something similar to that in Truecaller).For this,create a Broadcast Receiver which helps to accept various device events as described below.
Broadcast Receiver :
private WindowManager wm;
private static LinearLayout ly1;
private WindowManager.LayoutParams params1;
// onReceive function of the Broadcast Receiver
public void onReceive(Context arg0, Intent arg1) {
String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE);
// Adds a view on top of the dialer app when it launches.
if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
params1 = new WindowManager.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSPARENT);
params1.height = 75;
params1.width = 512;
params1.x = 265;
params1.y = 400;
params1.format = PixelFormat.TRANSLUCENT;
ly1 = new LinearLayout(context);
ly1.setBackgroundColor(Color.BLACK);
ly1.setOrientation(LinearLayout.VERTICAL);
wm.addView(ly1, params1);
}
// To remove the view once the dialer app is closed.
if(arg1.getAction().equals("android.intent.action.PHONE_STATE")){
String state = arg1.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if(ly1!=null)
{
wm.removeView(ly1);
ly1 = null;
}
}
}
}
PS: The above eg generated a view having a layout with black background,having dimension as shown above.You have the liberty to add any layout within this view.For eg :To include a layout within the view you can modify the above code to include the following:
ly1 = new LinearLayout(getApplicationContext());
ly1.setOrientation(LinearLayout.HORIZONTAL);
View hiddenInfo = getLayoutInflater().inflate(R.layout.layout1, ly1, false);
ly1.addView(hiddenInfo);
wm.addView(ly1, params1);
PS: Layout1 is a layout which you need to create in your layout folder and reference it here.
Addtionally , in your manifest you need to include the following permissions.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<action android:name="android.intent.action.PHONE_STATE" /> (within intent filter of Broadcast Receiver)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…