2013-08-23 12 views
12

Zajmuję aplikację dla tle videorecording, to dlaczego użyłem managerem okien, ale nie pracował dla me.gives następujące błędy:

08-23 15:38:21.021: E/AndroidRuntime(4200): java.lang.RuntimeException: Unable to create service com.example.prankapp.BackgroundVideoRecorder: android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for this window type 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2277) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.app.ActivityThread.access$1600(ActivityThread.java:128) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1215) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.os.Looper.loop(Looper.java:137) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.app.ActivityThread.main(ActivityThread.java:4517) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at java.lang.reflect.Method.invokeNative(Native Method) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at java.lang.reflect.Method.invoke(Method.java:511) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at dalvik.system.NativeStart.main(Native Method) 
    08-23 15:38:21.021: E/AndroidRuntime(4200): Caused by: android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for this window type 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:707) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at com.example.prankapp.BackgroundVideoRecorder.onCreate(BackgroundVideoRecorder.java:53) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2267) 
    08-23 15:38:21.021: E/AndroidRuntime(4200):  ... 10 more 

Mój kod managerem okien:

windowManager = (WindowManager) this.getSystemService(BackgroundVideoRecorder.WINDOW_SERVICE); 
      surfaceView = new SurfaceView(this); 
      LayoutParams layoutParams = new WindowManager.LayoutParams(
       1, 1, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT 
      ); 
      //layoutParams.gravity = Gravity.LEFT | Gravity.TOP; 
      windowManager.addView(surfaceView, layoutParams); 
      surfaceView.getHolder().addCallback(this); 

Proszę mi pomóc. Dzięki za to.

Odpowiedz

21
08-23 15:38:21.021: E/AndroidRuntime(4200): Caused by: android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for this window type 

Problem: Pozwolenie brakuje maifest pliku.

Rozwiązanie: Użyj następującego zezwolenia w AndroidManifest.

android.permission.SYSTEM_ALERT_WINDOW 
+3

tak, użyłem go w moim mainifest nadal mam błąd – Vasu

+0

można plz wklej swój manifest? –

+0

jedno działanie, jedna usługa i następujące uprawnienia ** \t \t < use-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> \t \t ** – Vasu

9

jeśli aplikacja apiLevel >= 19, nie używaj

WindowManager.LayoutParams.TYPE_PHONE lub WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

można użyć

LayoutParams.TYPE_TOAST

lub

TYPE_APPLICATION_PANEL

teraz mój kod LayoutParams jest jak

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_TOAST, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 
+1

dla Lollipopa i niższego użyłem WindowManager.LayoutParams.TYPE_PHONE, ale to nie zadziałało dla Androida M, wtedy użyłem WindowManager.LayoutParams.TYPE_TOAST jak sugerowałeś i teraz działa, dziękuję! –

+1

Tak, 'TYPE_TOAST' działa, gdy nie używasz do rysowania na ekranie blokady –

+0

Muszę użyć' android.permission.SYSTEM_ALERT_WINDOW'? – t0m

Powiązane problemy