Cách dừng Android xin phép trước khi cho phép truy cập vào thiết bị USB


19

Tôi có một ứng dụng đang chạy trên máy tính bảng Android không tên gốc đang chạy ICS 4.0.3 điều khiển thiết bị USB thông qua giao diện chế độ máy chủ USB. Tệp android.hardware.usb.host.xml có trong / system / etc / allow và mọi thứ hoạt động tuyệt vời. Ngoại trừ...

Khi tôi chạy ứng dụng lần đầu tiên sau khi khởi động lại và sau đó cắm thiết bị USB, tôi nhận được cửa sổ bật lên có nội dung "Cho phép ứng dụng APPNAME truy cập thiết bị USB? [] Sử dụng theo mặc định cho thiết bị USB này. Hủy OK" và Tôi phải nhấn OK trước khi nó có thể bắt đầu sử dụng thiết bị.

Tôi cần tắt xác nhận người dùng để ứng dụng có thể sử dụng thiết bị ngay lập tức. Làm thế nào để tôi làm điều này? Tôi dường như có một số gợi ý về việc sử dụng trình tạo phím nhấn để mô phỏng người dùng chạm vào nút trên màn hình nhưng tôi muốn tránh cách tiếp cận đó và thiết lập mọi thứ để yêu cầu xác nhận đơn giản không xảy ra.

Tôi có thể không thể yêu cầu nhà cung cấp thực hiện xây dựng kernel tùy chỉnh cho mình, nhưng tôi sẽ có thể lấy khóa ký phần sụn từ họ để tôi có thể ký ứng dụng của mình dưới dạng ứng dụng hệ thống, nếu điều đó có ích.

Một vấn đề liên quan: đánh dấu vào ô "Sử dụng theo mặc định cho thiết bị USB này" có vẻ không hữu ích - nếu tôi rút và cắm lại thiết bị thì tôi lại nhận được lời nhắc xác nhận. Trong tình huống này, tôi đã nhận thấy rằng số thiết bị trong / dev / bus / usb / 001 / thay đổi mỗi lần tôi rút và cắm lại (001, 002, 003, v.v.) có lẽ giải thích vấn đề cụ thể này.


Điều gì xảy ra nếu bạn triển khai ứng dụng vào / system / app? Bạn có thể thử điều này có và không có ký hệ thống. Tôi viết nhận xét này dưới dạng nhận xét vì (a) Tôi chưa thử và (b) Tôi không biết liệu mô hình triển khai này có sẵn cho bạn hay không.
Rob Pridham

Câu trả lời:


10

Câu hỏi và câu trả lời này về cơ bản là một bản sao của
/programming//a/15151075/588476
Xem liên kết ở trên để biết một chương trình ví dụ và thảo luận sâu hơn.

Theo tôi biết, có hai cách để có cửa sổ bật lên hộp cấp phép USB:

  1. Yêu cầu quyền rõ ràng từ ứng dụng của bạn bằng cách sử dụng USBManager.requestPermission (...)
  2. Đăng ký bộ lọc ý định trên phụ kiện của bạn và để hệ thống xin phép khi thiết bị được gắn

Trong trường hợp 1 tôi đã thấy rằng hộp kiểm trên cửa sổ bật lên để nhớ quyền không có hiệu lực.

Đối với tôi, tôi đã xóa tất cả các mã liên quan đến quyền từ phần mềm của mình và chỉ cần đặt bộ lọc ý định trong tệp kê khai của tôi. Khi thiết bị USB được cắm, nếu thiết bị chưa được cấp quyền thì hộp quyền USB sẽ bật lên. Nếu người dùng nhấp vào OK mà không chọn hộp nhớ, thì hộp sẽ bật lại vào lần tiếp theo khi thiết bị được kết nối. Tuy nhiên, nếu người dùng kiểm tra hộp và nhấn OK thì hộp sẽ không bao giờ hiển thị lại (trừ khi phần mềm được gỡ cài đặt và sau đó cài đặt lại).

