2012-08-14 40 views
8

Có một số phần của khung công tác chưa rõ ràng đối với tôi. Tôi nổi tiếng với dòng chảy của một sự kiện đầu vào (Kernel -> Eventhub -> InputReader -> InputDispatcher -> ...).Xử lý khóa Android (Framework)

Tình hình

(Yêu cầu:. Xử lý phím nhập mà không thay đổi khung Android) Tôi muốn để xử lý các sự kiện quan trọng đến từ một thiết bị (bàn phím/gamepad/controller/...) nhưng có là một số yêu cầu. Đối với một, tôi không muốn thay đổi khuôn khổ Android. Điều này có nghĩa là, tôi không muốn mở rộng WindowManagerPolicy và các chức năng của nó như interceptKeyBeforeDispatching nơi khóa chủ đang được xử lý. Điều này sẽ dẫn đến sự kiện quan trọng được gửi vào lớp ứng dụng mà là tốt. Nhược điểm là, tôi có một yêu cầu phức tạp ở đây. Ví dụ: Khi tôi đang chơi Angry Birds và tôi nhấn nút GoToAlpha trên thiết bị đầu vào được kết nối của mình, ứng dụng Alpha phải bắt đầu. Angry Birds không có đầu mối mà nút GoToAlpha là, sẽ không xử lý/nhận ra nó và sẽ có ví dụ không có ý định phát sóng để bắt đầu ứng dụng Alpha của tôi.

Câu hỏi

Có cách nào để xử lý của tôi (tùy chỉnh) sự kiện quan trọng sau khi nó đã được gửi đi, biết rằng việc áp dụng ở mặt trước không thể xử lý chìa khóa?

của tôi (thất bại) giải pháp

  • Tạo một dịch vụ mà sẽ xử lý các sự kiện quan trọng. Điều này là không thể vì một ứng dụng như Angry Birds sẽ không ràng buộc với dịch vụ của tôi và sự kiện quan trọng sẽ không bị bắt trong dịch vụ của tôi. Nếu tôi sai, vui lòng cung cấp thêm thông tin :).

  • Tạo thư viện bên ngoài nơi tôi cho phép các hoạt động của ứng dụng được kế thừa từ ActivityBase của riêng mình. Tất cả các sự kiện quan trọng và có hành vi mặc định có thể được xử lý ở đây. Nhược điểm, các ứng dụng hiện tại sẽ không hỗ trợ các sự kiện khóa tùy chỉnh của tôi vì chúng không sử dụng thư viện.

  • Mở rộng khuôn khổ sẽ ở trong mắt của tôi giải pháp sạch nhất nhưng điều đó sẽ dẫn đến không đáp ứng yêu cầu của tôi.

Bất kỳ sự giúp đỡ hay thông tin hữu ích sẽ được đánh giá

tắm

Nếu câu hỏi đầu tiên có thể được giải quyết trên một cách này hay cách khác .. Tôi muốn để tùy chỉnh của tôi Intent phía sau nút GoToAlpha. Điều này có nghĩa .. Bởi mặc định ứng dụng Alpha sẽ được bắt đầu nhưng sau khi người dùng đã tùy chỉnh nó, ứng dụng Beta sẽ được bắt đầu từ bây giờ .. Bất kỳ suy nghĩ nào?

Cảm ơn

+0

Sẽ không lạ nếu có thể chụp các sự kiện quan trọng từ các ứng dụng khác? Tôi đoán đây sẽ là một nguy cơ bảo mật – Boy

+0

Đúng. Một khi sự kiện quan trọng rời khỏi khung công tác, nó chỉ đi đến một ứng dụng và được xử lý ở đó. Nếu không, nó sẽ được trả về khung. Điều này có nghĩa là không có giải pháp nào đáp ứng được cả hai yêu cầu của tôi? – DroidBender

+0

