2016-06-21 24 views
1

Ich versuche eine Vollbild-App zu erstellen, die zu bestimmten Zeiten gestartet wird, und wenn sie gestartet wird, sollte sie automatisch Vollbild werden. Ich habe keine Probleme, es mit Vollbild zu starten. Wenn jedoch Popups oder Fenster vorhanden sind und meine Aktivität gestartet wird, wird die Navigationsleiste nie ausgeblendet (mit anderen Worten, der Vollbildstatus wird nicht erreicht). Ich habe ein 5-Sekunden-Video erstellt, um dieses Problem zu demonstrieren.Wie blende ich die Navigationsleiste aus, obwohl Fenster-Popups, Overlays oder Dialoge angezeigt werden?

können Sie den Fehler hier lesen: http://tinypic.com/player.php?v=2qkplwp%3E&s=9#.V3fZ8KLA3Fk

Ich habe versucht, alles mit Fahnen, aber kann nicht scheinen, es zu tun zu bekommen. Ich habe mich im Playstore umgeschaut und es scheint, dass viele Lockscreen-Apps die Navbar trotz vorhandener Popups und anderer Dialoge (SlideLock, Echo Lock Screen) einfach ausblenden können.

Unten ist mein einfacher Aktivitätscode:

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

windowlayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#a9e487"> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Exit" 
    android:id="@+id/button" 
    android:layout_gravity="center" 
    android:layout_marginTop="100dp" /> 
</LinearLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
      WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | 
      WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | 
      WindowManager.LayoutParams.FLAG_FULLSCREEN | 
      WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 
      WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar 
      PixelFormat.TRANSPARENT); 

    final static int flags = 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_STICKY; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.content_main); 

     final View decorView = getWindow().getDecorView(); 
     decorView.setSystemUiVisibility(flags); 

     final ViewGroup viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null); 
     final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     windowManager.addView(viewGroup, params); 

     viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       windowManager.removeView(viewGroup); 
      } 
     }); 

    } 

} 
+0

statt in auf erstellen Sie Ihre Vollbild-Fahnen mit, warum nicht Sie es in auf Lebenslauf setzen. Anstatt in der Aktivität selbst so viele Flags zu setzen, können Sie dieses Theme einfach dem Manifest android hinzufügen: theme = "@ style/Theme.AppCompat.Light.NoActionBar.FullScreen". –

+0

Ich wünschte, es wäre so einfach. Nichts davon funktioniert, ich habe alles versucht. – Kyle

+0

Kannst du mir eine App mit dem gewünschten Verhalten verlinken? Also kann ich genauer hinschauen. –

Antwort

0

Wahrscheinlich habe ich ein ähnliches Verhalten wie bei Ihrem Ziel erreicht, aber meine Antwort muss überprüft werden. Wie auch immer, hier ist es meine Lösung.

Ich habe zwei Komponenten:

  1. ein Verfahren das Statusfeld eine brandneue Aktivität vor

  2. einen Zuhörer zum Einsturz zu allen Aktivitäten zu feuern

Der erster Teil ist ziemlich einfach: Sie nur diese Methode in Ihrer Tätigkeit:

