Android:ウィンドウを追加できません。このウィンドウタイプのアクセスが拒否されました


85

私はいくつかの情報でウィンドウを表示する必要があるアプリに取り組んでいますON携帯電話のロックを解除せずに画面のロック(キーガード)。私はおそらくWindowManager.LayoutParams.TYPE_KEYGUARD_DIALOGでそれを行うことができると思いました

しかし、私のアプリが次のエラーでクラッシュするたびに:

android.view.WindowManager $ BadTokenException:ウィンドウを追加できませんandroid.view.ViewRootImpl $ W @ 40ec8528-このウィンドウタイプのアクセス許可が拒否されました

これらの投稿(ここここここ)はすべて同じ答えを与えます。マニフェストファイルに次の権限を追加します。

android.permission.SYSTEM_ALERT_WINDOW

私が実装した解決策ですが、それでも同じエラーが発生します。私が間違っていることについて何か考えはありますか?

マニフェストファイルの権限は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />

そして、これは私がウィンドウをロック画面に追加するために使用するコードです

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mView = mInflater.inflate(R.layout.lock_screen_notif, null);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

    wm.addView(mView, params);

誰かアイデアがありますか?

PS私はAndroid4.4.2を実行しているHTCDesire 620DSでテストしています

回答:


30

完全に明白な理由で、通常のアプリはロック画面の上に任意のウィンドウを作成することを許可されていません。実際のロック画面を完全に模倣して違いがわからないウィンドウをロック画面に作成した場合、私は何ができると思いますか?

エラーの技術的な理由は、TYPE_KEYGUARD_DIALOGフラグの使用ですandroid.permission.INTERNAL_SYSTEM_WINDOW。これには、署名レベルのアクセス許可が必要です。これは、権限の作成者と同じ証明書で署名されたアプリのみがそれを使用できることを意味します。

の作成者android.permission.INTERNAL_SYSTEM_WINDOWはAndroidシステム自体であるため、アプリがOSの一部でない限り、チャンスはありません。

ロック画面からユーザーに情報通知する方法は、明確に定義され、十分に文書化されています。ロック画面に表示されるカスタマイズされた通知を作成でき、ユーザーはそれらを操作できます。


2
個人的には、Facebookアプリのロック画面通知のようなものを探していました。新しいロック画面の通知についてはすでに知っていましたが、現時点ではAndroid22でのみ機能します。人造人間16号以降で動作するソリューションが必要です。しかし、あなたの答えは完全に理にかなっているので、私はそれを受け入れます。ロック画面にウィンドウを表示することはできましたが、必要なものではありません。以下で見つけた解決策を投稿します。
DroidPilot 2015

1
アプリにその権限が必要な場合は、インストールして開いた後に付与できます。
SkorpEN 2018

オレオ以来、これは正しい答えだと思いますstackoverflow.com/a/48481628/504179
ATom 2018

107

使用する場合は使用apiLevel >= 19しないでください

WindowManager.LayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 

次のエラーが発生します。

android.view.WindowManager $ BadTokenException:ウィンドウを追加できませんandroid.view.ViewRootImpl $ W @ 40ec8528-このウィンドウタイプのアクセス許可が拒否されました

代わりにこれを使用してください:

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

3
私が持っているTYPE_SYSTEM_ALERTとのAndroid 5.1に取り組んで罰金をandroid.permission.SYSTEM_ALERT_WINDOWマニフェストに付与されました。
サム

私はで使用する必要android.permission.SYSTEM_ALERT_WINDOWがあり LayoutParams.TYPE_TOASTますか?
t0m 2017

1
LayoutParams.TYPE_TOASTを試しました。LollipopとMarshmallowの両方でAPIレベル6.0.1で動作します。それ以前は、Lollipopでのみ機能していたWindowManager.LayoutParams.TYPE_SYSTEM_ALERTを使用していました。
Prashant 2017

残念ながら、一部のアプリケーションが許可ダイアログを要求した場合に「画面オーバーレイが検出されました」(ビューがアクティブな場合)
Siarhei 2017

サービスまたはブロードキャストレシーバー内からウィンドウを表示しようとしている場合、これは機能しません
FindOutIslamNow 2018年

78

ターゲットを区別する必要があると思います(Oreoの前後)

int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    LAYOUT_FLAG,
    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);

