Android Приложение ведет себя странно с наложением системы - PullRequest
0 голосов
/ 21 апреля 2020

Итак, в настоящее время я создаю приложение Android (для API 24 и выше, с использованием Visual Studio и Xamarin, но не приложения Xamarin.Forms), которое отображает значок наложения, если запущено определенное приложение. Если я запускаю эмулятор в VisualStudio, то все работает нормально, кнопка «Оверлей» нажимается, и все работает, как и должно, даже если сборка выполняется как RELEASE и выполняется через эмулятор (я тестировал API 24 (Android 7) и выше до 29 (*) 1033 * 10))

Так что, если я упакую его в apk и установлю его на физическое устройство (также с Android 7 до Android 10, потому что у меня есть несколько тестеров), также появится значок наложения, но если пользователь нажимает на него, ничего не происходит. Это похоже на то, что щелчок больше не регистрируется.

// edit: одна серьезная проблема, с которой я столкнулся: только Android устройств, которые у меня есть, Android 6 (API 23) и Android 9 ( но с неработающей функцией отладки usb: после подключения устройства с моим p c он говорит: USB Debugging active, затем сообщение исчезает и снова. Поэтому нет способа отладить приложение на устройстве 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);

Я слышал, что WindowManagerTypes для наложения будет отображаются не то же самое, если API 26 или выше.

в событии OnCLick У меня есть это:

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

в событии OnTouch У меня есть это только для регистрации некоторых вещей:

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

Оба журнала отладки вызываются, если я использую эмулятор, но не если я использую физический деви ce.

Спасибо за помощь и извините за плохой английский sh

1 Ответ

0 голосов
/ 21 апреля 2020

Как проверить, вызывается ли 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;
    }
...