2017-07-14 18 views
6

Tôi đang cố tạo cửa sổ Lớp phủ Hệ thống, cửa sổ này cũng sẽ xuất hiện trên màn hình khóa. Tôi đã làm như vậy trên phiên bản 6.0 nhưng nó không hoạt động trên phiên bản 7.0 và 8.0. Lúc đầu, tôi đã được chuyển sang cài đặt Lớp phủ cho ứng dụng của mình (như dự kiến ​​từ Android M & trở đi) và tôi đã cho phép ứng dụng đó. Nhưng bây giờ nó tiếp tục bị lỗi khi tôi cố khởi chạy dịch vụ từ ứng dụng. Tôi đã thử tất cả mọi thứ có liên quan đến vấn đề này nhưng không giúp tôi giải quyết nó yet.I'm nhận được lỗi này mỗi khi tôi cố gắng để khởi động các dịch vụ: -

FATAL EXCEPTION: main 
Process: com.example.sumuix.lockdown, PID: 5128 
java.lang.RuntimeException: Unable to create service com.example.sumuix.lockdown.MyService:android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for window type 2010 
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3414) 
at android.app.ActivityThread.-wrap4(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6540) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Caused by: android.view.WindowManager$BadTokenException: Unable to add window [email protected] -- permission denied for window type 2010 
at android.view.ViewRootImpl.setView(ViewRootImpl.java:788) 
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92) 
    at com.example.sumuix.lockdown.MyService.onCreate(MyService.java:64) 
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3404) 
at android.app.ActivityThread.-wrap4(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1683) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6540) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Đây là mã của tôi :-(MyService.java)

@Override 
public void onCreate() { 
    super.onCreate(); 
      HeadView = LayoutInflater.from(this).inflate(R.layout.overlay_head,null); 
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.TOP | Gravity.LEFT; 
    params.x = 0; 
    params.y = 100; 
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    mWindowManager.addView(HeadView, params); //I’m getting error here...(MyService.java:64)from error log 

    ImageView closeButton = (ImageView) HeadView.findViewById(R.id.close_btn); 
    closeButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      stopSelf(); 
     } 
    }); 

    final ImageView chatHeadImage = (ImageView) HeadView.findViewById(R.id.head); 
    chatHeadImage.setOnTouchListener(new View.OnTouchListener() { 
//Code for OnTouch. 
     } 
    }); 
} 

MainActivity tôi, ở đâu tôi kêu gọi các dịch vụ trên: - (MyActivity.java)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    back=(Button) findViewById(R.id.jump); 
final Intent intentService=new Intent(MainActivity.this, MyService.class); 
    if (Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(MainActivity.this)) { 

     //If the draw over permission is not available open the settings screen 
     //to grant the permission. 
     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
       Uri.parse("package:" + getPackageName())); 
     startActivityForResult(intent,1234); 
    }else { 
     back.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startService(intentService); 
       finish(); 
      } 
     }); 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1234) { 

     //Check if the permission is granted or not. 
     if (Build.VERSION.SDK_INT >= 23 && Settings.canDrawOverlays(MainActivity.this)) { 
      back.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        startService(new Intent(MainActivity.this, MyService.class)); 
        finish(); 
       } 
      }); 
     } else { //Permission is not available 
      Toast.makeText(this, 
        "Draw over other app permission not available. Closing the application", 
        Toast.LENGTH_SHORT).show(); 

      finish(); 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Trong manifeast: -

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

MyService Layout XML: -

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/chat_head_root" 
android:layout_width="65dp" 
android:layout_height="wrap_content" 
android:background="@android:color/black" 
android:orientation="vertical"> 

<ImageView 
    android:id="@+id/head" 
    android:layout_width="60dp" 
    android:layout_height="60dp" 
    android:layout_marginTop="8dp" 
    android:background="@android:drawable/ic_menu_info_details" 
    tools:ignore="ContentDescription" /> 

<ImageView 
    android:id="@+id/close_btn" 
    android:layout_width="26dp" 
    android:layout_height="26dp" 
    android:layout_marginLeft="40dp" 
    android:background="@android:drawable/ic_menu_close_clear_cancel" 
    tools:ignore="ContentDescription" /> 
</RelativeLayout> 

tôi đã cố gắng khá nhiều tất cả mọi thứ mà tôi tìm thấy khi tìm kiếm trên internet.I chỉ mới bắt đầu với Android như vậy, nếu tôi đang làm bất kỳ sai lầm ngớ ngẩn nhỏ sau đó xin vui lòng cho tôi biết điều đó. Cảm ơn trước.

Trả lời

7

Đối với android 8.0, bạn PHẢI sử dụng WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY. Lớp phủ lỗi, lớp phủ điện thoại và tương tự không hoạt động nữa.

Xem thêm ở đây: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#o-apps

Không biết lý do tại sao bạn có vấn đề về android 7 Mặc dù vậy, không bao giờ có họ bản thân mình ...

Sidenote

Không sử dụng startService nữa nếu dịch vụ của bạn là dịch vụ nền trước, hãy sử dụng startForegroundService hoặc phiên bản ContextCompat nếu dịch vụ của bạn là dịch vụ nền trước để tránh các vấn đề có thể xảy ra nếu bạn muốn bắt đầu dịch vụ lớp phủ sau khi khởi động hoặc bất kỳ nơi nào khác từ nền ...

Các vấn đề liên quan