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);
}
}