java - 无法添加窗口——对此窗口类型的权限被拒绝

标签 java android android-windowmanager

我在服务中使用了 WindowManager,我一直在尝试从 this 中找到解决方法发布和其他帖子,但我仍然收到此错误信息。

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

我已经在我的 Manifest.xml 上使用 android.permission.SYSTEM_ALERT_WINDOW<--- current 或者 android.permission.INTERNAL_SYSTEM_WINDOW(这是系统应用只能使用)

我的最低 sdk 是 API 17。

错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: id.nax.androidstatelite, PID: 16973
    java.lang.RuntimeException: Unable to create service id.nax.androidstatelite.FloatingWindow: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b285d2e -- permission denied for this window type
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3883)
        at android.app.ActivityThread.access$2100(ActivityThread.java:229)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1909)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:7406)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b285d2e -- permission denied for this window type
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:936)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:337)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
        at id.nax.androidstatelite.FloatingWindow.onCreate(FloatingWindow.java:56)
        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3873)
        at android.app.ActivityThread.access$2100(ActivityThread.java:229) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1909) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:7406) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我的服务:(我指的是下载示例项目中的这段代码)

public class FloatingWindow extends Service {

    WindowManager wm;
    LinearLayout ll;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();

        wm = (WindowManager) getSystemService(WINDOW_SERVICE);

        ll = new LinearLayout(this);
        ll.setBackgroundColor(Color.RED);
        LinearLayout.LayoutParams layoutParameteres = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, 400);
        ll.setBackgroundColor(Color.argb(66,255,0,0));
        ll.setLayoutParams(layoutParameteres);

        final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(
                500, 200, WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        parameters.gravity = Gravity.CENTER | Gravity.CENTER;
        parameters.x = 0;
        parameters.y = 0;

      Button     stop = new Button(this);
    stop.setText("Stop");
        ViewGroup.LayoutParams btnParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        stop.setLayoutParams(btnParameters);

        ll.addView(stop);
        wm.addView(ll, parameters);

        ll.setOnTouchListener(new View.OnTouchListener() {
            WindowManager.LayoutParams updatedParameters = parameters;
            double x;
            double y;
            double pressedX;
            double pressedY;

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

                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:

                        x = updatedParameters.x;
                        y = updatedParameters.y;

                        pressedX = event.getRawX();
                        pressedY = event.getRawY();

                        break;

                    case MotionEvent.ACTION_MOVE:
                        updatedParameters.x = (int) (x + (event.getRawX() - pressedX));
                        updatedParameters.y = (int) (y + (event.getRawY() - pressedY));

                        wm.updateViewLayout(ll, updatedParameters);

                    default:
                        break;
                }

                return false;
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wm.removeView(ll);
                stopSelf();
                System.exit(0);
            }
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopSelf();
    }

} 

我更喜欢/从this复制代码和 this 我复制这段代码有点旧,在项目下载中已经有 app-debug.apk(这在 list 中使用 android.permission.SYSTEM_ALERT_WINDOW),我尝试正常运行但是当我使用我的项目代码给我错误信息。

我还必须使用什么权限?

最佳答案

这个问题自己解决了

更新

确保您已在 list 中添加权限。

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

把它放在 onCreate 或任何你想要的 askPermission()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
   askPermission()
}

方法:

@TargetApi(23)
public void askPermission() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, SYSTEM_ALERT_WINDOW_PERMISSION);
}

关于java - 无法添加窗口——对此窗口类型的权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101063/

相关文章:

java - 使用扫描仪读取同一行两次

android - 占位符的 picasso 图书馆圆角

android - 如何在 ndk 应用程序中链接任何库

android - 在设备旋转时打开 Activity 泄漏窗口的 OptionsMenu

android - 如何确定状态栏是否在实现您的库的应用程序中是半透明的?

java - 使用 Optional 避免 NPE

Java删除超过N天的文件

android - 无法使用 WindowManager.LayoutParams.FLAG_SECURE 在 Android 12 上保护窗口

java - java中的交集方法,我如何对交集的边界进行排序,这样我就不会重复

android - 如何知道youtube正在通过我的android应用程序播放?