同様の手法を使用しようとしていますが、AndroidStudioがBuild.VERSION_CODES.O&を認識できませんWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。私のtargetSdkVersionは26です
Gabe O'Leary

私の側からあなたの助け+1に感謝します。
2018

@ GabeO'Leary私は同じ問題に直面しています、これに対する解決策はありますか?
Sagar

49

私はこの問題で利用可能なすべての例を試すために最善を尽くしました。ついに私はこれに対する答えを得ました。それがどれだけ信頼できるかはわかりませんが、私のアプリは現在クラッシュしていません。

windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    //here is all the science of params
    final LayoutParams myParams = new LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

マニフェストファイルで許可を与えるだけです

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

これに加えて、APIレベルが23以上の場合はAPIレベルを確認することもできます。

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

それがどこかの誰かに役立つことを願っています。完全な例 https://anam-android-codes.blogspot.in/?m=1


13

Android APIレベル8.0.0の場合、次を使用する必要があります

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

の代わりに

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

またはSYSTEM_ALERT


TYPE_APPLICATION_OVERLAYは、AndroidStudioに表示されるオプションのリストに含まれていません。「シンボルタイプを解決できません」というメッセージが表示されます。何が足りないのですか?
philcruz

11

このコードが完全に機能するようにしてください

int layout_parms;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 

    {  
         layout_parms = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

    }

     else {

            layout_parms = WindowManager.LayoutParams.TYPE_PHONE;

    }

    yourparams = new WindowManager.LayoutParams(       
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            layout_parms,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

あなたは私の命を救った
Fo Nko 2018

このコードを配置するウィジェットを表示する@BakaWaiiは正常に機能します
shakirullahorakzai18年

6

探す

他のアプリの上に描く

設定でアプリを有効にします。Android 8 Oreoの場合は、

設定>アプリと通知>アプリ情報>他のアプリの上に表示>有効にする


1
あなたは命の恩人です
ヌールホサイン

5

まず、マニフェストファイルに権限を追加していることを確認します。

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

アプリケーションが他のアプリの権限を引き継いでいるかどうかを確認しますか?この権限は、デフォルトでAPI <23で使用できます。ただし、APIが23を超える場合は、実行時に権限を要求する必要があります。

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

    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1);
} 

このコードを使用します:

public class ChatHeadService extends Service {

private WindowManager mWindowManager;
private View mChatHeadView;

WindowManager.LayoutParams params;

public ChatHeadService() {
}

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

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

    Language language = new Language();
    //Inflate the chat head layout we created
    mChatHeadView = LayoutInflater.from(this).inflate(R.layout.dialog_incoming_call, null);


    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);

    } else {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);


        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);
    }

    TextView tvTitle=mChatHeadView.findViewById(R.id.tvTitle);
    tvTitle.setText("Incoming Call");

    //Set the close button.
    Button btnReject = (Button) mChatHeadView.findViewById(R.id.btnReject);
    btnReject.setText(language.getText(R.string.reject));
    btnReject.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //close the service and remove the chat head from the window
            stopSelf();
        }
    });

    //Drag and move chat head using user's touch action.
    final Button btnAccept = (Button) mChatHeadView.findViewById(R.id.btnAccept);
    btnAccept.setText(language.getText(R.string.accept));


    LinearLayout linearLayoutMain=mChatHeadView.findViewById(R.id.linearLayoutMain);



    linearLayoutMain.setOnTouchListener(new View.OnTouchListener() {
        private int lastAction;
        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:

                    //remember the initial position.
                    initialX = params.x;
                    initialY = params.y;

                    //get the touch location
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();

                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_UP:
                    //As we implemented on touch listener with ACTION_MOVE,
                    //we have to check if the previous action was ACTION_DOWN
                    //to identify if the user clicked the view or not.
                    if (lastAction == MotionEvent.ACTION_DOWN) {
                        //Open the chat conversation click.
                        Intent intent = new Intent(ChatHeadService.this, HomeActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);

                        //close the service and remove the chat heads
                        stopSelf();
                    }
                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //Calculate the X and Y coordinates of the view.
                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);

                    //Update the layout with new X & Y coordinate
                    mWindowManager.updateViewLayout(mChatHeadView, params);
                    lastAction = event.getAction();
                    return true;
            }
            return false;
        }
    });
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mChatHeadView != null) mWindowManager.removeView(mChatHeadView);
}

}