private void collapseStatusBar(){ 
    Object statusBarService = getSystemService("statusbar"); 
    Class<?> statusBarManager = null; 

    try { 
     statusBarManager = Class.forName("android.app.StatusBarManager"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Method collapseStatusBar = null; 

    try { 

     // Prior to API 17, the method to call is 'collapse()' 
     // API 17 onwards, the method to call is `collapsePanels()` 

     if (Build.VERSION.SDK_INT > 16) { 
      collapseStatusBar = statusBarManager.getMethod("collapsePanels"); 
     } else { 
      collapseStatusBar = statusBarManager.getMethod("collapse"); 
     } 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } 

    collapseStatusBar.setAccessible(true); 

    try { 
     collapseStatusBar.invoke(statusBarService); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

} 

Für den zweiten Teil, eine programmierter Absicht an einen Empfänger, um Feuer Ihre Tätigkeit an der Spitze des Stapels

Intent startIntent = new Intent(this, LaunchWakeupReceiver.class); 
PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent); 

und dies ist der Empfänger zu starten:

public class LaunchWakeupReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, Intent intent) { 

     intent = new Intent(context,MainActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
} 

So Zum Beispiel könnte Ihre Haupttätigkeit wie folgt aussehen:

public class MainActivity extends AppCompatActivity { 

    ViewGroup viewGroup; 
    WindowManager windowManager; 

    final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | 
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | 
        WindowManager.LayoutParams.FLAG_FULLSCREEN | 
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar 
      PixelFormat.TRANSPARENT); 

    final static int flags = 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_STICKY; 

    private static final String LAUNCHED = "launched"; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     addCoverView(); 

    } 


    private void addCoverView(){ 

     final View decorView = getWindow().getDecorView(); 
     decorView.setSystemUiVisibility(flags); 

     viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null); 
     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     final SharedPreferences shP = PreferenceManager.getDefaultSharedPreferences(this); 
     if (shP.contains(LAUNCHED)) { 
      collapseStatusBar(); 
      windowManager.addView(viewGroup, params); 
     } 

     viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       windowManager.removeView(viewGroup); 

      } 
     }); 

     Intent startIntent = new Intent(this, LaunchWakeupReceiver.class); 
     PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
     alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent); 

     shP.edit().putBoolean(LAUNCHED,true).apply(); 


    } 


    private void collapseStatusBar(){ 
     Object statusBarService = getSystemService("statusbar"); 
     Class<?> statusBarManager = null; 

     try { 
      statusBarManager = Class.forName("android.app.StatusBarManager"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     Method collapseStatusBar = null; 

     try { 

      // Prior to API 17, the method to call is 'collapse()' 
      // API 17 onwards, the method to call is `collapsePanels()` 

      if (Build.VERSION.SDK_INT > 16) { 
       collapseStatusBar = statusBarManager.getMethod("collapsePanels"); 
      } else { 
       collapseStatusBar = statusBarManager.getMethod("collapse"); 
      } 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 

     collapseStatusBar.setAccessible(true); 

     try { 
      collapseStatusBar.invoke(statusBarService); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Ich bin mir bewusst, dass diese Lösung ziemlich rau ist, aber, in meine Tests, es funktioniert. Lass mich wissen, woran denkst du?

EDIT

Der Empfängerteil ist eigentlich nur zu Testzwecken. So ist das „LockActivity“ sollte wie folgt aussehen:

public class LockActivity extends AppCompatActivity { 

    ViewGroup viewGroup; 
    WindowManager windowManager; 

    final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | 
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | 
        WindowManager.LayoutParams.FLAG_FULLSCREEN | 
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar 
      PixelFormat.TRANSPARENT); 

    final static int flags = 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_STICKY; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     addCoverView(); 

    } 


    private void addCoverView(){ 

     final View decorView = getWindow().getDecorView(); 
     decorView.setSystemUiVisibility(flags); 

     viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null); 
     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     collapseStatusBar(); 
     windowManager.addView(viewGroup, params); 

     viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       windowManager.removeView(viewGroup); 

      } 
     }); 


    } 


    private void collapseStatusBar(){ 
     Object statusBarService = getSystemService("statusbar"); 
     Class<?> statusBarManager = null; 

     try { 
      statusBarManager = Class.forName("android.app.StatusBarManager"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     Method collapseStatusBar = null; 

     try { 

      // Prior to API 17, the method to call is 'collapse()' 
      // API 17 onwards, the method to call is `collapsePanels()` 

      if (Build.VERSION.SDK_INT > 16) { 
       collapseStatusBar = statusBarManager.getMethod("collapsePanels"); 
      } else { 
       collapseStatusBar = statusBarManager.getMethod("collapse"); 
      } 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 

     collapseStatusBar.setAccessible(true); 

     try { 
      collapseStatusBar.invoke(statusBarService); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
0

Verwenden Sie diese innerhalb onCreate method in Ihrer Aktivität.