2015-07-04 1 views
2

Я разрабатываю приложение на Android. Мое приложение по сути является журналом вызовов. Я хочу, чтобы мое приложение отображало три кнопки выше всех других действий, когда устройство получает входящий вызов.FLAG_NOT_TOUCH_MODAL не работает/Android

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

Когда появляется надпись OverlayActivity, все действия внизу перестают принимать события касания, то есть я могу касаться только OverlayActivity. Как заставить их получать события?

Прямо сейчас в моем BroadcastReceiver я начинаю деятельность:

//PhonecallReceiver.java 
public void onReceive(Context context, Intent intent) { 
    Intent i = new Intent(myContext, OverlayActivity.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.putExtra("phone_number", number); 
    context.startActivity(i); 
} 

actuall активность

//OverlayActivity.java: 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

       WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.CENTER | Gravity.TOP; 
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
    LayoutInflater inflater = getLayoutInflater(); 
    mLayout = (LinearLayout) inflater 
      .inflate(R.layout.overlay_layout, null); 
    wm.addView(mLayout, params); 
    } 
+0

Hi Ivan. Нет необходимости редактировать вопрос, чтобы дать решение. На самом деле лучше создать ответ на свой вопрос, подробно рассказывая о том, что вы сделали. Это поможет любому, кто приходит в StackOverflow с той же проблемой. – DJClayworth

ответ

0

@DJClayworh

Спасибо за совет :)

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

public class OverlayService extends Service { 

    private WindowManager windowManager; 
    private View layout; 

    @Override 
    public void onCreate() { 
     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      // very important, this sends toush events to underlying views 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 
     // Layout gravity 
     params.gravity = Gravity.TOP | Gravity.CENTER; 
     params.x = 0; params.y = 100; 

     LayoutInflater li = (LayoutInflater) getApplicationContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // Your overlay layout 
     layout = li.inflate(R.layout.overlay, null; 

     // This displays overlay on the screen 
     windowManager.addView(layout, params); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // Error will occur if this is missing. 
     if (layout != null) 
      windowManager.removeView(layout); 
    } 
} 
+2

Ваше решение частично неверно и вводит в заблуждение. На самом деле это не имеет никакого отношения к показу из службы, но с флагом окна: WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, который вы также можете определить и по активности. Приветствия. – Nom1fan

Смежные вопросы