SYSTEM_ALERT_WINDOW - Cách tự động nhận quyền này trên Android 6.0 và targetSdkVersion 23


82

Facebook, Evernote, Pocket - tất cả các ứng dụng đều tự động nhận được quyền này trên Android 6.0, ngay cả khi chúng đang nhắm mục tiêu 23 ( targetSdkVersion=23).

Đã có rất nhiều tài liệu liên quan đến mô hình quyền Marshmallow mới. Một trong số chúng SYSTEM_ALERT_WINDOWđược 'thăng cấp' lên cấp quyền 'trên mức nguy hiểm', do đó yêu cầu người dùng can thiệp đặc biệt để ứng dụng được cấp những quyền đó. Nếu ứng dụng có targetSdkVersion22 hoặc thấp hơn, ứng dụng sẽ tự động nhận quyền này (nếu được yêu cầu trong tệp kê khai).

Tuy nhiên, tôi đã nhận thấy một số ứng dụng có quyền này mà không cần đưa người dùng đến trang đặc biệt của Draw over other appsquyền. Tôi đã thấy Facebook, Evernote, Pocket - và có lẽ còn nhiều nữa.

Có ai biết cách ứng dụng có thể được cấp quyền này mà không cần người dùng thông qua Settings -> Apps -> Draw over other appskhông?

Cảm ơn



stackoverflow.com/questions/33139754/… bài đăng này đã giúp tôi hiển thị hộp thoại cho phép ghi ra bên ngoài
Bharath

Câu trả lời:


115

Đây là một hành vi mới được giới thiệu trong Marshmallow 6.0.1 .

Mọi ứng dụng yêu cầu SYSTEM_ALERT_WINDOWquyền và được cài đặt thông qua Cửa hàng Play ( bắt buộc phải có phiên bản 6.0.5 trở lên), sẽ tự động cấp quyền.

Thay vào đó, nếu ứng dụng được truyền, quyền sẽ không được cấp tự động. Bạn có thể thử tải xuống và cài đặt Evernote APK từ apkmirror.com . Như bạn có thể thấy, bạn cần phải cấp quyền theo cách thủ công Settings -> Apps -> Draw over other apps.

Đây là những cam kết [1] [2] cho phép Cửa hàng Play tự động cấp SYSTEM_ALERT_WINDOWquyền.


6
Mặc dù tôi tự hỏi tại sao một sự cho phép 'trên mức nguy hiểm' lại đột nhiên trở thành 'dưới mức bình thường'. Ý tôi là, bạn thậm chí không thể thấy quyền này trong cửa sổ bật lên và các ứng dụng có thể tự động nhận quyền đó. Có suy nghĩ gì không?
oriharel

above dangerousTrên thực tế, quyền vẫn còn nếu bạn tải ứng dụng mà quyền đó không được cấp. Chỉ có Cửa hàng Play có hành vi khác và tự động cấp quyền, có thể họ nghĩ rằng các ứng dụng trên Cửa hàng Play không độc hại và chúng có thể đáng tin cậy. Hoặc có thể họ nhận được rất nhiều lời phàn nàn về sự thay đổi này và họ quyết định tìm cách giải quyết.
Mattia Maestrini,

2
@oriharel Tôi tự hỏi liệu quy mô khổng lồ của Facebook Messenger có thúc đẩy Google theo hướng này để hỗ trợ điều này hay không. Có thể Facebook đã thực hiện một thỏa thuận với Google để không buộc người dùng cấp quyền để các chathead có thể tiếp tục hoạt động.
rút khỏi

3
Khi tôi hỏi về hành vi tự động cấp quyền này (tôi nghĩ lý do là một cái gì đó khác: targetSdk), câu trả lời của Google là "Đây là một hành vi nhằm cho phép các ứng dụng phổ biến tiếp tục hoạt động cho đến khi chúng tôi có một API thay thế trong nền tảng để các ứng dụng này di chuyển. " . Đây là các bài đăng: code.google.com/p/android/issues/detail?id=227123 code.google.com/p/android/issues/detail?id=222195
nhà phát triển android

1
@MattiaMaestrini, bạn có thể xem câu hỏi tương tự này không? stackoverflow.com/questions/54378632/…
ram

74

Yeh Sau khi Marshmallow đến với Android làm cho mức độ bảo mật chặt chẽ hơn, Nhưng Đối với

SYSTEM_ALERT_WINDOW

bạn có thể hiển thị hành động nổi và bất cứ thứ gì Bạn có thể Buộc người dùng cấp quyền cho nó bằng cách theo dõi các mã trong onCreate()phương thức của bạn Đặt mã này sau setContentView

    // Check if Android M or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // Show alert dialog to the user saying a separate permission is needed
        // Launch the settings activity if the user prefers
        Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        startActivity(myIntent);
    }

Hành động ACTION_MANAGE_OVERLAY_PERMISSIONtrực tiếp khởi chạy màn hình quyền 'Vẽ qua các ứng dụng khác'.


Chỉnh sửa: Mã trên của tôi hoạt động đúng 100%

