无法删除重叠视图 [英] Can't remove overlay view
问题描述
更新
我能解决这个问题, 问题是对话和相关能从广播接收器启动,但不推荐,因为该活动运行View之前结束。
I was able to fix this, The problem was dialogs and related could be initiated from broadcast receiver but not recommended, as the activity running ends before the view.
想实现覆盖像FB的使者,truecaller等。
Trying to implement 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工作正常, 这里是日志
The addView works fine, Here is the log
查看未连接到窗口管理器
"View not attached 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
我曾尝试创建布局programmaticaly太.. 但没有运气
I had tried creating the layout programmaticaly too.. but no luck
也想不通生成布局的ID
Also can't figure out the id of the generated layout
推荐答案
但问题是,我们不能使用对话框中的广播接收器,它必须处于可能意图启动另一个活动。
The problem was, we cant use dialogs in broadcast receiver and it has to be in another activity that could be started with intent.
这篇关于无法删除重叠视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!