49

Tôi có một số người nhận khai báo trong AndroidManifest tôi:android - "thu xuất khẩu không yêu cầu sự cho phép" trên máy thu có nghĩa là để nhận được từ dịch vụ hệ thống

<!-- no warning --> 
<receiver 
    android:name=".receivers.TriggerMonitoringBootReceiver" 
    android:enabled="false"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

<!-- no warning --> 
<receiver 
    android:name=".receivers.ScanResultsReceiver" 
    android:enabled="false"> 
    <intent-filter> 
     <action android:name="android.net.wifi.SCAN_RESULTS" /> 
    </intent-filter> 
</receiver> 

<!-- warning : Exported receiver does not require permission--> 
<receiver 
    android:name=".receivers.BatteryMonitoringReceiver" 
    android:enabled="false"> 
    <intent-filter> 
     <action android:name="@string/intent_action_setup_alarm" /> 
     <action android:name="@string/intent_action_cancel_alarm" /> 
     <action android:name="@string/intent_action_monitor" /> 
    </intent-filter> 
</receiver> 

Người đầu tiên có nghĩa là để nhận được một hành động BOOT_COMPLETED. Thứ hai là để nhận được android.net.wifi.SCAN_RESULTS. Điều thứ ba là để nhận một số hành động mà tôi đã phát (intent_action_monitor) và một số hành động được phát sóng bởi AlarmManager (intent_action_setup_alarm, v.v.).

Hai câu hỏi:

  • Tại sao tôi không nhận được cảnh báo trên tất cả các máy thu?
  • Tôi cần có những quyền gì để đặt cho người nhận muốn nhận dịch vụ hệ thống để sửa cảnh báo (Tôi hiểu nó là gì và tôi không muốn bất kỳ ai sử dụng bộ thu của mình)? exported="false"sẽ làm cho thu khởi động, thu wifi, thu báo động vv?
    Tôi đã nghĩ đến việc sử dụng quyền tùy chỉnh với android:protectionLevel="signatureOrSystem" nhưng các tài liệu khuyên chống lại cả hai số này protection levelcustom permissions. Vậy làm thế nào tôi nên xử lý cảnh báo này?

Liên kết tới tài liệu và/hoặc một số mã sẽ được đánh giá cao.

Trả lời

55

Tại sao tôi không nhận được cảnh báo trên tất cả người nhận?

Vì hai thiết bị đầu tiên được thiết kế rõ ràng để phát sóng bởi Android. Người cuối cùng không được biết, một phần vì bạn không cung cấp các giá trị tài nguyên chuỗi và có thể vì chúng là các chuỗi hành động duy nhất của riêng bạn.

gì cho phép tôi cần phải đặt ra cho người nhận có nghĩa là để nhận được từ dịch vụ hệ thống để khắc phục cảnh báo

Giải pháp chính xác là để xóa các <intent-filter>. Nếu bạn đang phát sóng các Intents này hoặc nếu bạn đang gói Intent trong một số getBroadcast()PendingIntent, bạn không cần chuỗi hành động. Sử dụng các constructor Intent mà sẽ đưa các đối tượng lớp Java như tham số thứ hai, và sử dụng rằng:

new Intent(this, BatteryMonitoringReceiver.class) 

Bạn được chào đón để vẫn đính kèm một chuỗi hành động để Intent đó, nếu bạn muốn, nhưng bạn có thể đổ <intent-filter> (định tuyến sẽ dựa trên thành phần được cung cấp, trong trường hợp này là lớp Java).

Chỉ sử dụng <intent-filter> khi bạn đang mong đợi hệ điều hành hoặc ứng dụng của bên thứ ba tự khởi động Intent mình (thực hiện một số PendingIntent mà bạn đã tạo không được tính).

+0

Oh cảm ơn! chỉ để được rõ ràng hơn - "_the đầu tiên hai được thiết kế rõ ràng để được phát sóng bởi Android_" Tôi nghĩ như vậy nhưng họ vẫn còn xuất khẩu phải không? - Vì vậy, nếu tôi xóa các ý định vẫn còn là một cách ai đó có thể sử dụng các máy thu - sẽ thêm 'export =" false "' làm cho bất kỳ sự khác biệt? (Ngoài ra: Tôi cần các hành động nhưng làm rõ của bạn "Chỉ sử dụng khi bạn đang mong đợi hệ điều hành hoặc các ứng dụng của bên thứ ba bắt đầu Intent mình (thực thi một PendingIntent mà bạn tạo ra không tính)." rất hoan nghênh - +1) –

