Java 如何在我';我变黑了

Java 如何在我';我变黑了,java,android,android-studio,Java,Android,Android Studio,我有设置布局。我应该模糊背景,并显示一个块,我建议该人更新应用程序,如果版本不是最后一个。我已经试过很多东西,但都不管用。我不知道是不是有一个街区能做到这一点。块应该包含文本和两个按钮:更新和取消,就像在图片上一样。如果是两种不同的解决方法,请提供两种选择 您可以使用WindowManager在(任何)应用程序上绘制视图。但是,图片中的背景并不模糊,而是变暗了 要使用WindowManager,您需要在AndroidManifest.xml中启用此权限: <manifest xmlns:a

我有设置布局。我应该模糊背景,并显示一个块,我建议该人更新应用程序,如果版本不是最后一个。我已经试过很多东西,但都不管用。我不知道是不是有一个街区能做到这一点。块应该包含文本和两个按钮:更新和取消,就像在图片上一样。如果是两种不同的解决方法,请提供两种选择


您可以使用
WindowManager
在(任何)应用程序上绘制视图。但是,图片中的背景并不模糊,而是变暗了

要使用
WindowManager
,您需要在
AndroidManifest.xml
中启用此权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example">

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

    <application
        ...
现在,在
设置
活动中,您可以使用
窗口管理器
创建视图:

public class Settings extends AppCompatActivity {

    private static int TAG_PERMISSION_OVERLAY = 10;

    private View warning;
    private WindowManager windowManager;
    private WindowManager.LayoutParams params;

    @Override
    protected void onResume() {
        super.onResume();
        createWarningWithPermission();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        createWarningWithPermission();
    }

    private void createWarningWithPermission(){
        // permission only needed for SDK version 23 and later
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             // checks if application has the permission to draw the view over apps
             if(android.provider.Settings.canDrawOverlays(this)){
                createWarning();
             }else{
                // redirects the user to app settings where he/she can enable the permission
                Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+ BuildConfig.APPLICATION_ID));
                startActivityForResult(intent, TAG_PERMISSION_OVERLAY);
             }
        } else {
             createWarning();
        }
    }

    private void createWarning(){
        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_SYSTEM_ALERT;
        }

        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                LAYOUT_FLAG,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_DIM_BEHIND |
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        params.dimAmount = 0.3F; // darkens the background

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        // inflates warning.xml
        warning = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.warning, null);

        // here you can add the logic to your view
        Button btn = warning.findViewById(R.id.btn_close_warning);
        btn.setOnClickListener((o)->{
            runOnUiThread(()->{
                windowManager.removeView(warning);
            });
        });

        int color = android.graphics.Color.rgb(61, 41, 0);
        warning.setBackgroundColor(color);
        windowManager.addView(warning, params);
    }
}

非常感谢,这是一个非常好的答案。很抱歉这么晚才回复。但我有一个问题:我需要使用Min21SDK版本,但这行“android.provider.Settings.canDrawOverlays(this)”需要23个sdk版本。你知道如何更改这行吗?如果我没有错的话,只有SDK版本23及更高版本才需要权限。我现在编辑了
createWarningWithPermission()
方法。试试看。
public class Settings extends AppCompatActivity {

    private static int TAG_PERMISSION_OVERLAY = 10;

    private View warning;
    private WindowManager windowManager;
    private WindowManager.LayoutParams params;

    @Override
    protected void onResume() {
        super.onResume();
        createWarningWithPermission();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        createWarningWithPermission();
    }

    private void createWarningWithPermission(){
        // permission only needed for SDK version 23 and later
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             // checks if application has the permission to draw the view over apps
             if(android.provider.Settings.canDrawOverlays(this)){
                createWarning();
             }else{
                // redirects the user to app settings where he/she can enable the permission
                Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+ BuildConfig.APPLICATION_ID));
                startActivityForResult(intent, TAG_PERMISSION_OVERLAY);
             }
        } else {
             createWarning();
        }
    }

    private void createWarning(){
        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_SYSTEM_ALERT;
        }

        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                LAYOUT_FLAG,
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_DIM_BEHIND |
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        params.dimAmount = 0.3F; // darkens the background

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        // inflates warning.xml
        warning = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.warning, null);

        // here you can add the logic to your view
        Button btn = warning.findViewById(R.id.btn_close_warning);
        btn.setOnClickListener((o)->{
            runOnUiThread(()->{
                windowManager.removeView(warning);
            });
        });

        int color = android.graphics.Color.rgb(61, 41, 0);
        warning.setBackgroundColor(color);
        windowManager.addView(warning, params);
    }
}