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 FileObserver
inotify
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ı?