Unable to delete overlay.

Update

I was able to fix this. The problem was that the dialogs and related can be initiated from the broadcast receiver, but it is not recommended, as the work ends before the presentation.

Trying to implement an overlay like fb messenger, truecaller etc.

public class IncomingCall extends BroadcastReceiver { private Context pcontext; private static final String TAG = "CustomBroadcastReceiver"; TelephonyManager telephony; CustomPhoneStateListener customPhoneListener ; @Override public void onReceive(Context context, Intent intent) { pcontext = context; Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); Log.w("DEBUG", state); telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); customPhoneListener = new CustomPhoneStateListener(); telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); Bundle bundle = intent.getExtras(); String phoneNr= bundle.getString("incoming_number"); } } public class CustomPhoneStateListener extends PhoneStateListener { private static final String TAG = "CustomPhoneStateListener"; Handler handler=new Handler(); @Override public void onCallStateChanged(int state, String incomingNumber) { WindowManager wm = (WindowManager) pcontext.getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = 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); params.height = LayoutParams.MATCH_PARENT; params.width = LayoutParams.MATCH_PARENT; params.format = PixelFormat.TRANSLUCENT; params.gravity = Gravity.BOTTOM; RelativeLayout ly; final LayoutInflater inflater = (LayoutInflater) pcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ly = (RelativeLayout) inflater.inflate(R.layout.dialog, null); switch (state) { case TelephonyManager.CALL_STATE_RINGING: Log.d("Call","RINGING"); wm.addView(ly, params); break; case TelephonyManager.CALL_STATE_IDLE: Log.d("Call","End"); //WindowManager wm = (WindowManager) pcontext.getSystemService(Context.WINDOW_SERVICE); if(ly!=null) { wm.removeView(ly); ly = null; } break; default: break; } super.onCallStateChanged(state, incomingNumber); telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_NONE); } } } 

addView works fine, here is the log

"View not connected to window manager"

 08-24 20:05:56.404: W/DEBUG(28001): IDLE 08-24 20:05:56.424: D/Call(28001): End 08-24 20:05:56.424: D/AndroidRuntime(28001): Shutting down VM 08-24 20:05:56.424: W/dalvikvm(28001): threadid=1: thread exiting with uncaught exception (group=0x412982a0) 08-24 20:05:56.444: E/AndroidRuntime(28001): FATAL EXCEPTION: main 08-24 20:05:56.444: E/AndroidRuntime(28001): java.lang.IllegalArgumentException: View not attached to window manager 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:673) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:369) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:160) 08-24 20:05:56.444: E/AndroidRuntime(28001): at com.androidexample.broadcastreceiver.IncomingCall$CustomPhoneStateListener.onCallStateChanged(IncomingCall.java:105) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:393) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.os.Handler.dispatchMessage(Handler.java:99) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.os.Looper.loop(Looper.java:137) 08-24 20:05:56.444: E/AndroidRuntime(28001): at android.app.ActivityThread.main(ActivityThread.java:4898) 08-24 20:05:56.444: E/AndroidRuntime(28001): at java.lang.reflect.Method.invokeNative(Native Method) 08-24 20:05:56.444: E/AndroidRuntime(28001): at java.lang.reflect.Method.invoke(Method.java:511) 08-24 20:05:56.444: E/AndroidRuntime(28001): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 08-24 20:05:56.444: E/AndroidRuntime(28001): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 08-24 20:05:56.444: E/AndroidRuntime(28001): at dalvik.system.NativeStart.main(Native Method) 08-24 20:08:22.669: I/Process(28001): Sending signal. PID: 28001 SIG: 9 

I also tried to create a mock program. but no luck

It is also not possible to determine the identifier of the generated layout.

+4
source share
2 answers

The problem was that we cannot use the dialogs in the broadcast receiver, and this must be in another action that can be started with intent.

+3
source

This method is called when BroadcastReceiver receives an Intent broadcast. During this time, you can use other methods in BroadcastReceiver to view / change the current values ​​of the result. This method is always called in the main thread of its process, unless you explicitly asked it to schedule in another thread using registerReceiver (BroadcastReceiver, IntentFilter, String, android.os.Handler). When it starts in the main thread, you should never perform lengthy operations in it (there is a waiting time of 10 seconds, which the system allows before considering that the receiver is blocked and the candidate to be killed). You cannot launch a popup dialog in your onReceive () implementation.

The Android documentation makes this clear.

Android Documentation on BroadcastReceiver

+1
source

Source: https://habr.com/ru/post/1494737/


All Articles