xmlコードを共有してgithubまたは他の何かで表示できますか?それは私にとって役に立ちます。
パベル

4

プロジェクトでWindowmangerフラグ「TYPE_SYSTEM_OVERLAY」を「TYPE_APPLICATION_OVERLAY」に変更して、AndroidOと互換性を持たせます

WindowManager.LayoutParams.TYPE_PHONEWindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY


3

TYPE_SYSTEM_OVERLAY代わりにを使用して、最終的にロック画面にウィンドウを表示することができましたTYPE_KEYGUARD_DIALOG。これは期待どおりに機能し、ロック画面にウィンドウを追加します。

これに伴う問題は、ウィンドウが可能なすべてのものの上に追加されることです。つまり、安全なロック画面の場合、ウィンドウはキーパッド/パターンロックの上にも表示されます。安全でないロック画面の場合、ロック画面から開くと通知トレイの上部に表示されます。

私にとって、それは受け入れられません。これがこの問題に直面している他の人の助けになることを願っています。


解決策をありがとうございました。それを却下する方法はありますか?として追加すると、ダイアログを閉じることができませんTYPE_SYSTEM_OVERLAY。AlertDialogのsetOnDismissListenerが呼び出されません。
トムテイラー

3

WindowManager次の手順で、に簡単なビューを追加しました。

  1. 表示するレイアウトファイルを1つ作成します(私の場合はdummy_layout)
  2. マニフェストに動的に権限を追加します。
// 1. Show view
private void showCustomPopupMenu()
{
    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    // LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    // View view = layoutInflater.inflate(R.layout.dummy_layout, null);
    ViewGroup valetModeWindow = (ViewGroup) View.inflate(this, R.layout.dummy_layout, null);
    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }
    WindowManager.LayoutParams params=new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        LAYOUT_FLAG,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

    params.gravity= Gravity.CENTER|Gravity.CENTER;
    params.x=0;
    params.y=0;
    windowManager.addView(valetModeWindow, params);
}

// 2. Get permissions by asking
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1234);
}

これにより、WMにビューを追加できます。

パイでテスト済み。


2

LayoutParams.TYPE_PHONEは非推奨になりました。このようにコードを更新しました。

parameters = if (Build.VERSION.SDK_INT > 25) {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_APPLICATION_OVERLAY,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }else {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_PHONE,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }

LayoutParams.TYPE_APPLICATION_OVERLAYには、APIレベル26以上が必要です。


0

許可を拒否する主な理由は、他のアプリを描画するための許可がないことです。次のコードで実行できる他のアプリを描画するための許可を提供する必要があります

許可のリクエストコード

    public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

これをMainActivityに追加します


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


private void askPermission() {
        Intent intent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
        startActivityForResult(intent,ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}

これも追加

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE){
            if(!Settings.canDrawOverlays(this)){
                askPermission();
            }
        }
    }


0

私はと働いて解決策を見つけるのに苦労ApplicationContextしてTYPE_SYSTEM_ALERT、ソリューションを混乱見つけ、ケースでは、ダイアログがさえダイアログが使用にあなたが持っているシングルトンである任意のアクティビティから開かれるべきで欲しいgetApplicationContext()、とダイアログがでなければなりませんしたい場合TYPE_SYSTEM_ALERT、あなたは、次の手順が必要になります:

最初に正しいテーマのダイアログのインスタンスを取得します。また、次のスニペットで行ったように、バージョンの互換性を管理する必要があります。

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat_Light);

タイトル、メッセージ、ボタンを設定したら、次のようにダイアログを作成する必要があります。

AlertDialog alert = builder.create();

これtypeがクラッシュの理由であるため、ここで主な役割を果たします。互換性を次のように処理しました。

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

AppCompatDialog以下のようなカスタムダイアログを使用している場合:

AppCompatDialog dialog = new AppCompatDialog(getApplicationContext(), R.style.Theme_AppCompat_Light);

AppCompatDialog次のように、インスタンスにタイプを直接定義できます。

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

マニフェスト権限を追加することを忘れないでください:

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

0
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);

} else {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);


    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);
}

0

WindowManager.LayoutParams.TYPE_SYSTEM_ERROR非推奨になっているため、OSバージョン<Oreoに追加されていることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.