2015-12-15 12 views
8

Próbuję zapobiec ekspansji paska stanu i użyłem przykładów, w których ludzie próbują przesłonić przycisk strony startowej. Wszystkie rozwiązania wskazują na użycie WindowManager.LayoutParams.TYPE_KEYGUARD, czytam here, że jeśli zostanie użyty TYPE_KEYGUARD, minimalny cel musi być mniejszy niż 14. TYPE_KEYGUARD jest przestarzałe, więc będę potrzebował obejść to również. Jest on całkowicie usunięty z zestawu SDK 21.Minimalny cel musi być mniejszy niż 14, gdy używany jest WindowManager.LayoutParams.TYPE_KEYGUARD

PYTANIE: Co to jest obejście problemu, więc mogę zastąpić pasek stanu i zachować docelową wersję 19?

Mam projekt powołania do budowy tak:

android { 
    compileSdkVersion 17 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.mycompany.ediary" 
     minSdkVersion 12 
     targetSdkVersion 12 
    } 

    buildTypes { 
     release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

Próbowałem porady here bezskutecznie. Chciałbym, żeby wartość targetSdkVersion wynosiła 19, ale jeśli zmienię ją na 19, otrzymuję wyjątek IllegalArgumentException. StackTrace:

11-26 13:41:57.963 28667-28667/com.assistek.ediary E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.assistek.ediary, PID: 28667 
java.lang.IllegalArgumentException: Window type can not be changed after the window is added. 
    at android.os.Parcel.readException(Parcel.java:1550) 
    at android.os.Parcel.readException(Parcel.java:1499) 
    at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:903) 
    at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:5301) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1507) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
    at android.view.Choreographer.doFrame(Choreographer.java:550) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

My onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    ... 
} 

My onAttachedToWindow:

@Override 
public void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 

    if (!GlobalVars.testing) { 
     GlobalVars.preventStatusBarExpansion(this); 
    } 
    } 

I kod, który uniemożliwia rozszerzenie paska stanu (dostosowany od this post):

public static void preventStatusBarExpansion(Context context) { 
    WindowManager manager = ((WindowManager) context.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 * context.getResources() 
      .getDisplayMetrics().scaledDensity); 
    localLayoutParams.format = PixelFormat.TRANSPARENT; 

    customViewGroup view = new customViewGroup(context); 

    manager.addView(view, localLayoutParams); 
} 

public static 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; 
    } 
} 
+1

Spróbuj tego posta: https://stackoverflow.com/ pytania/19920052/disable-the-notification-panel-from-being-pull-down – DH28

Odpowiedz

6

Aktualizacja onAttachedToWindow jak pokazano poniżej i spróbuj

@Override 
public void onAttachedToWindow() { 
    if (!GlobalVars.testing) { 
     GlobalVars.preventStatusBarExpansion(this); 
    } 
    super.onAttachedToWindow(); 
} 

i dodać aktualizację OnCreate z

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); 
    ... 
} 

Dla Api powyżej 14 użytku

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 
+0

Dzięki za odpowiedź. Spróbuję! –

+0

Czy problem został rozwiązany? – SachinS

+0

Nadal dostaję wyjątek IllegalArgument. To działało przez chwilę, po czym nagle przestało działać. –

Powiązane problemy