+1

@Mr_and_Mrs_D: Bạn không nhận được cảnh báo về hai câu hỏi đầu tiên, vì vậy câu trả lời của tôi tập trung vào câu hỏi thứ ba. "Tôi nghĩ vậy nhưng chúng vẫn được xuất khẩu phải không?" -- Vâng. "Vì vậy, nếu tôi xóa các ý định vẫn còn là một cách ai đó có thể sử dụng các máy thu" - kể từ khi bạn không nhận được cảnh báo cho những người, để chúng một mình. – CommonsWare

+0

Tôi tự hỏi làm cho quyền tùy chỉnh là hữu ích. Cũng giống như hành động của Intent. Tôi có thể sử dụng các công cụ dịch ngược để trích xuất tệp manifest.xml và đọc tên Hành động. Sau đó, tên cho phép cũng có thể phải đối mặt với cùng một điều ... – Yeung

20

Nếu bạn muốn xuất máy thu của bạn để quá trình khác, bạn có thể thêm nét phép của riêng bạn trong tập tin android-biểu hiện của bạn để tránh cảnh báo này, như

<permission 
    android:name="com.yourpage.permission.YOUR_PERMISSION" 
    android:protectionLevel="normal" /> 

<uses-permission 
    android:name="com.yourpage.permission.YOUR_PERMISSION" /> 

<receiver <!-- warning : Exported receiver does not require permission--> 
    android:name=".receivers.BatteryMonitoringReceiver" 
    android:permission="com.yourpage.permission.YOUR_PERMISSION" 
    android:enabled="false" > 
    <intent-filter> 
     <action android:name="@string/intent_action_setup_alarm" /> 
     <action android:name="@string/intent_action_cancel_alarm" /> 
     <action android:name="@string/intent_action_monitor" /> 
    </intent-filter> 
</receiver> 

để biết thêm thông tin, bạn có thể tham khảo http://developer.android.com/training/articles/security-tips.html

+0

Đây là giải pháp đúng khi bạn cần khai báo quyền của riêng bạn. Tuy nhiên, như tài liệu chính thức đề xuất: "Tạo quyền mới tương đối không phổ biến đối với hầu hết các ứng dụng, bởi vì quyền được hệ thống xác định bao gồm nhiều tình huống", bạn nên kiểm tra danh sách do hệ thống xác định: https://developer.android.com/reference/ android/Manifest.permission.html – cuddlecheek

3

Nếu, như tôi, bạn đang ở đây vì ứng dụng của bạn được xây dựng với một phiên bản SDK trước ngừng làm việc với các phiên bản gần đây hơn và bạn muốn sửa chữa nó với sự thay đổi tối thiểu, chỉ cần thêm

android: exported = false

vào thẻ người nhận trong tệp kê khai. Các giải pháp của CommonsWare rõ ràng là một trong những đi với trong dài hạn nhưng điều này sửa chữa vấn đề tạm thời nếu bạn đang sử dụng tùy chỉnh ý định và không có nghĩa là để xuất khẩu chúng.

Theo cách của Lubo, bạn cần xuất quyền tùy chỉnh này, điều này sẽ nhắc người dùng trước khi cài đặt. Điều đó có nghĩa là văn bản mô tả cho sự cho phép cần phải được viết tốt, do đó bạn không kết thúc sợ người dùng thay đổi suy nghĩ của mình về cách cài đặt ứng dụng. Ngoài ra, nó sẽ cần phải được dịch sang tất cả các ngôn ngữ mục tiêu của bạn.

18

Cảnh báo "thu xuất khẩu không yêu cầu sự cho phép" phương tiện, Bạn có một intent-filter với một số hành động (có nghĩa là theo mặc định bạn có android:exported="true" bộ và nó có thể bây giờ receive broadcasts từ bất kỳ đài truyền hình bên ngoài của application của bạn) Kể từ khi nó có thể receive broadcasts từ ANY broadcasters bên ngoài ứng dụng của bạn, cảnh báo bạn bằng cách nói "Này, bạn có chắc chắn BẤT K broad đài truyền hình có thể gọi bạn không? Theo ý kiến ​​của tôi, tốt hơn là bạn chỉ cho phép broadcasters gọi bạn là permission mà bạn đã đặt cho này receiver đến android:permission"

Bạn có thể xóa cảnh báo này bằng cách thêm android:exported="false" vào thẻ người nhận

+0

cảm ơn bạn thân, điều này thật tuyệt –