Android Honeycomb를 실행하는 DSLR 카메라와 삼성 Galaxy Tab이 있습니다. DSLR은 USB 케이블을 통해 태블릿에 연결됩니다 (USB 키트를 통해 태블릿에서 호스트 기능을 사용할 수 있음). 사용자가이 외부 카메라를 사용하여 사진을 찍을 때이 이미지를 태블릿에 다운로드하거나 이미지에서 가져온 메타 정보가 포함 된 Toast 알림을 표시하는 것과 같은 다른 작업을 수행 할 때 알림을 받고 싶습니다.Honeycomb 이상의 Android 버전에 대한 외장 USB 저장 장치 변경을 확인하십시오.
나는 기존의 모든 도구를 얻을 지금까지로 (같은 FileObserver
inotify
메커니즘, MediaContentProvider
등 기본 사용) 변화를 볼 수 있도록를, 특정 파일이나 파일 시스템 경로를 감시 할 요구한다. 우리가 2.x 및 이전 버전의 Android 버전에서 블록 계층 프로토콜을 지원할 때까지는 충분했습니다. 장치를 연결하면 장치의 파일 시스템에 마운트되어이 마운트 지점을 해당 도구의 감시 지점으로 사용할 수있었습니다 .
Honeycomb Google이 외부 USB 장치에 액세스하는 방법을 Media Transfer Protocol
으로 변경 했으므로 PTP
을이 하위 집합으로 변경했습니다. 이제 외장 USB 장치를 Android 장치에 연결하면 해당 장치에 대한 마운트 지점이 표시되지 않습니다.이 장치를 가져 오는 데는 adb shell
및 그 이후의 mount
명령을 사용하고 있습니다. 또한 MTP
구현은 더 높은 수준의 추상화 역할을하는 저장 영역 ID를 사용하며 단순한 정수 값입니다. 나는 어떻게 든이 스토리지 id를 실제 경로/mountpoint /로 변환하는 방법이 있기를 바랬는데 어떤 것이 든 분명히 보이지는 않습니다.
이미 내 장치에서 실행되는 안드로이드 MediaScanner
에 대해 생각 나는 미디어에서 거기 변화가 디바이스에서 액세스 할 수있는 파일 때 방송 특별 Intent
와 함께이 문제를 관리 할 수 추측, 그래서 나는 이미 존재하고 Intents
적합 찾기 시작 왜냐하면 장치가 연결되어 있고 연결이 끊어진 경우에만 브로드 캐스트되는 ACTION_MEDIA_MOUNTED
과 ACTION_MEDIA_REMOVED
입니다. 즉, MediaScanner
은 다시 마운트 할 때까지 장치의 모든 변경 사항을 확인할 수 없음을 의미합니다 (재고 갤러리 앱을 사용하여 두 번 확인했습니다. 플러그를 뽑은 다음 Android에 연결하기 전까지 새로 만든 이미지가 카메라에 표시되지 않습니다. 다시 장치). 외부 sdcard에이 마운트 경로를 얻기 위해 노력
, 나는 Environment.getExternalStorageDirectory()
API 호출을 사용하지만 /mnt/sdcard
아닌 카메라의 하나 인 갤럭시의 sdcard에 경로 를 에뮬레이트 얻을 수 있습니다. 그래서 그것은 나에게도 효과가 없다.
나는 의 역할을하는 정기적 인 Timer
이벤트를 시작한이 문제를 해결할 수있었습니다. 이 작업은 USB 연결을 초기화하고 장치를 열고 전체 장치 메모리를 검사하고 마지막으로 찍은 사진 만 가져온 다음 장치 설명자와 USB 연결을 닫습니다.
그것은 5 초 또는 10 초마다 말할 수있는 때마다 이러한 모든 작업을 수행해야한다는 것을 고려하면 가장 효율적이고 효율적인 방법으로 보이지 않습니다. 확실히 배터리 소모가 빠르며 불필요한 시스템 I/O가 발생하여 마지막으로 촬영 한 사진 만 촬영하고 이전 촬영 한 사진과 비교합니다 (99 %에서는 동일한 이미지를 얻을 수 있음). 그러나 더 나은 작동 솔루션을 찾지 못했습니다. 이렇게하기. 이벤트 기반 알림을 사용하는 옵저버 메커니즘을 사용하는 것이 좋습니다.
내 질문에 위에서 설명한 것보다 Honeycomb 이상의 Android 버전에 대한 외부 USB 저장소의 변경 사항에 대한 알림을받는 더 효율적인 방법이 있습니까?