标签: android-windowmanager

WindowManager.addView() 导致 BadTokenException

我正在尝试创建一个覆盖窗口,但是当我尝试将视图添加到 WindowManager 时,它给了我一个异常。我添加了“SYSTEM_ALERT_WINDOW”权限,并在应用信息中启用了“绘制其他应用”。我从服务的 onCreate 函数中调用它。

  • 设备:运行 8.0.0 的模拟器
  • 目标 SDK 和编译的 SDK 版本:26
  • AppCompat 版本:26.0.0

代码:

    WindowManager manager = (WindowManager)getSystemService(WINDOW_SERVICE);
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    RelativeLayout overlay = (RelativeLayout) inflater.inflate(R.layout.button_main, null);

    final WindowManager.LayoutParams params =
            new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
                    0,
                    PixelFormat.TRANSLUCENT);


    params.gravity = Gravity.TOP | Gravity.START;
    params.x = 0;
    params.y = 0;

    manager.addView(overlay, params);
Run Code Online (Sandbox Code Playgroud)

异常堆栈跟踪:

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:764
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
Run Code Online (Sandbox Code Playgroud)

无论我为 …

android android-service android-layout android-view android-windowmanager

2
推荐指数
1
解决办法
2292
查看次数

窗口类型 2038 的权限被拒绝

我正在修复一个不是我开发的 android 应用程序,几天前客户端要求我将 targetSdkVersion 设置为 26(之前是 14),之后我注意到应用程序在某些情况下崩溃,例如崩溃时显示 ProgressDialog。这是存在此问题的代码部分:

mProgressDialog.setTitle(getString(R.string.downloading_data));
mProgressDialog.setMessage(mAlertMsg);
Drawable icon = getActivity().getDrawable(android.R.drawable.ic_dialog_info);
icon.setColorFilter(Color.parseColor("#00cbac"), PorterDuff.Mode.SRC_ATOP);
mProgressDialog.setIcon(icon);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setCancelable(false);
mProgressDialog.setButton(getString(R.string.cancel), loadingButtonListener);
mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mProgressDialog.show();
Run Code Online (Sandbox Code Playgroud)

执行最后一行时,应用程序崩溃并在 Logcat 中出现此错误:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2003
Run Code Online (Sandbox Code Playgroud)

当应用程序运行在具有Android 8和9的设备上时会出现此问题。我寻找了类似问题的解决方案,发现使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY代替会更好TYPE_SYSTEM_ALERT,然后我修改了我写的代码的倒数第二行在这篇文章中,但它没有改变任何东西,应用程序崩溃了,并且在日志中出现了这个错误:

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2038
Run Code Online (Sandbox Code Playgroud)

在清单中,我有权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)

我还从设备设置中启用了该应用程序的所有权限。我怎么解决这个问题?

android android-windowmanager android-layoutparams

2
推荐指数
1
解决办法
6994
查看次数

Android : 在锁屏上显示视图(如谷歌地图)

我想在锁屏上显示个性化视图(实时显示一些数据)(之后用户将手机锁定在活动上)。
谷歌地图和百度地图(以及其他一些我忘记名字的应用)已经完全实现了我想要的。

所以我试图在我的 BroadcastReceiver 被触发时添加一个视图。
我从这个答案这个答案中尝试了一些观点。我也试过这个
在我根据许可出现错误之前:

窗口类型 2XXX 的权限被拒绝

