20

他のアプリケーションの上にあるビューを作成しようとしています:

WindowManager.LayoutParams paramsDirectorView = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

他の回答を調べたところ、「アプリケーションの描画」について次のことがわかりました。

「-- ウィンドウ タイプ 2038 の許可が拒否されました」というエラーが引き続き表示されます。現在、私は TYPE_PHONE を使用していますが、これは非推奨であり、TYPE_APPLICATION_OVERLAY を使用するように指示されています。TYPE_PHONE の回答は真の解決策ではなく、Android O で廃止された「パッチワーク」ソリューションであるため、これについてフォローアップできますか。

私はAndroid 7.1.2で実行しています

android.view.WindowManager$BadTokenException: ウィンドウを追加できない.-wrap21(ActivityThread.java) で android.app.ActivityThread$H.handleMessage(ActivityThread.java:1583) で android.os.Handler.dispatchMessage(Handler.java:102) で android.os.Looper.loop(Looper) .java:154) で android.app.ActivityThread.main(ActivityThread.java:6121) で java.lang.reflect.Method.invoke(ネイティブ メソッド) で com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit) .java:889) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) で 原因: android.view.WindowManager$BadTokenException: ウィンドウ android.view を追加できません。ViewRootImpl$W@1f47e89 -- android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342) の android.view.ViewRootImpl.setView(ViewRootImpl.java:703) で、android.view.WindowManagerImpl のウィンドウ タイプ 2038 に対する権限が拒否されました。 addView(WindowManagerImpl.java:93) で HeadService.TwoViewManager.(TwoViewManager.java:99) で HeadService.UIHeadService.onStartCommand(UIHeadService.java:65) で android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3327) で Android .app.ActivityThread.-wrap21(ActivityThread.java) で android.app.ActivityThread$H.handleMessage(ActivityThread.java:1583) で android.os.Handler.dispatchMessage(Handler.java:102) で android.os.Looper com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) で

4

6 に答える 6

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

サービスクラス(マシュマロの前後)でまったく同じ問題がありました。

if (Build.VERSION.SDK_INT >= 23) {
    if (!Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
          Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 1234);
    }
} else {
    startService(new Intent(SplashActivity.this,                     
    CheckServicesForApps.class));
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1234) {
            startService(new Intent(SplashActivity.this, 
            CheckServicesForApps.class));

    }
}

public class CheckServicesForApps extends Service {
    private Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();

        ImageView imageView = new ImageView(context);
        imageView.setVisibility(View.GONE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);

                //here is all the science of params
                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
                );

                windowManager.addView(imageView, params);
                hand=new Handler();

            } catch (Exception e) {
                hand=new Handler();
                e.printStackTrace();
            }
        }else{
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

            final WindowManager.LayoutParams 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.CENTER;
            params.x = ((getApplicationContext().getResources().getDisplayMetrics().widthPixels) / 2);
            params.y = ((getApplicationContext().getResources().getDisplayMetrics().heightPixels) / 2);
            windowManager.addView(imageView, params);
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        /* We want this service to continue running until it is explicitly
        * stopped, so return sticky.
        */
        return START_STICKY;
    }

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

        if (imageView != null) {
            try {
                windowManager.removeView(imageView);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**** added to fix the bug of view not attached to window manager ****/
    }
}
于 2017-12-11T09:17:34.917 に答える