2015-09-18 24 views
13

Tôi đang cố tạo lớp phủ hệ thống. Nhưng tôi tiếp tục nhận được "sự cho phép bị từ chối". Tôi đang sử dụng phiên bản SDK 23.Android Cửa sổ lớp phủ hệ thống

file manifest của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.test" > 

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".activity.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

Code tôi sử dụng để tạo ra các lớp phủ:

//mView = new HUDView(this); 
    mButton = new Button(this); 
    mButton.setText("Overlay button"); 
    mButton.setOnTouchListener(this); 

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.RIGHT | Gravity.TOP; 
    params.setTitle("Load Average"); 
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
    wm.addView(mButton, params); 
+0

Có thể trùng lặp của [Không thể thêm cửa sổ [email protected] - quyền bị từ chối cho loại cửa sổ này] (http: // stackoverflow .com/questions/7569937/cannot-to-add-window-android-view-viewrootw44da9bc0-permission-denied-for-t) – ceph3us

Trả lời

23

Thứ nhất, không có sự cho phép đặt tên SYSTEM_OVERLAY_WINDOW. Đó là SYSTEM_ALERT_WINDOW.

Thứ hai, nếu targetSdkVersion của bạn là 23 trở lên và bạn đang chạy trên thiết bị Android 6.0+, ứng dụng của bạn sẽ không nhận được quyền này ngay từ đầu. Hãy gọi số Settings.canDrawOverlays() để xem bạn có được phép hay không và sử dụng ACTION_MANAGE_OVERLAY_PERMISSION để dẫn người dùng đến Cài đặt nếu bạn không cho phép.

+0

Tôi thay đổi quyền cho SYSTEM_ALERT_WINDOW nhưng điều đó không khắc phục được sự cố. Vì vậy, tôi đang cố gắng thực hiện đề xuất thứ hai của bạn. Nhưng làm cách nào để sử dụng ACTION_MANAGE_OVERLAY_PERMISSION để dẫn người dùng đến Cài đặt? – Tom

+1

@VeryEvilBetty: Đó là hành động 'Intent'. 'startActivity (new Intent (Settings.ACTION_MANAGE_OVERLAY_PERMISSION))' sẽ mang đến một hoạt động mà người dùng có thể chọn tham gia cho phép ứng dụng của bạn vẽ trên màn hình. – CommonsWare

+0

Cảm ơn nó đã hoạt động ngay bây giờ. – Tom

16

Trong AndroidManifest (đối với phiên bản < 23)

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


public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; 
//Random value 

    public void testPermission() { 
     if (!Settings.canDrawOverlays(this)) { 
      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
        Uri.parse("package:" + getPackageName())); 
      startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); 
     } 
    } 

Kết quả:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { 
     if (Settings.canDrawOverlays(this)) { 
      // You have permission 
     } 
    } 
} 
+0

trong trang web chính thức, nó nói rằng chúng tôi có thể làm tương tự cho API v23, bạn đã thử mã này trên 23 chưa? http://developer.android.com/reference/android/provider/Settings.html#canDrawOverlays(android.content.Context) – MBH

+0

Có bạn có thể. Chỉ sự cho phép trong tệp kê khai là dành cho phiên bản <23, Nó bỏ qua phiên bản 23 vì Thời gian chạy yêu cầu quyền. Phần còn lại của anwser của tôi là cho cả hai. – Anthone

+0

tôi đã kiểm tra danh sách các quyền thời gian chạy, SYSTEM_ALERT_WINDOW không có trong danh sách. Tôi đoán giải pháp duy nhất để hướng dẫn người dùng về cách cấp quyền! – MBH

0

Bạn cũng có thể dẫn người dùng tới trang bọc các ứng dụng cụ thể. Tài liệu hướng dẫn states:

Nhập: Tùy chọn, URI dữ liệu của Intent có thể chỉ định tên gói ứng dụng để trực tiếp gọi GUI quản lý cụ thể cho tên gói. Ví dụ: "package: com.my.app".

Vì vậy, một cái gì đó như:

intent.setData(Uri.fromParts("package", getPackageName(), null)); 
0

Là một giải pháp thay thế, bạn có thể thử WindowManager.LayoutParams.TYPE_TOAST thay vì WindowManager.LayoutParams.TYPE_SYSTEM_ALERT. Điều này không yêu cầu bất kỳ sự cho phép nào. Tôi đang sử dụng nó để hiển thị hình ảnh, có thể nút sẽ hoạt động để

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