Служба падает - PullRequest
       6

Служба падает

0 голосов
/ 23 сентября 2018

Обновление: проблема решена.

ВНИМАНИЕ: На этот вопрос нет ответа ВСЕ, о котором упоминалось выше.

Проблема в том, что должно быть WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY вместо TYPE_PHONE.

Если у вас возникла такая же проблема, я бы предложил запросить разрешение в классе Java, как показано вссылка, упомянутая 0X0nosugar в комментариях.

Я использую сервис, который создает прозрачное плавающее окно с некоторой информацией, и пользователь может перетаскивать его куда угодно.

Пока что,После добавления всех просмотров мой сервис Сбой , и я получил эту ошибку.

java.lang.RuntimeException:

Unable to create service afm.dragger.Dragger: 

android.view.WindowManager$BadTokenException:

Unable to add window android.view.ViewRootImpl$W@ba63d06 -- permission denied for window type 2002

Мой minSdkVersion равен 21, а targetSdkVersion равен 27, и у меня sdk 27 ​​на моем телефоне.

Вот мой AndroidManifest:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name=".Dragger"/>
</application>

Вот мой Dragger.class:

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

        WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setBackgroundColor(Color.parseColor("#33FFFFFF"));

        LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        linearLayout.setLayoutParams(linearParams);

        Button button = new Button(this);
        button.setBackground(getResources().getDrawable(R.drawable.button_shape));
        button.setTextColor(getResources().getColor(android.R.color.white));
        button.setTextSize(14);
        button.setText("Stop Service");

        ViewGroup.LayoutParams buttonParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        button.setLayoutParams(buttonParams);

        linearLayout.addView(button, buttonParams);

        final WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(350, 250, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
        windowParams.x = 0;
        windowParams.y = 0;
        windowParams.gravity = Gravity.START|Gravity.TOP;
        manager.addView(linearLayout, windowParams);

        linearLayout.setOnTouchListener(new View.OnTouchListener() {

            private WindowManager.LayoutParams updatedParams = windowParams;
            int x, y;
            float touchedX, touchedY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        x = updatedParams.x;
                        y = updatedParams.y;

                        touchedX = event.getRawX();
                        touchedY = event.getRawY();

                        break;

                    case MotionEvent.ACTION_MOVE:
                        updatedParams.x = (int) (x + (event.getRawX() - touchedX));
                        updatedParams.y = (int) (y + (event.getRawY() - touchedY));

                        manager.updateViewLayout(linearLayout, updatedParams);

                    default:
                        break;
                }

                return false;
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                manager.removeView(linearLayout);
                stopSelf();
            }
        });
    }

И наконец, вот мойMainActivity:

start.setOnClickListener установлено на:

startService(new Intent(MainActivity.this, Dragger.class));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...