USB 장치에 대한 액세스를 허용하기 전에 Android에서 권한 요청을 중지하는 방법


19

USB 호스트 모드 인터페이스를 통해 USB 장치를 제어하는 ​​ICS 4.0.3을 실행하는 루트가없는 Android 태블릿에서 실행중인 응용 프로그램이 있습니다. android.hardware.usb.host.xml 파일은 / system / etc / permissions에 있으며 모든 것이 훌륭하게 작동합니다. 외...

재부팅 후 처음으로 앱을 실행 한 다음 USB 장치를 연결하면 "앱 APPNAME에서 USB 장치에 액세스 할 수 있습니까?"라는 팝업 창이 나타납니다. [] 기본적으로이 USB 장치에 사용합니다. 취소 확인 "및 장치 사용을 시작하기 전에 확인을 탭해야합니다.

앱에서 기기를 바로 사용할 수 있도록 사용자 확인을 꺼야합니다. 어떻게해야합니까? 키 누르기 생성기를 사용하여 사용자가 화면의 버튼을 탭하는 것을 시뮬레이트하는 방법에 대한 제안이 있지만 확인 요청이 발생하지 않도록 이러한 접근 방식을 피하고 설정하는 것이 좋습니다.

공급 업체가 사용자 지정 커널 빌드를 수행하도록 할 수는 없지만 펌웨어 서명 키를 가져 와서 내 앱을 시스템 앱으로 서명 할 수 있어야합니다.

하나의 관련 문제 : "이 USB 장치에 기본적으로 사용"확인란을 선택해도 도움이되지 않는 것으로 보입니다. 장치를 분리했다가 다시 연결하면 확인 메시지가 다시 나타납니다. 이 상황에서 / dev / bus / usb / 001 /의 장치 번호는이 특정 문제를 설명하는 플러그를 뽑았다가 다시 꽂을 때마다 (001, 002, 003 등) 변경되는 것을 알았습니다.


앱을 / system / app에 배포하면 어떻게됩니까? 시스템 서명 여부에 관계없이이를 시도 할 수 있습니다. (a) 시도하지 않았기 때문에 (b)이 배포 모델을 사용할 수 있는지 여부를 알 수 없기 때문에 이것을 주석으로 작성합니다.
Rob Pridham

답변:


10

이 질문과 대답은 기본적으로
/programming//a/15151075/588476 의 복제본입니다
. 예제 프로그램 및 자세한 내용은 위의 링크를 참조하십시오.

내가 아는 한, USB 권한 상자 팝업을 얻는 두 가지 방법이 있습니다.

  1. UsbManager.requestPermission (...)을 사용하여 애플리케이션에서 명시 적으로 권한을 요청하십시오.
  2. 액세서리에 인 텐트 필터를 등록하고 장치가 연결되면 시스템에서 권한을 요청하도록합니다.

1의 경우 권한을 기억하기 위해 팝업의 확인란이 효과가 없음을 발견했습니다.

나를 위해 소프트웨어에서 권한과 관련된 모든 코드를 제거하고 인 텐트 필터를 매니페스트에 넣었습니다. USB 장치가 연결되어있을 때 아직 권한이 부여되지 않은 경우 USB 권한 상자가 나타납니다. 사용자가 기억 상자를 확인하지 않고 확인을 클릭하면 다음에 장치를 연결할 때 상자가 다시 나타납니다. 그러나 사용자가 상자를 선택하고 확인을 누르면 상자가 다시 표시되지 않아야합니다 (소프트웨어를 제거한 후 다시 설치하지 않는 한).

장치 관련 어딘가에 / dev / bus / usb / 001 및 002 등으로 나타나는 버그가 있는지 확실하지 않습니다. intent-filter를 사용하고 있는지 기억하십시오. 아무것도하지 마세요.

권한 팝업을 완전히 피할 수있는 방법을 모르겠습니다. 당신이 말한 것처럼 안드로이드 코드를 파지 않고는 할 수있는 방법이 없다고 생각합니다.


1
확실합니까? 장치의 플러그를 뽑았다가 다시 연결할 때 여전히 권한 요청이 표시됩니다. 이 동작은 developer.android.com/guide/topics/connectivity/usb/host.html 의 문서와 일치합니다 . "의도 필터 사용"섹션에 "사용자가 동의하면 응용 프로그램은 장치가 연결 해제 될 때까지 장치에 액세스 할 수있는 권한이 자동으로 부여됩니다"
kbro

Nexus 7, Galaxy S3 및 Galaxy Note에 대해서만 보증 할 수 있습니다. 해당 장치에서는 한 번만 권한을 수락하면됩니다 (Android 장치는 호스트 모드에서 실행 중임). 어떤 Android 기기 버전을 사용하고 있습니까? 맞춤형 / OEM 기기라는 느낌이 들까 요?
웨인

Android 4.0.3의 맛을내는 WonderMedia WM8850- 미드 SOM을 기반으로하는 OEM 7 인치 태블릿입니다.
kbro

인 텐트 필터는 현재 부팅 세션에서만 작동합니다. 예, USB 장치를 전화기에 연결하면 자동으로 권한이 부여됩니다
user924

7

내 의견 외에도 기본 안드로이드 코드를 살펴 보았습니다.

가능한 대답이 있지만 4 가지 주요 경고와 장애물이 있습니다.

  1. 적절한 USB 장치가 없기 때문에 시도하지 않았습니다.
  2. 새로운 허가가 필요합니다
  3. 권한이 필요하면 시스템 앱이어야합니다.
  4. 이 코드는 공개 API에없는 것에 액세스해야합니다.

일반 애프터 마켓 앱을 배포 할 경우이 점을 잊어 버리십시오!

첫 번째 전제 조건은 MANAGE_USB권한 이 있어야한다는 것 입니다. 여기에 설명되어 있습니다 .

그러나 그에 대한 전제 조건은 시스템 키로 서명하고 앱을 / system / app에 설치해야한다는 것입니다.

어쨌든, 괜찮다면 다음 코드가 있습니다.

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

mDevice 이전의 장치입니다.

uid자신의 앱의 UID이며이를 찾을 수 있습니다. 이를 수행하는 방법의 예는 여기 의 첫 번째 대답 입니다.

문제 없다? 번호 ServiceManager이며 android.os.ServiceManager, 따라서 공공 API 아니다. 이 예에서는 IUsbManager서비스를 제공하는 방법입니다 (다른 경로가있을 수 있음). 이제 그 문제 를 해결 하는 것은 제 대답의 범위를 벗어납니다. 옛날에는 리플렉션을 사용할 수 있지만 여전히 할 수 있는지 모르겠습니다.

그 모든 shenanigans 후에는 더 이상 권한을 요청할 필요가없는 것 같습니다. 그렇다면 대화 상자없이 즉시 반환됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.