gpt4 book ai didi

android - WindowManager$BadTokenException : Unable to add window android. view.ViewRootImpl$W@61b864 -- 窗口类型 2010 的权限被拒绝

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:30 26 4
gpt4 key购买 nike

我正在尝试制作一个系统覆盖窗口,它也会出现在锁屏上。我确实在 6.0 版上做到了,但在 7.0 和 8.0 版上不起作用。第一次运行时,我被转移到我的应用程序的覆盖设置(正如 Android M 及以后的版本所预期的那样)并且我允许它。但是现在当我尝试从应用程序启动服务时它不断崩溃。我尝试了所有与此问题相关的事情,但还没有任何帮助我解决它。每次我尝试启动该服务时都会收到此错误:-

FATAL EXCEPTION: main
Process: com.example.sumuix.lockdown, PID: 5128
java.lang.RuntimeException: Unable to create service com.example.sumuix.lockdown.MyService:android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@61b864 -- permission denied for window type 2010
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3414)
at android.app.ActivityThread.-wrap4(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@61b864 -- permission denied for window type 2010
at android.view.ViewRootImpl.setView(ViewRootImpl.java:788)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
at com.example.sumuix.lockdown.MyService.onCreate(MyService.java:64)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3404)
at android.app.ActivityThread.-wrap4(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

这是我的代码:-(MyService.java)

@Override
public void onCreate() {
super.onCreate();
HeadView = LayoutInflater.from(this).inflate(R.layout.overlay_head,null);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(HeadView, params); //I’m getting error here...(MyService.java:64)from error log

ImageView closeButton = (ImageView) HeadView.findViewById(R.id.close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopSelf();
}
});

final ImageView chatHeadImage = (ImageView) HeadView.findViewById(R.id.head);
chatHeadImage.setOnTouchListener(new View.OnTouchListener() {
//Code for OnTouch.
}
});
}

我的 MainActivity ,我在其中调用上述服务:- (MyActivity.java)

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
back=(Button) findViewById(R.id.jump);
final Intent intentService=new Intent(MainActivity.this, MyService.class);
if (Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(MainActivity.this)) {

//If the draw over permission is not available open the settings screen
//to grant the permission.
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent,1234);
}else {
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(intentService);
finish();
}
});
}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1234) {

//Check if the permission is granted or not.
if (Build.VERSION.SDK_INT >= 23 && Settings.canDrawOverlays(MainActivity.this)) {
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(new Intent(MainActivity.this, MyService.class));
finish();
}
});
} else { //Permission is not available
Toast.makeText(this,
"Draw over other app permission not available. Closing the application",
Toast.LENGTH_SHORT).show();

finish();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}

在 list 中:-

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

我的服务布局 XML:-

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/chat_head_root"
android:layout_width="65dp"
android:layout_height="wrap_content"
android:background="@android:color/black"
android:orientation="vertical">

<ImageView
android:id="@+id/head"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginTop="8dp"
android:background="@android:drawable/ic_menu_info_details"
tools:ignore="ContentDescription" />

<ImageView
android:id="@+id/close_btn"
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_marginLeft="40dp"
android:background="@android:drawable/ic_menu_close_clear_cancel"
tools:ignore="ContentDescription" />
</RelativeLayout>

我几乎尝试了在互联网上搜索时找到的所有东西。我刚开始使用 Android,所以如果我犯了任何小错误,请告诉我。提前致谢。

最佳答案

对于 android 8.0,您必须使用 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。错误覆盖、电话覆盖和类似功能不再起作用。

在这里查看更多信息:https://developer.android.com/about/versions/oreo/android-8.0-changes.html#o-apps

不知道为什么你在 android 7 上有问题,我自己从来没有遇到过......

旁注

如果您的服务是前台服务,请不要再使用 startService,如果您的服务是前台服务,请使用 startForegroundService 或它的 ContextCompat 版本如果您想在启动后或从后台的其他任何地方启动覆盖服务,则可以使用前台服务来避免可能出现的问题...

关于android - WindowManager$BadTokenException : Unable to add window android. view.ViewRootImpl$W@61b864 -- 窗口类型 2010 的权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45102537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com