我正在使用Instrumentation在各种Android设备上运行我的单元测试.测试用例在仿真器和除三星Galaxy S之外的所有设备上都能正常工作.在三星Galaxy S上,使用检测注入大约30个关键事件后,它会显示一个Window Manager崩溃,这是完整的崩溃日志:
D/dalvikvm(11862): GC_EXPLICIT freed 6800 objects / 374040 bytes in 54ms
D/dalvikvm(11862): GC_EXPLICIT freed 780 objects / 71856 bytes in 39ms
W/dalvikvm(11862): threadid=9: thread exiting with uncaught exception (group=0x4001d7d0)
E/WindowManager( 2472): Window Manager Crash
E/WindowManager( 2472): java.lang.NullPointerException
E/WindowManager( 2472): at com.android.server.WindowManagerService$KeyWaiter.waitForNextEventTarget(WindowManagerService.java:5844)
E/WindowManager( 2472): at com.android.server.WindowManagerService.injectKeyEvent(WindowManagerService.java:5565)
E/WindowManager( 2472): at android.view.IWindowManager$Stub.onTransact(IWindowManager.java:110)
E/WindowManager( 2472): at com.android.server.WindowManagerService.onTransact(WindowManagerService.java:692)
E/WindowManager( 2472): at android.os.Binder.execTransact(Binder.java:288)
E/WindowManager( 2472): at dalvik.system.NativeStart.run(Native Method)
E/AndroidRuntime(11862): FATAL EXCEPTION: Instr: com.myapp.test.ImpInstrumentation
E/AndroidRuntime(11862): java.lang.NullPointerException …Run Code Online (Sandbox Code Playgroud) instrumentation android android-windowmanager samsung-mobile
我希望能够在设备密码锁定时启动不属于我的应用程序的活动.如果可能的话,我怎么能这样做呢?
注:我很清楚推杆getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);内onCreate我的活动.但是,这不起作用,因为我没有开始自己的活动,而是在我的应用程序之外的第三方活动.
这是相关的代码:
WindowManager.LayoutParams windowParams = getWindow().getAttributes();
windowParams.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
windowParams.screenBrightness = 0.0f;
getWindow().setAttributes(windowParams);
Run Code Online (Sandbox Code Playgroud)
我也尝试将screenBrightness设置为0(整数而不是浮点数),以及我在Stack Overflow答案中找到的以下行:
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)
没有骰子.屏幕变暗,但不会关闭.以上代码适用于以前的Android版本.我只是在模拟器中测试它以确保.是否实施了一种控制屏幕的新方法?
我想在整个屏幕上叠加透明视图,包括Android 4.4中最底部的导航栏.
我可以在Android 4.3中通过将窗口管理器LayoutParams定义为TYPE_SYSTEM_OVERLAY来实现,但是当我使用相同的定义时,布局现在被推到导航栏后面.如果由于KitKat最近的更新,请你告诉我吗?或者如果有人有解决方案,请与我分享.
问候
android view relativelayout layoutparams android-windowmanager
我正在构建一个安全应用程序,我需要知道用户是否提供了错误的密码.假设用户手机被模式锁定系统锁定,不幸的是用户忘记了模式密码.当用户5次错误模式时,将被罚30秒.我需要抓住那个点球赛事.在我的应用程序中,我甚至需要做一些任务(为了用户的安全).请帮我,
android android-service android-windowmanager screen-lock android-broadcast
试图用身临其境的方式,使用时碰到的问题android:fitsSystemWindows="true"用DrawerLayout.我必须将此设置为true,以便将DrawerLayout工具栏约束到系统栏.
问题是,我有一个Fragment将应用程序设置为沉浸式模式.这使得应用程序执行此操作:

我所知道的是一个已知的问题android:fitsSystemWindows="true".我将其设置为false,沉浸式模式运行良好,但工具栏和布局的其余部分不再受制于系统栏.我尝试在运行时设置值,布局的下半部分(也就是导航栏区域)由我的布局填充,但系统栏区域仍然显示:

这是我的代码:
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
ClockFragment.java - 隐藏和显示
private void hideSystemUI() {
if (Build.VERSION.SDK_INT >= 14) {
getActivity().findViewById(R.id.drawer_layout).setFitsSystemWindows(false);
}
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 19) {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
} else if (Build.VERSION.SDK_INT >= …Run Code Online (Sandbox Code Playgroud) android android-windowmanager navigation-drawer android-immersive
我一直在查看几个stackoverflow问题,以了解如何使用Windows管理器监听服务上的backpress按钮.大多数答案提出这是不可能的,但我可以看到信使处理得很好.
messenger如何处理它的聊天服务上的背压按钮?(或者我完全错了,他们不是使用Windows管理器的服务?)
试图了解我的Activity中窗口泄漏的原因.该活动扩展了AppCompatActivity.它具有单个视图,其中RecyclerView和ProgressBar在旋转时不可见.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
chosenSorting = savedInstanceState.getString("sorting");
}
mRecyclerView = (RecyclerView) findViewById(R.id.rv_pop_view);
mLoadingIndicator = (ProgressBar) findViewById(R.id.pb_loading_indicator);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
moviesRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setHasFixedSize(true);
if (chosenSorting.equals("")) {
load("A");
} else {
load("B");
}
}
Run Code Online (Sandbox Code Playgroud)
屏幕旋转一切正常,没有UI问题.但是当OptionsMenu打开时发生旋转时,会出现泄漏窗口:
E/WindowManager: android.view.WindowLeaked: Activity com.example.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{2aeb62a V.E...... ......ID 0,0-686,336} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:418)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:1378)
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1234)
at android.support.v7.widget.AppCompatPopupWindow.showAsDropDown(AppCompatPopupWindow.java:105) …Run Code Online (Sandbox Code Playgroud) android memory-leaks screen-rotation options-menu android-windowmanager
我有一个像Facebook聊天buble的浮动视图,但与它不同,我的叠加层有一个EditText,需要具有焦点.
这是我的浮动视图代码
//Inflate the floating view layout we created
mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_widget_layout, null);
//Add the view to the window.
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
//Specify the view position
params.gravity = Gravity.TOP | Gravity.START; //Initially view will be added to top-left corner
params.x = 0;
params.y = 100;
//Add the view to the window
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mFloatingView, params);
Run Code Online (Sandbox Code Playgroud)
它几乎是好的,但有一个问题.当我从服务创建叠加时,系统后退按钮不起作用.如果我使用FLAG_NOT_FOCUSABLE系统按钮; 家庭,最近和后面的工作如预期.我在SO做了一些研究,发现这是一个安全问题,所以我开始寻找替代解决方案,然后发现这改变了我的代码
// Wrapper for intercepting System/Hardware key events …Run Code Online (Sandbox Code Playgroud) 我想操纵状态栏(ex.color)但在后台.我正在使用前台服务来执行此操作.因此,没有窗口,因为它在后台发生,特别是没有活动.但是,功能
public abstract void setStatusBarColor (int color)
Run Code Online (Sandbox Code Playgroud)
由抽象类Window调用:https://developer.android.com/reference/android/view/Window.html
所以因为它是抽象的我无法启动它而且我不能使用getWindow()因为我没有实现一个活动类.以下答案使用Activity.还有其他方法可以实现吗? 如何更改android中的状态栏颜色
android statusbar android-windowmanager android-statusbar android-window
android ×9
back-button ×1
layoutparams ×1
lockscreen ×1
memory-leaks ×1
options-menu ×1
overlay ×1
screen-lock ×1
service ×1
statusbar ×1
view ×1