Tôi không chắc có lỗi nào ở đâu đó liên quan đến thiết bị của bạn hiển thị dưới dạng / dev / bus / usb / 001 và sau đó là 002 hay không - hãy cho tôi biết nếu bạn đang sử dụng bộ lọc ý định, vì nếu không có thì hộp kiểm ghi nhớ sẽ không làm gì cả.

Tôi không biết bất kỳ cách nào mà bạn có thể tránh được cửa sổ bật lên hoàn toàn. Tôi nghi ngờ không có cách nào để làm điều đó mà không đào sâu vào mã android như bạn đã nói.


1
Bạn có chắc không? Tôi vẫn thấy yêu cầu cấp phép khi rút phích cắm và kết nối lại thiết bị. Hành vi này phù hợp với tài liệu trong developer.android.com/guide/topics/connectivity/usb/host.html . Phần "Sử dụng bộ lọc ý định" cho biết "Nếu người dùng chấp nhận, ứng dụng của bạn sẽ tự động có quyền truy cập thiết bị cho đến khi thiết bị bị ngắt kết nối"
kbro

Tôi chỉ có thể bảo đảm cho Nexus 7, Galaxy S3 và Galaxy Note, trên các thiết bị đó tôi chỉ phải chấp nhận sự cho phép một lần (thiết bị Android đang chạy ở chế độ máy chủ) - miễn là tôi bật hộp kiểm để ghi nhớ quyết định. Bạn đang sử dụng thiết bị / phiên bản nào của Android, tôi có cảm giác đó là thiết bị tùy chỉnh / OEM?
Wayne Uroda

Đó là máy tính bảng OEM 7 inch dựa trên SOM WonderMedia WM8850 mid chạy hương vị Android 4.0.3 của họ.
kbro

Bộ lọc ý định chỉ hoạt động cho phiên khởi động hiện tại. Có, tôi cắm thiết bị usb vào điện thoại của mình và thiết bị sẽ tự động cấp quyền
user924

7

Thêm vào nhận xét của tôi, tôi đã xem xét mã Android cơ bản.

Tôi có một câu trả lời có thể, nhưng với không dưới bốn cảnh báo và trở ngại chính:

  1. Tôi chưa thử, vì tôi không có thiết bị USB phù hợp nào.
  2. Bạn cần một sự cho phép mới
  3. Sự cho phép yêu cầu bạn là một ứng dụng hệ thống
  4. Mã này yêu cầu quyền truy cập vào một cái gì đó không có trong API công khai

Hãy quên điều này đi nếu triển khai các ứng dụng sau thị trường thông thường!

Điều kiện tiên quyết đầu tiên là bạn có sự MANAGE_USBcho phép. Điều đó được mô tả ở đây .

Tuy nhiên, lần lượt các điều kiện tiên quyết cho việc bạn ký bằng khóa hệ thống và bạn cài đặt ứng dụng của mình vào / system / app.

Dù sao, nếu bạn ổn với điều đó, đây là một số mã:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice là thiết bị từ trước.

uidlà UID của ứng dụng của riêng bạn và bạn có thể tra cứu nó. Một ví dụ về cách làm điều đó là câu trả lời đầu tiên ở đây .

Tất cả đều tốt? Số ServiceManagerandroid.os.ServiceManagervà do đó không phải là một API công khai. Điều đó, trong ví dụ này, là cách bạn tiếp cận IUsbManagerdịch vụ (có thể có các tuyến khác). Bây giờ, đi xung quanh đó là vượt quá phạm vi câu trả lời của tôi; ngày xưa bạn có thể sử dụng sự phản chiếu, nhưng tôi không biết nếu bạn vẫn có thể.

Sau tất cả các shenanigans đó, có vẻ như bạn không cần phải xin phép nữa, và nếu bạn làm thế, nó sẽ trở lại ngay lập tức mà không có hộp thoại.

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.