【问题标题】:Android App behaves strangely with System OverlayAndroid 应用程序在 System Overlay 中表现异常
【发布时间】:2020-04-21 09:03:17
【问题描述】:

所以我目前构建了一个 Android 应用程序(对于 API 24 及更高版本,使用 Visual Studio 和 Xamarin,但不是 Xamarin.Forms 应用程序),如果某个应用程序正在运行,它会显示一个覆盖图标。 如果我在 VisualStudio 中运行模拟器,一切正常,覆盖按钮是可点击的,并且一切正常,即使构建为 RELEASE 并通过模拟器运行它(我测试了 API 24(Android 7)及更高版本,直到 29(Android 10) )

因此,如果我将其打包到 apk 并将其安装在物理设备上(Android 7 到 Android 10,因为我有多个测试仪),也会显示覆盖图标,但如果用户按下它,则不会发生任何事情。就像点击不再注册一样。

//编辑:我遇到的一个主要问题: 我拥有的只有 Android 设备是 Android 6 (API 23) 和 Android 9(但 USB 调试功能损坏:在我将设备与我的电脑连接后,它显示:USB 调试处于活动状态,然后消息再次消失。所以有无法自己在 Android 设备上调试应用(主要智能手机是 iPhone)

这里有一些代码:

我的“主”类是这样定义的

public class MyAccessibilityService : AccessibilityService, View.IOnTouchListener, View.IOnClickListener

ImageButton 和 View 被全局定义以在我的班级中访问它

private static ImageButton Overlay;
private static View OverlayLayout;

只要显示覆盖按钮,我就会这样做:

windowManager = GetSystemService(WindowService).JavaCast<IWindowManager>();
OverlayLayout = LayoutInflater.From(this).Inflate(Resource.Layout.Sidebar, null, false);
Overlay = new ImageButton(this);
Overlay.Id = View.GenerateViewId();
Overlay.SetOnTouchListener(this);
Overlay.SetOnClickListener(this);
Overlay.SetImageResource(Resource.Mipmap.app64);
WindowManagerTypes layoutFlag = Build.VERSION.SdkInt >= BuildVersionCodes.O
   ? WindowManagerTypes.ApplicationOverlay
   : WindowManagerTypes.Phone;
paramsF = new WindowManagerLayoutParams(
             ViewGroup.LayoutParams.WrapContent,
             ViewGroup.LayoutParams.WrapContent,
             layoutFlag,
             WindowManagerFlags.NotTouchModal | WindowManagerFlags.NotFocusable,
             Format.Transparent);
paramsF.Gravity = GravityFlags.Bottom | GravityFlags.Right;
paramsF.X = 100;
paramsF.Y = 0;
windowManager.AddView(Overlay, paramsF);

听说如果 API 为 26 或更高,则要显示的叠加层的 WindowManagerTypes 是不一样的。

在 OnCLick 事件中我有这个:

Log.Debug("Service", "CLICK->" + v.Id);
if (v.Id == Overlay.Id)
   OpenShortInfo();

在 OnTouch 事件中,我有这个只是为了记录一些事情:

Log.Debug("Service", "TOUCH->"+v.Id);

如果我使用模拟器,则会调用两个调试日志,但如果我使用物理设备则不会。

感谢您的帮助,抱歉英语不好

【问题讨论】:

    标签: c# android visual-studio xamarin.android


    【解决方案1】:

    如何检查Log.Debug 是否在真实设备上被调用?

    该方法用于调试时在输出窗口打印日志,在真机上运行时不会发生任何事情。

    尝试显示 AlertDialog 以查看是否触发了 OnCLick 事件。

            Android.App.AlertDialog.Builder dialog = new AlertDialog.Builder(this);
            AlertDialog alert = dialog.Create();
            alert.SetTitle("Title");
            alert.SetMessage("Complex Alert");
            alert.SetButton("OK", (c, ev) =>
            {
                // Ok button click task  
            });
            alert.SetButton2("CANCEL", (c, ev) => { });
            alert.Show();
    

    更新

     public void OnClick(View v)
        {
            Log.Error("Click","------------------click");
        }
    
        public bool OnTouch(View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down)
            {
                Log.Error("OnTouch", "------------------touch");
    
            }
            return false;
        }
    

    【讨论】:

    • 我加了一个吐司来做这个。但这也没有出现,这意味着它没有被触发。但问题是:为什么它在模拟器上而不是在真实设备上触发
    • 你能用 button 代替 imagebutton 再试一次吗?
    • 我会试试的,在秒
    • 相同的结果只能移动(在我的 OnTouch 事件中)但不可点击
    • 你能告诉我你在模拟器和真机上测试的系统版本是什么吗?另请参阅stackoverflow.com/a/45003285/8187800
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多