2012-04-27 29 views
20

Android Honeycomb çalıştıran bir DSLR fotoğraf makinesi ve Samsung Galaxy Tab var. DSLR, USB kablosu kullanarak bir tablete bağlandı (bir tablette ana bilgisayar işlevini etkinleştiren USB kiti aracılığıyla). Kullanıcı bu fotoğraf makinesini tablete indirmek veya görüntüden alınan meta bilgileri içeren Toast bildirimini göstermek gibi bir şey yapmak için bu harici kamerayı kullanarak fotoğraf çektiğinde bilgilendirilmek isterim.Honeycomb veya sonraki Android sürümleri için harici USB depolama alanındaki değişiklikleri izleyin

Ben mevcut tüm araçları olsun Bildiğim kadarıyla (gibi FileObserverinotify mekanizması MediaContentProvider vb yatan kullanarak) değişiklikleri izlemek için izin, belirli bir dosya veya dosya sistemi yolu izledi talep ediyorum. Bu, 2.x ve daha önceki Android sürümlerinde bir blok katman protokolü desteğimiz olana kadar yeterince iyi - cihazınızı bağladığınızda, cihazın dosya sisteminin üzerine yerleştirilmiş ve bu bağlantı noktalarını bu araçlar için bir izleme noktası olarak kullanabildiniz. .

Honeycomb'dan bu yana Google, harici USB aygıtlarına erişimin Media Transfer Protocol ile PTP, bunun bir alt kümesi olarak değiştirildi. Artık harici bir USB cihazını bir Android cihazına bağladığımda bunun için herhangi bir bağlantı noktası görmeyeceğim (bunları almak için adb shell ve sonraki mount komutunu kullanıyorum). Ayrıca, MTP uygulaması, görünüşte daha yüksek bir soyutlama düzeyi olarak hareket eden ve yalnızca düz tamsayı değerleri olan depolama kimliklerini kullanır. Bu depolama kimliklerini bir şekilde gerçek yollara/bağlama noktasına/her ne şekilde çevirebileceğimizi umuyordum ama görünüşe göre orada görünmüyor.

zaten benim cihazda çalışan Android MediaScanner düşünmek Ben medyada oradayız değişiklikler cihazdan erişilebilir dosyaları zaman yayınlanacak özel Intent bu konuyu yönetmek olabilir tahmin, bu yüzden zaten var olan ve Intents uygun aramaya başladı bildirilmek üzere, ancak şans yok - sadece aygıt bağlı ve bağlantı kesildiğinde, yalnızca ACTION_MEDIA_MOUNTED ve ACTION_MEDIA_REMOVED bulundu. Bu, MediaScanner cihazını tekrar takana kadar cihazda herhangi bir değişiklik yapamayacağı anlamına gelir (stok Galerisi uygulamasını kullanarak iki kez kontrol ettim - kamerayı çıkarmadan önce yeni oluşturulan resimler görmez ve Android'e takar cihaz tekrar). Dış sdcard için bu tanıtma yolunu almaya çalışırken

, ben Environment.getExternalStorageDirectory() API çağrısı kullanılır ama /mnt/sdcard değil kameranın biridir Galaxy'nin sdcard yolunu taklit verir. Yani benim için de işe yaramıyor.

TimerTask gibi davranarak yalnızca numaralı periyodik Timer etkinliğine sahip olan bu sorunu çözmeyi başardım. Bu görev USB bağlantısını başlatır, cihazı açar, tüm cihaz hafızasını tarar, sadece son çekilen fotoğrafı alır ve sonra cihaz tanımlayıcıyı ve usb bağlantısını kapatır.

Bunu yapmak için en iyi ve etkili yol gibi gözükmüyor, çünkü her seferinde 5 veya 10 saniyede bir, her seferinde bu eylemleri yapmak gerekiyor. Kesinlikle pilleri çabucak boşaltır ve sadece son çekilen fotoğrafı çekmek ve önceki çekilen fotoğrafla karşılaştırmak için gereksiz görüntü I/O üretir (% 99 aynı görüntüde olur), ancak daha iyi bir çalışma çözümü bulamadım. bunu yapmak için. Olay tabanlı bildirimlerle bir gözlemci mekanizmasının olması daha iyi olur.

Bu yüzden sorum, yukarıda tanımlanan Honeycomb veya sonraki Android sürümleri için harici USB depolama alanındaki değişiklikler hakkında bilgilendirilmenin daha verimli bir yolu var mı?

cevap

2

Daha verimli bir şekilde isterseniz, fotoğraf makinesinin bir fotoğraf çektiği için usb üzerinden bir çeşit sinyal göndermesi gerekir. Sanırım bunu yapmıyor.

nedenle sizin discribing şeklini yaparak elle kontrol etmek zorunda kalacak:

depolama birimini -> değişiklikleri kontrol -> Lütfen algılanan değişikliklerle işini yap. Sana "MTP yolu" ama burada bir örnek uygulamasını okumak için kullanılan ne bilmiyorum

:

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

sen sonucunu kurtarabilecek tüm depolama alanı, her zaman taramayın için dosya adlarını okumak Örneğin, her kontrol ettiğinizde yeni olanları bulmak için karşılaştırın. Genellikle dosyanın isimlendirilmesi de bir kamera üzerinde aynı numara ile başlar. Yani boş bir sd kart ile bir oturum başlatırsanız zaten fotoğrafın sahip olacak dosya adını biliyorsunuz. img0001.jpg diyelim. Bu yüzden, başarılı olana kadar o dosyayı almak için bir işlev yazmanız gerekiyor. Bir sonraki bir img0002.jpg istiyorsanız, başarılı olana kadar bu dosyayı kapmak için bir görev/hizmet/işlev yazabilirsiniz.

Pilden tasarruf etmek isterseniz, USB bağlantı noktasını güçlendirmek için ek bir pil/güç kaynağı kullanabilirsiniz.

Bir Async görevi veya timerTask yerine, ScheduledExecutorService'yi deneyebilir ve daha az güç kullanıp kullanmadığını görebilirsiniz.

Size bazı yeni fikirler verdi umuduyla