我使用<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
来显示一个覆盖在其他应用程序上的弹出窗口,但Android 12阻止了触摸。根据文档,它阻止了触摸事件,我怎么能允许在Android 12上触摸。
以下是Android 12行为改变触摸事件的链接https://developer.android.com/about/versions/12/behavior-changes-all#untrusted-touch-events
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.hardware.input.InputManager;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
public class FloatWidgetService extends Service {
private WindowManager mWindowManager;
private View mFloatingWidget;
public FloatWidgetService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
final WindowManager.LayoutParams params;
mFloatingWidget = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);
mFloatingWidget.setFilterTouchesWhenObscured(true);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;
params.y = 100;
try {
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingWidget, params);
mFloatingWidget.findViewById(R.id.root_container).setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
int Xdiff = (int) (event.getRawX() - initialTouchX);
int Ydiff = (int) (event.getRawY() - initialTouchY);
if (Xdiff < 10 && Ydiff < 10) {
startActivity(new Intent(getApplicationContext(), MainActivity.class));
stopSelf();
}
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
mWindowManager.updateViewLayout(mFloatingWidget, params);
return true;
}
return false;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mFloatingWidget != null) mWindowManager.removeView(mFloatingWidget);
}
}
字符串
3条答案
按热度按时间368yc8dk1#
对于窗口类型,请尝试以下操作:
字符串
请参见TYPE_APPLICATION_OVERLAY。
这是Kotlin,但你应该能够很容易地转换到Java。
kcrjzv8t2#
我不认为这是可能的了。正如文档中所述,窗口类型为:
类型_应用_覆盖
不受信任,因此不会被排除在此保护之外。
然而,他们确实写了这样的话:
例外情况:
完全透明的 windows 。 windows 的alpha属性是0.0。
因此,您可以尝试删除:
PixelFormat.TRANSLUCENT
而是设置一个真实的颜色,但alpha为0,例如(#00XXXXXX)可能会起作用,但这只是一个猜测
8qgya5xd3#
设置alpha窗口值为我修复了它
字符串
文档有点令人困惑,因为他们说alpha值必须为零,但他们说组合窗口不透明度必须小于或等于系统对触摸的最大模糊不透明度,Android 12的最大模糊不透明度为0.8。
这是只需要为Android 12(API 31).我不需要为Android 12 L或13设置不透明度.