2011-02-25 35 views
35

Tôi sắp triển khai C2DM cho ứng dụng của mình, nhưng tôi thấy documentation có chút khó hiểu về cách viết tệp kê khai.C2DM: Cách sử dụng quyền C2D_MESSAGE?

Các biểu hiện chứa mã ví dụ này:

<!-- Only this application can receive the messages and registration result --> 
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" /> 

này được giải thích như sau:.

applicationPackage +" .permission.C2D_MESSAGE ngăn chặn các ứng dụng khác từ việc đăng ký và nhận tin nhắn của ứng dụng

Nhưng chính xác điều này hoạt động như thế nào? Theo tôi hiểu, điều này tuyên bố sự cho phép và sau đó nhận được quyền đó cho phép ứng dụng của tôi. Nhưng chính xác thì quyền đó được thực thi ở đâu?

Mã được đăng ký là:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
registrationIntent.putExtra("sender", emailOfSender); 
startService(registrationIntent); 

Làm thế nào có thể các dịch vụ mà nhận được registrationIntent biết sự cho phép để kiểm tra? Theo tôi hiểu (và sửa tôi nếu tôi sai ở đây), khi tuyên bố sự cho phép, tôi có thể đã chọn bất kỳ tên quyền nào trong không gian tên của tôi, ví dụ: com.example.myapp.permission.WHATEVER.

Hoặc là C2D_MESSAGE một số hằng số ma thuật mà tôi phải sử dụng?


Ngoài ra, các tài liệu nói rằng tôi phải thực hiện thu cho com.google.android.c2dm.intent.C2D_MESSAGEcom.google.android.c2dm.intent.REGISTRATION Intents. Nhưng Trong ví dụ mã, bộ lọc của người nhận chỉ chứa .intent.RECEIVE.intent.REGISTRATION Ý định. Nơi đã làm C2D_MESSAGE, và nó có một cái gì đó todo với câu hỏi của tôi ở trên?

Tôi hy vọng đây không phải là điều hiển nhiên, nhưng tôi không hiểu ... hãy giúp đỡ.

Trả lời

23

Những người nhận họ yêu cầu bạn cần ở trên cùng trong tóm tắt có vẻ là một sai lầm trong tài liệu, vì nó không khớp với ví dụ về tệp kê khai.

"Người nhận cho com.google.android.c2dm.intent.C2D_MESSAGE và com.google.android.c2dm.intent.REGISTRATION.")

tôi đã ví dụ họ đưa ra để làm việc sử dụng chỉ cần các mục kê khai ví dụ được tinh chỉnh để khớp với tên gói của ứng dụng cụ thể của tôi.

Khi mã C2DM trong Android gửi phát sóng ra (hoặc, đúng hơn, khi nó trông giống cho thu tiềm năng để gửi broadcast tới), có vẻ cho:

thu Find phát sóng cho Ý định: com .google.android.c2dm.intent.REGISTRATION Đó có sự cho phép: .permission.C2D_MESSAGE

điệp Tất cả C2DM gửi đến ứng dụng của bạn bằng cách mã Android C2DM sẽ tìm kiếm quyền cụ thể đó. Nó dành riêng cho ứng dụng của bạn và chỉ cần có cấu trúc đó (gói ứng dụng của bạn + ".permission.C2D_MESSAGE ")

Về cách yêu cầu đăng ký được tên gói để sử dụng cho các điều khoản, đó là xử lý khi bạn lần đầu tiên đăng ký với. 'ứng dụng' thêm - từ các tài liệu:

" ứng dụng là ID của ứng dụng, thiết lập với một PendingIntent để cho phép các dịch vụ đăng ký để trích xuất thông tin ứng dụng "

dòng trong câu hỏi:.

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
+0

Vậy điều gì sẽ xảy ra nếu tôi không khai báo và yêu cầu quyền C2D_MESSAGE? Sau đó tôi sẽ không thể nhận bất kỳ chương trình phát sóng c2dm nào? Điều này có nghĩa là nhận xét trong khối mã đầu tiên của tôi thực sự nên đọc "đảm bảo chúng tôi có thể nhận các chương trình phát sóng c2dm _at all_" – user634618

+0

Đánh giá từ tài liệu, nếu bạn không khai báo quyền đó, thì phần C2DM sẽ tìm BroadcastReceivers. xử lý ý định (và có sự cho phép) sẽ không tìm thấy bất kỳ BroadcastReceivers để thử, do đó, Broadcast sẽ không đi bất cứ nơi nào. Tôi chưa thử điều đó, nhưng thực sự rất đơn giản để thử. Tôi sẽ làm theo các ví dụ tài liệu đầu tiên để chắc chắn rằng bạn có tất cả mọi thứ làm việc, đầu tiên. – mbafford

+1

Cảm ơn, tôi đã đọc tài liệu cho BroadcastReceiver một lần nữa và giờ đã hiểu nó. Những gì tôi đã không nhận thấy khi đọc nó lần đầu tiên là khi bắn một Intent phát sóng một cách rõ ràng có thể yêu cầu một sự cho phép. – user634618

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