Nhưng tôi chỉ thấy rằng nhiều người vẫn đang tìm kiếm rằng làm thế nào có thể cho phép ACTION_MANAGE_OVERLAY_PERMISSION vĩnh viễn như Nếu người dùng đã cho phép Quyền một lần thì đừng hỏi nó mỗi khi anh ta mở ứng dụng, hãy nghe giải pháp cho bạn-

  1. Kiểm tra xem thiết bị có API 23+ hay không

  2. nếu 23+ API thì hãy kiểm tra xem người dùng có giấy phép hay không

  3. nếu có giấy phép một lần đừng lái xe anh ta đến Settings.ACTION_MANAGE_OVERLAY_PERMISSIONvà nếu chưa được phép thì hãy yêu cầu kiểm tra quyền thời gian chạy

Đặt dòng dưới đây trong onCreate()phương pháp của bạn . Đặt cái này sausetContentView

checkPermission();

Bây giờ hãy đặt mã bên dưới vào onActivityResult

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // You don't have permission
            checkPermission();
        } else {
            // Do as per your logic 
        }

    }

}

Bây giờ cuối cùng là mã phương thức checkPermission

public void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        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);
        }
    }
}

Và đừng quên khai báo biến công khai này trong lớp của bạn

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

1
@JaymanJani Hi này đang làm việc cho tôi nhưng tôi muốn nút bật tắt sự kiện
PriyankaChauhan

onPermission được cấp tôi nên làm gì? tôi muốn mở ứng dụng
Santanu Sur

Giải pháp tốt. Nhưng không cần kiểm tra lại quyền canDrawOverlays trong phương thức onActivityResult vì chúng tôi đã kiểm tra điều đó trong phương thức checkPermission ().
VahidShir

Nó hoạt động rất tốt nhưng bây giờ tôi không thể nhấn vào các mục menu trên thanh công cụ. Có khả năng làm việc đó không?
Pablo R.

hey nếu vấn đề ai mặt xin vui lòng cho tôi biết cảm ơn
Jayman Jani

13

Bây giờ ( 2019 ) Google cung cấp một API thay thế SYSTEM_ALERT_WINDOWdưới dạng Bong bóng trong Android Q, Google cuối cùng đã quyết định ngừng sử dụng SYSTEM_ALERT_WINDOWtrong một bản phát hành Android trong tương lai.

Và các thiết bị Android Go sẽ không cấp quyền này nữa, tức làSettings.canDrawOverlays() == false


Làm thế nào bạn biết điều này? Tài liệu cho biết nó vẫn đang được xem trước. developer.android.com/guide/topics/ui/bubbles
Noa Drach

Đúng @NoaDrach, đó là lý do tại sao tôi đã nói trong tương lai, Google cuối cùng sẽ ngừng sử dụng SAW - tức là khi API Bubble ổn định. youtu.be/td3Kd7fOROw?t=136
Nhà phát triển Dickson

cảm ơn, tôi đã hỏi b / c ứng dụng của tôi (chưa nhắm mục tiêu Q), được sử dụng để nhận quyền này tự động khi được cài đặt từ cửa hàng chơi và bây giờ chúng tôi không tự động nhận được quyền đó. Tôi đoán đó là b / c của điều này - reddit.com/r/androiddev/comments/a69q0i/…
Noa Drach

@Dicksonthedeveloper Xin vui lòng cho tôi làm thế nào để xác định các tính năng mà thiết bị không có của SYSTEM_ALERT_WINDOW hoặc lớp phủ màn hình cho phép tôi cần giải pháp này stackoverflow.com/questions/63938787/...
Shaikh Mohib

Android 11 chứa API này
NothingtoSay

9

Đối với những người muốn tự động nhận quyền này khi ứng dụng được tải xuống từ Cửa hàng Play, ngoài SYSTEM_ALERT_WINDOW trong Tệp kê khai, bạn nên truy cập liên kết này và yêu cầu điều này từ Google.

Bạn phải cung cấp một số thông tin bổ sung tại sao bạn cần quyền này và Google sẽ xem xét và tự động cấp quyền cho bạn.

Hãy nhớ rằng trước khi yêu cầu điều này, bạn phải:

  • Có quyền SYSTEM_ALERT_WINDOW trong Tệp kê khai

  • Nhắc người dùng cấp quyền SYSTEM_ALERT_WINDOW trong ứng dụng của bạn khi chưa được cấp

Nếu tôi bỏ lỡ điều gì đó, vui lòng cập nhật câu trả lời


Đây phải là câu trả lời chính xác ngay bây giờ. Cảm ơn bạn. Vui lòng thêm câu trả lời của bạn về cách chúng tôi có thể yêu cầu người dùng cấp quyền này theo chương trình.
Eren Tüfekçi

2

Nếu ứng dụng nhắm mục tiêu API 22 trở xuống, thì Cửa hàng Play sẽ cấp quyền SYSTEM_ALERT_WINDOW và các quyền khác khi người dùng nhấp để cài đặt (hiển thị cảnh báo) ngay cả khi thiết bị của họ là Android 6.0. Ngược lại, nếu ứng dụng nhắm mục tiêu API 23 trở lên, vì vậy quyền sẽ được yêu cầu cấp trong thời gian chạy.


theo chính sách cửa hàng Play được cập nhật (kể từ tháng 8 năm 2018), bạn không nên nhắm mục tiêu SDK nhỏ hơn 26, hãy xem liên kết tham khảo này 1) developer.android.com/distribute/best-practices/develop/… 2) medium.com/codespace69/…
Jayman Jani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.