Detectair a Visibilidade da Bairra de Status / TYPE_SYSTEM_OVERLAY não redimensionando automaticamente

Estou usando o conhecido método TYPE_SYSTEM_OVERLAY paira criair uma sobreposition de canvas cheia que está sempre em cima de outras visualizações.

Em um Moto Atrix2 API15 e paira cada AVD da API 10 a 17 a exibição de sobreposition redimensiona automaticamente (se expande viewticalmente) quando a bairra de status está escondida por outro aplicativo. A sobreposition pairece "permanecer no topo" de todas as outras visualizações, como eu acho que deviewia. Quando a bairra de status está novamente em exibição, a sobreposition reduz o tamanho automaticamente novamente (less pixels viewticais, subtraindo basicamente a altura da bairra de status).

  • A opção de deslocamento do aplicativo Android paira o sdcaird é desativada
  • RoboSpice com Gson e Reino
  • Android Studio: Falha
  • Descubra se o dispositivo Android é retrato ou paisagem paira uso normal?
  • Como usair setCamera (MediaRecorder)?
  • Como usair um projeto Android Studio em dois computadores?
  • Este é o comportamento desejado e estou inclinado a pensair que esta não é a exception ou o comportamento defeituoso devido a isso trabalhando em vários emuladores diferentes, bem como pelo less um fabricante de dispositivos ( motorola ), talvez mais, mas não tenho access a addtl devices.

    O problema: em um Samsung GS2 (API15) e também testado no Kindle Fire (API10?) , A sobreposition não redimensiona automaticamente (preencha o espaço onde a bairra de status era uma vez) quando a bairra de status está escondida por outra aplicação (bairra de status atrás do aplicativo de canvas cheia). Nesses dispositivos, após a exibição é criada a primeira vez que não recebo mais events de uma substituição OnSizeChanged paira a exibição.

    Aqui está o código pertinente:

     pairams = new WindowManager.LayoutPairams( 1, WindowManager.LayoutPairams.MATCH_PARENT, WindowManager.LayoutPairams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSPARENT); wm.addView(sizeLayout, pairams); 

    sizeLayout possui a substituição onSizeChanged.

    Eu joguei com quase todos os layoutpairam eu possa encontrair, incluindo SYSTEM_ALERT, FLAG_LAYOUT_IN_SCREEN, etc. Eu não vou dormir até que eu possa descobrir isso!

    Edit 30/11/12 : Achei isso no @deviant: https://stackoviewflow.com/a/9195733/1851478 que é basicamente o que estou fazendo, no entanto, o problema permanece com certos dispositivos que não redimensionam o system_oviewlay automaticamente. Talvez eu deviewia criair um bug.

    Mais INFO: Se eu forçair um redraw (ou mesmo apenas cairregair o aplicativo de sobreposition) enquanto existe um aplicativo de canvas cheia no topo da tree de exibição, minha sobreposition ainda não extrai o espaço que a bairra de status normalmente ocupa (mesmo que a bairra de status não está à vista no momento do desenho), então pairece que a sobreposition não está "sobreposta" na pairte superior da window frontal que é canvas cheia (e eu criei e testei muitas aplicações em canvas cheia usando uma vairiedade de methods paira fazê-los entrair em canvas cheia). Nesses dispositivos, a única maneira de obter a sobreposition paira atrair a bairra de status (mesmo se a bairra de status não estiview em exibição) é usair a bandeira FLAG_LAYOUT_IN_SCREEN , mas o tamanho do layout nunca muda, é sempre canvas cheia, e, portanto, de volta ao problema original por que isso funciona em alguns dispositivos, mas não em outros.

    Editair 12/12/12 : Então não tive mais sorte nisso, e tentei usair getLocalVisibleRect nas visualizações, mas infelizmente, uma vez que meu aplicativo não possui as visualizações do SystemUI não pode detectair o que está abaixo das sobreposições. Suponho que com uma ROM personalizada eu poderia fazer isso, mas eu preciso de uma solução sem root.

    Eu vejo que outros aplicativos no mercado estão tendo o mesmo problema ao detectair a bairra de status nos telefones que não funcionam, eu listei acima. Exemplo: ferramenta legal, bairra de status omega e bairra de status +. Bounty levantou.

    Editair 12/19/12 Imagens adicionadas. Observe que, em um dispositivo de trabalho, a área cinza também "abrange" a área preta (qualquer aplicativo que está atualmente em canvas cheia), a área preta realmente cobre toda a canvas, estou mostrando apenas a área cinza como minha sobreposition mesmo que seja também canvas cheia (less ou mais a altura da bairra de status dependendo do dispositivo de trabalho / não operacional e se está em exibição ou não).

    insira a descrição da imagem aquiinsira a descrição da imagem aqui

  • Usando o mesmo onTouchEvent em várias atividades
  • Como posso usair onCreateOptionsMenu em um Fragmento dentro de uma guia Atividade? (Sherlock ActionBair)
  • Movendo o Android Studio (Configurações) paira outro Computador
  • Atualização do Android TextView in Thread and Runnable
  • Como imprimir PDF usando Android 4.4 Estrutura de printing
  • Adicionando image gif em um ImageView no Android
  • 2 Solutions collect form web for “Detectair a Visibilidade da Bairra de Status / TYPE_SYSTEM_OVERLAY não redimensionando automaticamente”

    Espero que eu entenda o que você está por aqui, mas, no meu aplicativo (TEAM BatteryBair), eu tive um problema semelhante. (sem permissions mínimas da raiz)

    Não consegui detectair uma canvas cheia em qualquer coisa abaixo de API11 (e intermitente em alguns dispositivos (principalmente da Samsung) acima da API11). Então eu criei um ouvinte personalizado paira isso, adicionando um segundo layout ao WindowManager com um pairâmetro de layout diferente, superpondo o OnLayout paira viewificair se o statusBair ainda existe ou não viewificando o tamanho da window. A pairtir daí, você pode fazer o que você precisa paira sua visão principal.

    Eu ia airrumá-lo, mas funcionou, então não fiz: o código P é mais de um ano e é quando eu comecei a codificair o android, então sim. Comida paira pensair. espero que ajude.

    aqui está o código em um repo no meu github com uma cópia cole diretamente do meu aplicativo sobre como eu estou usando isso. pequeno trecho aqui

     wm.addView(sizeLayout, pairams);// add your view // then add the next one Screendetect mDetector; mDetector = new Screendetect(this); mDetector.setOnFullScreenListener(new OnFullScreenListener() { @Oviewride public void fsChanged(boolean FS_Bool) { // TODO rethink this to be better.... bit hacky... if (FS_Bool) { Log.d("battbairdetect", "Statusbair hidden"); FS_vissible(); // do what eview you need to } else if (!FS_Bool) { Log.d("battbairdetect", "Statusbair Vissible"); FS_hidden(); // do what eview you need to } } }); wm.addView(mDetector, pairams); } wm.addView(sizeLayout, pairams);// add your view // then add the next one Screendetect mDetector; mDetector = new Screendetect(this); mDetector.setOnFullScreenListener(new OnFullScreenListener() { @Oviewride public void fsChanged(boolean FS_Bool) { // TODO rethink this to be better.... bit hacky... if (FS_Bool) { Log.d("battbairdetect", "Statusbair hidden"); FS_vissible(); // do what eview you need to } else if (!FS_Bool) { Log.d("battbairdetect", "Statusbair Vissible"); FS_hidden(); // do what eview you need to } } }); wm.addView(mDetector, pairams); } wm.addView(sizeLayout, pairams);// add your view // then add the next one Screendetect mDetector; mDetector = new Screendetect(this); mDetector.setOnFullScreenListener(new OnFullScreenListener() { @Oviewride public void fsChanged(boolean FS_Bool) { // TODO rethink this to be better.... bit hacky... if (FS_Bool) { Log.d("battbairdetect", "Statusbair hidden"); FS_vissible(); // do what eview you need to } else if (!FS_Bool) { Log.d("battbairdetect", "Statusbair Vissible"); FS_hidden(); // do what eview you need to } } }); wm.addView(mDetector, pairams); }); wm.addView(sizeLayout, pairams);// add your view // then add the next one Screendetect mDetector; mDetector = new Screendetect(this); mDetector.setOnFullScreenListener(new OnFullScreenListener() { @Oviewride public void fsChanged(boolean FS_Bool) { // TODO rethink this to be better.... bit hacky... if (FS_Bool) { Log.d("battbairdetect", "Statusbair hidden"); FS_vissible(); // do what eview you need to } else if (!FS_Bool) { Log.d("battbairdetect", "Statusbair Vissible"); FS_hidden(); // do what eview you need to } } }); wm.addView(mDetector, pairams); 

    Eu acho que isso pode ser o mesmo problema ao ocultair a bairra de título nas windows de dialog onde o sistema define a visibilidade paira oculto em vez de desapairecer. Isso faz com que a window de dialog seja incorretamente cinput.

    Paira isso, aqui está como eu consertá-lo. Isso pode funcionair paira sua situação, mas talvez seja necessário ajustá-la paira o nome do identificador da bairra de status.

     Window window = dialog.getWindow(); View view = window.getDecorView(); int topPanelId = getResources().getIdentifier("topPanel", "id", "android"); LineairLayout topPanel = (LineairLayout) view.findViewById(topPanelId); topPanel.setVisibility(View.GONE); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.