现在我没有任何错误,但我的视图没有显示。
我的情况是:
MainActivity.kt:

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    private val REQUEST_CODE = 10001

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        checkDrawOverlayPermission()
    }
    fun checkDrawOverlayPermission() {
        /** check if we already  have permission to draw over other apps */
        if (!Settings.canDrawOverlays(this)) {
            /** if not construct intent to request permission */
            val intent = …
Run Code Online (Sandbox Code Playgroud)

android lockscreen android-view android-windowmanager android-permissions

2
推荐指数
1
解决办法
1714
查看次数

进度对话框 - WindowManager $ BadTokenException:无法添加窗口 - 令牌null不适用于应用程序

我有一个MapActivity,其中首先我试图获取用户的当前位置.为了获取当前位置,我使用了AsyncTask概念.现在我想要实现的是向用户显示ProgressDialog,直到获得当前位置.

这是布局代码: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:apiKey="0nO35c3MpXJisxsknk_w_fqVQa78sPhMQK3Yf5w"
        android:clickable="true" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <SeekBar
            android:id="@+id/zoombar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:max="20"
            android:progress="0" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="70dip"
        android:layout_marginTop="5dip"
        android:background="@drawable/round"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="5dip" >

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" >

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/sun" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_marginLeft="15dip" >

                <ImageView
                    android:id="@+id/rupee"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/rupee" />

                <TextView
                    android:id="@+id/day_amount"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical|right"
                    android:layout_marginLeft="10dip" …
Run Code Online (Sandbox Code Playgroud)

android progressdialog android-asynctask android-windowmanager

1
推荐指数
1
解决办法
6846
查看次数

当设置处于自动模式时,如何获得之前的屏幕亮度值?

我想前面的屏幕亮度,当亮度显示设置为自动模式.

我尝试使用以下代码:

WindowManager.LayoutParams lp = getWindow().getAttributes();
previousScreenBrightness = lp.screenBrightness;
Run Code Online (Sandbox Code Playgroud)

但的价值previousScreenBrightness-1.0,即使我把手机在深或浅的地方所有的时间.

亮度设置不在自动模式下时,我可以获得正确的值.

我使用的是Android 4.2.

android screen android-preferences android-windowmanager

1
推荐指数
1
解决办法
2523
查看次数

Android:ProgressDialog.show()WindowManager令牌,无效

public class MainActivity extends Activity {

    private static String State = "STOP";

    final String address = "http://XXXX.co.uk:9994";
    private ImageView Player;
    private ProgressDialog progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        // requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.activity_main);


        Button Schedule;
        Button Presenters;
        Button Image;

        Player = (ImageView) findViewById(R.id.imgStart);

        if(State != "STOP"){
            Player.setImageResource(R.drawable.stop);       
        }
        else{
            Player.setImageResource(R.drawable.start);
        }

        Schedule = (Button) findViewById(R.id.btnSchedule);
        Presenters = (Button) findViewById(R.id.btnPresenters);
        Image = (Button) findViewById(R.id.imgbutton);
        LocalBroadcastManager.getInstance(this).registerReceiver(LoadingReceiver, new IntentFilter("loading"));
        LocalBroadcastManager.getInstance(this).registerReceiver(CompletionReceiver, new IntentFilter("done"));
        LocalBroadcastManager.getInstance(this).registerReceiver(ErrorReceiver, new IntentFilter("error"));



        Player.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View …
Run Code Online (Sandbox Code Playgroud)

android progressdialog android-windowmanager

1
推荐指数
1
解决办法
1643
查看次数

检查是否使用windowmanager显示视图

在添加WindowManager之前,如何知道是否显示视图?我需要在原生拨号器中放置一个叠加层,但有时将原生拨号器放在mi自定义视图上方,我通过使用WindowManager多次添加元素来解决这个问题,但有时候视图会显示两次.

谢谢!!

private void callStartIncomingCallScreen(Context context, String incomingNumber) {
    startIncomingCallScreen(context, incomingNumber);

    Timer timer = new Timer();

    for (int i = 0; i < 2; i++) {
        timer.schedule(new StartIncomingCallScreenTimerTask(context, incomingNumber), 100 * i);
    }
}


class StartIncomingCallScreenTimerTask extends TimerTask {

    private Context context;
    private String incomingNumber;

    StartIncomingCallScreenTimerTask(Context context, String incomingNumber) {
        this.context = context;
        this.incomingNumber = incomingNumber;
    }

    public void run() {
        Intent intent = new Intent(context, IncomingCallGuiService.class);
        context.startService(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

在IncomingCallGuiService中,我添加如下视图:

final LayoutParams params = new LayoutParams(
      LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
      LayoutParams.TYPE_SYSTEM_ALERT, …
Run Code Online (Sandbox Code Playgroud)

android overlay android-windowmanager

1
推荐指数
1
解决办法
2542
查看次数

如何在实现您的媒体库的应用中确定状态栏是否为半透明?

我创建了一个小库,用于将视图放置在现有视图的旁边/上方/下方(例如,“帮助”箭头或类似的东西),

MainView.getLocationOnScreen(..);
Run Code Online (Sandbox Code Playgroud)

确定主视图将在附近放置同级视图的位置。

通常,我使用以下方法通过以下方法确定主视图的顶部(Y),然后使用以下方法确定状态栏的高度:

protected boolean isTranslucentStaturBar()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = ((Activity) mainActionView.getContext()).getWindow();

   --> return // SOME EXPRESSION TO DETERMINE IF THE STATUS BAR IS TRANSLUCENT <--- ?????
        // I Need to know what expression I need to write here
        // i.e. How to ready the flag: WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    }

    return false;
}

protected int getStatusBarHeight() {
    if (isTranslucentStaturBar()) {
        return 0;
    }

    int result = 0;
    int resourceId = mainActionView.getContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-windowmanager

1
推荐指数
1
解决办法
1013
查看次数

XAMARIN C# Android:权限:API 23 方法和常量是否已实现?

我需要将 WindowManager 与 WindowManagerTypes.SystemOverlay 参数一起使用

在我的项目上启用了此权限

但它是 API < 23 的参数

我使用 API 23 (Android 6.0) 开发

我需要在我的 Android 测试手机的设置 => 应用程序 => 应用程序管理器设置中启用参数“绘制其他应用程序”

我在 Xamarin 中找不到:Settings.ActionManageOverlayPermission 和 Settings.CanDrawOverlays 函数,它是否已实现?

此元素是从 Xamarin.Android 版本 5.1.99 添加的(请参阅下面的链接):

https://developer.xamarin.com/releases/android/xamarin.android_5/xamarin.android_5.1.99/level_23_diff/mono.android.dll/

但我不能使用元素。

我使用 java 代码来解释实现问题(见下文),我想做这段代码,但当然是在 C# 中。

爪哇代码

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469;

public void testPermission() {
    if (!Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
    }
}
Result :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if …
Run Code Online (Sandbox Code Playgroud)

permissions overlay android-windowmanager xamarin android-6.0-marshmallow

1
推荐指数
1
解决办法
1272
查看次数

-1
推荐指数
1
解决办法
335
查看次数