Theo ý kiến ​​của tôi, có lẽ sẽ không có cách nào, chỉ vì vấn đề an ninh: xử lý các sự kiện quan trọng trong khi ứng dụng của bạn không tập trung. Có lẽ cách duy nhất sẽ là nếu bạn thực hiện một bàn phím Android (tôi không có hiểu biết về điều đó)? Điều này sẽ có thể xử lý các sự kiện quan trọng (và người dùng cũng chỉ vào nguy cơ bảo mật này khi bạn chọn bàn phím của bên thứ 3) – Boy

Trả lời

3

Cảm ơn bạn đã bình luận Victor.

Sử dụng InputMethodService sẽ không cung cấp cho tôi đủ tự do và chức năng để xử lý sự cố của tôi.

Giải pháp của tôi/Thỏa hiệp

Trong khung Android, có một PhoneWindowManager đó là trách nhiệm xử lý InputEvents. WindowManagerService được bắt đầu bởi SystemServer, là chủ sở hữu của người quản lý này và tạo một phiên bản.

Bằng cách tạo WindowManager tùy chỉnh của riêng mình và để nó kế thừa từ Android PhoneWindowManager, tôi không mất bất kỳ chức năng mặc định nào và điều này cho phép tôi thêm triển khai của riêng mình trong lớp này. Kết quả này là thêm một tệp mới vào khung và chỉ thay đổi một dòng bên trong Khung Android: WindowManagerService sẽ không tạo ra một PhoneWindowManager, nhưng sẽ tạo một CustomPhoneWindowManager (mở rộng PhoneWindowManager).

Nếu có ai thấy giải pháp tốt hơn hoặc có bất kỳ suy nghĩ cụ thể nào về sự thỏa hiệp của tôi, đừng ngần ngại nhận xét. :)

+0

Một ý tưởng khác. Tôi đã nghe về nó ở đâu đó, nhưng tôi không thể nhớ kết quả ở đâu và kết quả là gì. Bạn có thể thử tạo cửa sổ trong suốt sẽ nằm trên đầu tất cả các cửa sổ, vì vậy bạn sẽ nhận được tất cả lần nhấp/bàn phím. Và bây giờ, bạn sẽ cần phải gửi nó đến ứng dụng ngay phía sau máy của bạn. Bằng cách này, bạn có thể thay đổi vấn đề của mình từ "nhận tất cả dữ liệu nhập" để gửi nhấp chuột đến ứng dụng khác. –

+1

Đó là một cách tiếp cận khá nguy hiểm Victor, sẽ không phải đụng độ với một số tiêu chuẩn bảo mật :)? Một vấn đề khác, có 'InputEvents' (tương tự như KEYCODE_HOME) được bắt trong Framework và không được gửi đến lớp ứng dụng. Những sự kiện này thậm chí sẽ không đến trong cửa sổ vô hình.Cảm ơn sự hỗ trợ của bạn! – DroidBender

+0

Oh .. yeah .. Nó là nguy hiểm :) Tuy nhiên, tôi tin rằng giá trị kinh doanh vượt qua mối quan tâm an ninh 80% thời gian. Tôi có cái nhìn rất hạn chế trong toàn bộ InputMethodService (chỉ biết về sự tồn tại của nó). –

0

tôi nghi ngờ rằng nó có thể với API công cộng của (Boy và Martijn chỉ ra mối quan tâm an ninh).

Hầu hết như cược tốt nhất của bạn (nếu bạn không muốn để tùy chỉnh Android) sẽ

a) Hãy thử sử dụng InputMethodService (http://developer.android.com/reference/android/inputmethodservice/InputMethodService .html)

Nó không cung cấp cho loại điều khiển mà bạn muốn, nhưng nó có thể là đủ cho một số nhu cầu.

b) Cố gắng đi qua toàn bộ ngăn xếp (từ Kernel đến Ứng dụng) và tìm một số lỗ hổng để sử dụng.

Điều này chắc chắn sẽ mất rất nhiều thời gian và không đảm bảo mang bất kỳ loại trái cây nào.

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