#android #android-layout
#Android #android-макет
Вопрос:
Я пытаюсь создать float overlaying space в Android. У меня есть:
targetSdkVersion 30
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Я зарегистрировал службу с
<service
android:name=".service.RecordService"
android:enabled="true"
android:foregroundServiceType="mediaProjection">
</service>
и запустите его с
Intent intent = new Intent(MainActivity.this, RecordService.class);
intent.putExtra("cmd","start service");
startService(intent);
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, intent);
и все это ломается на
mWindowManager = (WindowManager)getApplication().getSystemService(WINDOW_SERVICE);
mLayoutParams = new LayoutParams();
mLayoutParams.type = LayoutParams.TYPE_APPLICATION_OVERLAY;
mLayoutParams.format = PixelFormat.RGBA_8888;
mLayoutParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.gravity = Gravity.CENTER;
mLayoutParams.x = 0;
mLayoutParams.y = 0;
mLayoutParams.width = LayoutParams.WRAP_CONTENT;
mLayoutParams.height = LayoutParams.WRAP_CONTENT;
final LayoutInflater inflater = LayoutInflater.from(getApplication());
mFloatLayout = (FrameLayout)inflater.inflate(R.layout.layout_record,null);
mStartBtn = (TextView)mFloatLayout.findViewById(R.id.btn_start);
mStartBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(RecordService.this, RecordService.class);
intent.putExtra("cmd","start recording");
startService(intent);
}
});
mFloatLayout.setVisibility(View.INVISIBLE);
mWindowManager.addView(mFloatLayout, mLayoutParams);
в последней строке 🙁
Что я делаю не так?
Я пытался также использовать
mLayoutParams.type = LayoutParams.TYPE_PHONE;
mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ALERT;
но с той же проблемой:
Process: com.poqdev.screenrec, PID: 20517
java.lang.RuntimeException: Unable to create service com.poqdev.screenrec.service.RecordService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@90e7698 -- permission denied for window type 2038
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4204)
at android.app.ActivityThread.access$1500(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@90e7698 -- permission denied for window type 2038
at android.view.ViewRootImpl.setView(ViewRootImpl.java:1092)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
at com.poqdev.screenrec.service.RecordService.createFloatView(RecordService.java:145)
at com.poqdev.screenrec.service.RecordService.onCreate(RecordService.java:66)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4192)
Что я делаю не так?
Комментарии:
1. Найдено какое-либо решение для этого?
Ответ №1:
Привет, это может быть немного поздно, но у меня была такая же проблема, и я обнаружил, что вы должны предоставить своему приложению разрешение «Отображать поверх других приложений» в настройках. Как только вы установите для этого значение разрешено, вы не должны видеть эту ошибку.