2012-04-27 5 views
20

Android Honeycomb를 실행하는 DSLR 카메라와 삼성 Galaxy Tab이 있습니다. DSLR은 USB 케이블을 통해 태블릿에 연결됩니다 (USB 키트를 통해 태블릿에서 호스트 기능을 사용할 수 있음). 사용자가이 외부 카메라를 사용하여 사진을 찍을 때이 이미지를 태블릿에 다운로드하거나 이미지에서 가져온 메타 정보가 포함 된 Toast 알림을 표시하는 것과 같은 다른 작업을 수행 할 때 알림을 받고 싶습니다.Honeycomb 이상의 Android 버전에 대한 외장 USB 저장 장치 변경을 확인하십시오.

나는 기존의 모든 도구를 얻을 지금까지로 (같은 FileObserverinotify 메커니즘, 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_MOUNTEDACTION_MEDIA_REMOVED입니다. 즉, MediaScanner은 다시 마운트 할 때까지 장치의 모든 변경 사항을 확인할 수 없음을 의미합니다 (재고 갤러리 앱을 사용하여 두 번 확인했습니다. 플러그를 뽑은 다음 Android에 연결하기 전까지 새로 만든 이미지가 카메라에 표시되지 않습니다. 다시 장치). 외부 sdcard에이 마운트 경로를 얻기 위해 노력

, 나는 Environment.getExternalStorageDirectory() API 호출을 사용하지만 /mnt/sdcard 아닌 카메라의 하나 인 갤럭시의 sdcard에 경로 를 에뮬레이트 얻을 수 있습니다. 그래서 그것은 나에게도 효과가 없다.

나는 의 역할을하는 정기적 인 Timer 이벤트를 시작한이 문제를 해결할 수있었습니다. 이 작업은 USB 연결을 초기화하고 장치를 열고 전체 장치 메모리를 검사하고 마지막으로 찍은 사진 만 가져온 다음 장치 설명자와 USB 연결을 닫습니다.

그것은 5 초 또는 10 초마다 말할 수있는 때마다 이러한 모든 작업을 수행해야한다는 것을 고려하면 가장 효율적이고 효율적인 방법으로 보이지 않습니다. 확실히 배터리 소모가 빠르며 불필요한 시스템 I/O가 발생하여 마지막으로 촬영 한 사진 만 촬영하고 이전 촬영 한 사진과 비교합니다 (99 %에서는 동일한 이미지를 얻을 수 있음). 그러나 더 나은 작동 솔루션을 찾지 못했습니다. 이렇게하기. 이벤트 기반 알림을 사용하는 옵저버 메커니즘을 사용하는 것이 좋습니다.

내 질문에 위에서 설명한 것보다 Honeycomb 이상의 Android 버전에 대한 외부 USB 저장소의 변경 사항에 대한 알림을받는 더 효율적인 방법이 있습니까?

답변

2

더 효율적인 방법을 원한다면 카메라가 사진을 촬영 한 usb를 통해 어떤 종류의 신호를 보내야합니다. 나는 그렇게하지 않는 것 같아요.

따라서 당신은 당신이 discribing하는 방법을 수행하여 수동으로 확인해야합니다 :

스토리지를 마운트 -> 변경 확인 -> 감지 된 변화와 함께 일을. 난 당신이 "는 MTP 방식"그러나 여기 예제 응용 프로그램을 읽는 데 사용 무엇을 잘 모릅니다

:

https://github.com/ynakanishi/Honeycomb-MTP-sample

당신의 결과를 저장할 수있는 전체 스토리지 때마다 검사하지하려면 파일 이름을 읽어 예를 들어, 당신이 그것을 점검하고 비교하여 새로운 것을 발견 할 때마다. 일반적으로 파일의 이름은 카메라의 동일한 번호로 시작됩니다. 따라서 빈 sd 카드로 세션을 시작하면 이미 사진에있는 파일 이름을 알 수 있습니다. img0001.jpg라고 말하면됩니다. 따라서 성공할 때까지 해당 파일을 가져 오는 함수를 작성하면됩니다. 다음 img0002.jpg를 원하면 작업/서비스/기능을 작성하여 성공할 때까지 해당 파일을 가져올 수 있습니다.

배터리로 저장하려면 usb 포트에 전원을 공급하기 위해 추가 배터리/전원 소스를 구현할 수 있습니다.

비동기 작업 또는 timerTask 대신 ScheduledExecutorService를 시도하고 사용량이 적은지 확인할 수 있습니다.

희망은 새로운 생각을주었습니다.