2016-02-16 4 views
0

У меня возникла проблема, когда я попытался закрыть панель уведомлений из своего приложения.Android Закрыть/Скрыть панель уведомлений

здесь, где я пытаюсь закрыть его

@Override 
    public void onWindowFocusChanged(boolean hasFocus) 
    { 
     Log.i("FocusChanged", "Focus changed"); 
     if(!hasFocus) 
     { 
      Log.e("Focus debug", "Lost focus !"); 
// Close every kind of system dialog 
      Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
      getApplicationContext().sendBroadcast(closeDialog); 
      Log.i("FocusChanged", "Focus changed - iam supposed to close this dialogs"); 
     } 
     super.onWindowFocusChanged(hasFocus); 
    } 

Но это не работает. Если я не добавлю точку останова к функции.

Каждый раз, когда я открываю системное уведомление, я получил журнал, в котором говорится, что «Фокус изменен», поэтому мое приложение запускает код, но hasFocus не установлен в true, или, как я сказал, только если я запустил отладчик и установил точку останова в функция.

+0

Я не знаю, если это то, что вы ищете, но Я делаю это как http://stackoverflow.com/questions/25284233/prevent-status-bar-for-appearing-android-modified?answertab=active#tab-top – Leze

ответ

2

Мы не смогли предотвратить появление статуса в полноэкранном режиме на устройствах kitkat, поэтому сделали взломать, который по-прежнему соответствует требованию, т.е. блокировка строки состояния от расширения.

Для этого приложение не было сделано в полноэкранном режиме. Мы помещаем оверлей поверх строки состояния и потребляем все входные события. Это предотвратило расширение статуса.

примечание:

  • customViewGroup это пользовательский класс, который расширяет любой макет (кадр, относительный макет и т.д.) и потребляет сенсорное событие.
  • потреблять сенсорное событие переопределить onInterceptTouchEvent метода представления группы и вернуть истинный

Кроме того, необходимо установить андроид разрешения

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

Вам нужен расширенный класс ViewGroup для обработки сенсорного события

public class customViewGroup extends ViewGroup { 

     public customViewGroup(Context context) { 
      super(context); 
     } 

     @Override 
     protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      Log.v("customViewGroup", "**********Intercepted"); 
      return true; 
     } 
    } 

В том случае, если вы хотите отключить панель уведомлений, вам необходимо добавить эту функцию (не забудьте переменная дд поле CustomViewGroup blockingView)

private void disableNotificationBar(){ 
    WindowManager manager = ((WindowManager) getApplicationContext() 
       .getSystemService(Context.WINDOW_SERVICE)); 

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(); 
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 
    localLayoutParams.gravity = Gravity.TOP; 
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 

       // this is to enable the notification to recieve touch events 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 

       // Draws over status bar 
       WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 

     localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; 
     localLayoutParams.height = (int) (50 * getResources() 
       .getDisplayMetrics().scaledDensity); 
     localLayoutParams.format = PixelFormat.TRANSPARENT; 

     blockingView = new CustomViewGroup(this); 

     manager.addView(blockingView, localLayoutParams); 
} 

, а затем в вас OnCreate вам нужно позвонить

protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     .... 
     disableNotificationBar(); 
} 

Вы должны удалить его на OnDestroy(), чтобы иметь возможность закрыть приложение

@Override 
protected void onDestroy() { 

    super.onDestroy(); 
    if (blockingView!=null) { 
     WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)); 
     manager.removeView(blockingView); 
    } 
} 

Вы также должны отрегулировать размер наложения, в соответствии с предыдущим ответом 40 достаточно, но вы не хотите, чтобы пользователь не выполнял действие в своем собственном приложении, если наложение на высоту будет в tercept на вашей деятельности тоже.

Также в андроиде версии> 5.1 вам необходимо дополнительное разрешение от пользователя, добавьте это на OnCreate функции InstEd вызова функции

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

      if (!Settings.canDrawOverlays(this)) { 
       Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName())); 
       startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE); 
      } else { 
       disableNotificationBar(); 
      } 
     } 
     else { 
      disableNotificationBar(); 
     } 
Смежные вопросы