我正在尝试创建一个覆盖窗口,但是当我尝试将视图添加到 WindowManager 时,它给了我一个异常。我添加了“SYSTEM_ALERT_WINDOW”权限,并在应用信息中启用了“绘制其他应用”。我从服务的 onCreate 函数中调用它。
代码:
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
我正在修复一个不是我开发的 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)
我还从设备设置中启用了该应用程序的所有权限。我怎么解决这个问题?
我想在锁屏上显示个性化视图(实时显示一些数据)(之后用户将手机锁定在活动上)。
谷歌地图和百度地图(以及其他一些我忘记名字的应用)已经完全实现了我想要的。
所以我试图在我的 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
我有一个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
我想前面的屏幕亮度,当亮度在显示设置为自动模式.
我尝试使用以下代码:
WindowManager.LayoutParams lp = getWindow().getAttributes();
previousScreenBrightness = lp.screenBrightness;
Run Code Online (Sandbox Code Playgroud)
但的价值previousScreenBrightness是-1.0,即使我把手机在深或浅的地方所有的时间.
当亮度设置不在自动模式下时,我可以获得正确的值.
我使用的是Android 4.2.
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) 在添加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) 我创建了一个小库,用于将视图放置在现有视图的旁边/上方/下方(例如,“帮助”箭头或类似的东西),
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) 我需要将 WindowManager 与 WindowManagerTypes.SystemOverlay 参数一起使用
在我的项目上启用了此权限
但它是 API < 23 的参数
我使用 API 23 (Android 6.0) 开发
我需要在我的 Android 测试手机的设置 => 应用程序 => 应用程序管理器设置中启用参数“绘制其他应用程序”
我在 Xamarin 中找不到:Settings.ActionManageOverlayPermission 和 Settings.CanDrawOverlays 函数,它是否已实现?
此元素是从 Xamarin.Android 版本 5.1.99 添加的(请参阅下面的链接):
但我不能使用元素。
我使用 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
如何创建可以像 Facebook 通知一样在整个屏幕上移动的浮动内容?
android drag-and-drop android-windowmanager system-alert-window