Как создать системный оверлей, который показывает текст поверх всех других приложений в Android Q? - PullRequest
0 голосов
/ 20 июня 2020

Я пытался создать системный оверлей, ориентированный на Android 10, который всегда отображает текст на экране. До сих пор я ссылался на предыдущие потоки StackOverflow, подобные приведенному здесь: Создание окна системного оверлея (всегда сверху) , а также github: https://gist.github.com/bjoernQ/6975256. Мое приложение в настоящее время не работает и обычно дает сбой (в нем говорится, что мое приложение закрывается). Чем больше я читал о Android системных наложениях в Интернете, тем больше я узнавал о том, чем код для новых версий отличается от более старых версий, например о разрешениях на добавление в манифест Android и о том, что нет. Может ли кто-нибудь помочь мне выяснить, что не так с моим кодом? Кстати, моя конечная цель - иметь возможность исправить всегда присутствующую невидимую круговую панель поиска (см. Здесь для справки: https://github.com/devadvance/circularseekbar) на экране пользователя, поэтому любые советы по поводу панелей поиска в службах будут очень полезны. тоже оценили!

Android Манифест:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test">


        <application android:label="Test"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">

            <activity android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <service android:name="com.example.test.VolumeSeekbarOverlay"
                android:exported="false" />
        </application>

        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    </manifest>

Основная деятельность:

    package com.example.test;
    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.os.Bundle;

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Intent service = new Intent(this, VolumeSeekbarOverlay.class);
            startService(service);
            finish();
        }
    }

Сервис:

    package com.example.test;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Color;
    import android.graphics.PixelFormat;
    import android.os.IBinder;
    import android.view.Gravity;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.TextView;

    public class VolumeSeekbarOverlay extends Service {

        private TextView testText;
        private Button overlayedButton;
        private WindowManager wm;

        @Override
        public IBinder onBind(Intent intent) {

            return null;
        }

        @Override
        public void onCreate() {
            super.onCreate();

            wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

            testText = new TextView(this);
            testText.setTextColor(Color.BLACK);
            testText.setTextSize(20);
            testText.setText("TEST");

            overlayedButton = new Button(this);
            overlayedButton.setText("Overlay button");
            overlayedButton.setBackgroundColor(Color.BLACK);

            WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                    PixelFormat.TRANSLUCENT);
            params.gravity = Gravity.LEFT | Gravity.TOP;
            params.x = 0;
            params.y = 0;

            wm.addView(testText, params);
        }

    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...