SORU
2 NİSAN 2012, PAZARTESİ


Android ekran kapalıyken çalışmıyor ivme

Bilgisayar bilimleri son tezim için bir uygulama geliştiriyorum ve ivme verilerini toplamak günlüğüne ihtiyacım var. Bütün bir gün için uzun almaya ihtiyacım var, ciddi pil kısıtlamaları (örneğin, edemem ekranı terk) vardır. Ayrıca, bu ciddi bir hack yapmak için oldukça makul, hatta düşük/C C seviyesinde bir kodlama gerekirse bu yüzden pazar hedefli bir uygulama değil.

Ekran (bazı bağlantılar bu sorun ile ilgili: http://code.google.com/p/android/issues/detail?id=3708 , Accelerometer stops delivering samples when the screen is off on Droid/Nexus One even with a WakeLock)patladığında birçok cihazda akselerometre olayları için dinleyicileri olayları üreten durdurmak bilindiği. İyice bazı alternatifler aranır, bazıları benim cihaz için (P990, stok ROM LG) çalışmıyor geçici çözümler vardır.

Olay şöyle gelişir: Bir olay bir hizmette android İvme sensörü için dinleyici kayıt olduğunuzda, ekran kapalı kadar iyi çalışıyor. Zaten bir Hizmeti eventListener kayıt denedim, bir İntentService, WakeLocks elde etmeye çalıştı. Wakelocks ile ilgili olarak, hizmeti hala LOGcat çıktı izlerken çalıştığından emin olabilirim, ama ivme uyku moduna koymak gibi görünüyor. Geçici bazı bağlantılar sunulan ve yeniden kayıt olayı periyodik olarak bir İntentService iş parçacığı kullanarak dinleyici bu kod parçacığını feryat gibi kaydı

synchronized private static PowerManager.WakeLock getLock(Context context) {
    if (lockStatic==null) {
        PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);

        lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,NAME);
        lockStatic.setReferenceCounted(true);
    }

    return(lockStatic);
}

@Override
protected void onHandleIntent(Intent intent) {

     sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
     sensorManager.unregisterListener(this);
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);


    synchronized (this) {
        boolean run = true;
        while (run){
            try {
                wait(1000);
                getLock(AccelerometerService.this).acquire();
                sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
                sensorManager.unregisterListener(this);
                sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
                Log.d("Accelerometer service", "tick!");

            } catch (Exception e) {
                run = false;
                Log.d("Accelerometer service", "interrupted; cause: "   e.getMessage());


            }
        }
    }       
}


@Override
public void onSensorChanged(SensorEvent event) {
    Log.d("accelerometer event received", "xyz: "  event.values[0]   ","   event.values[1]   ","    event.values[2]);
}

gerçekten onSensorChange dinleyici kayıt/kaydını biz her zaman denilen yapar. Sorun olay her zaman aynı değerleri içeren, bana ne olursa olsun, cihazı sallayarak aldı.

Yani benim sorular şunlardır: ( benimle ayı, neredeyse bitirmek üzereyim :P )

  1. bir olay dinleyicisi için kayıt OLMADAN düşük seviye erişim (C/C yaklaşım) ivme donanıma sahip olmak mümkün mü?

  2. başka bir geçici çözüm vardır ya da kesmek?

  3. güncel daha fazla telefonu olan herkes lütfen eğer sorun üretici yazılımı 3.0 ve üzeri devam ederse test edebilir?

[GÜNCELLEME]

Ne yazık ki, bazı cep telefonları ile ilgili bir hata gibi görünüyor. Benim cevabım daha fazla detay.

CEVAP
3 Mayıs 2012, PERŞEMBE


Temelde, benim telefon ile ilgili bir sorun. Diğer kullanıcıların bu da aynı Android versiyonu farklı markaların telefonları ile olur, bildirdin. Diğer kişiler hiç bir sorun olmamasına karşın, bu donanım sürücülerini her şirketin uygulamanın android stok sürümünü ama bir sorun olmadığını gösterir.

Sabit ivme verilerini teslim ve benim için kilidini bir önlem bu veri olamaz ihtiyacım var - Bluetooth ve ivme ile bir Arduino var, bu çözümü hayata geçirdik. Cep telefonum için geçici çözüm (soluk) ekran izin ve pil tüketimini görmezden gelmek olduğuna karar verdim. Daha sonra bu ekran ile çalışan başka bir android telefon kullanarak kapalı pil kullanımı için testler yapacağım.

Hata hakkında daha fazla bilgi

Diğer Android kullanıcılarından daha fazla ve bulunan bazı raporlar araştırdım ve belki de neler olduğunu anladım. Kütüphane libsensors.bu yüzden telefon sensörleri için sürücüleri olan her cep telefonu kendine özgü donanım var çünkü ama her cep telefonu Satıcısı tarafından Google tarafından geliştirilen - tabii ki değil. Google, geliştiriciler uygulamak zorunda olduklarını biliyor, böylece C başlık dosyası sağlar. Bu sürücüler için bazı uygulamalar, geliştiriciler sadece ekran kapandığında ivme kapatın, böylece sensör olay dinleyicisi yeni olaylar almayı engelliyor.

Ben de Eğim KC7'NİN ile bu test.2 ama o da işe yaramadı, ivme sürücüler LG orijinal çünkü.

E-postalar LG insan kaynakları birimi ile değiş tokuş

E-posta LG geliştiriciler için P990 göndermiştim ve sonunda bazı somut yanıtlar var! Bu Android ile bu sorunlar yaşıyorsanız benim gibi bazı insanlar için çok yardımcı olabilir. Aşağıdaki soru yazdım

Merhaba! Bilgisayar bilimi tezim ve ben şu anda geliştiriyorum am ivme donanım veri alınıyor. Şu an itibariyle öğrendim ivme ekran kapalıyken olayları, gönderme benim programlardan biri içinden bir wakelock aldım bile ben benim program hala çalışıyor olduğunu doğrulayın (LOGcat çıkışı üzerinden) ama yok ivme olay çıkıyor. Benim ekran dim zorunda kalıyorum ki ben göze alamaz, pil çok hızlı drenaj) almaya başlamak için ivme olayları tekrar. Ben de yerel C ile erişme çalıştı kod, ivme olayları kayıt ama sonuç bu oldu aynı akselerometre olmama rağmen herhangi bir değer attınız değil benim cihaz döner. Eğer doğrudan erişim alabilir miyim diye merak ettim donanım, yerel kod ile kayıt ettirmeden bir dinleyici. Bu mümkün mü? Eğer öyleyse, lütfen biraz daha verebilir misin tavsiye? Çok herhangi bir yardım takdir ediyorum! Martin

Bu yanıt aldım ne için:

Sevgili Martin, Dev cevabını aldık. Takım. Sana bunu söylediler telefon ekran kapalı iken. akselerometre olay alamıyorum Çünkü HAL katmanı H/W olayı böyle olsun sysFS yolu olarak uygulamak olmadı ivme ve etkinlik için kamu API. Teşekkür ederim. En iyi Saygılar. (Sean Kim)

Ben daha sonra e-posta geri, diğer şeyler arasında, bir uyandırma kilidi satın alırken tüm donanım erişimi olması gerektiğinden bu bir hata olduğunu düşündüm, o gönderdi:

[...] Ayrıca bazı arkadaşlarım olduğu için bu soruyu sordum Diğer aynı gingerbread sürümü ile Android telefonları ama cep telefonu markaları ve bazıları olayları aldıkları bildirildi bu ekran kapatıldığında ivme. Biraz okudum ben kazanmak ne zaman bu hata - bir hata olarak görüyorum bu forum ne zamandan beri Bazı işleme devam etmek beklerdim Wakelock bağlı bu satıcıların cep telefonlarını uygulanması sürücüleri sensörü. . bu sürücüler herhangi bir olasılık ya da bu hata bir noktada düzeltilebilir? Bu benim ile son derece yardımcı olacaktır sürekli iş [...]

Ve sonra bu cevabı aldım:

Dev benim bilgi. Takım, Bu hata değil. Bu sınırsızdır H/W mimarisi nedeniyle bu telefonu. HAL yeniden dizayn etmeliyiz mimarlık ve aygıt sürücüsü isteğinizi desteklemek için. Ama, senin gibi kaynak yetersizliği nedeniyle çok zor olduğunu biliyorum. İçin çalışıyoruz tüm çabaları ama biz ben olarak isteğinizi destek yardım bahsetti. (Sean Kim)

Yani görünüşe göre, onlar bunu biliyor ama değil düzeltmeye çalışıyorum, bu nedenle onlar da yok, bence büyük bir hata - ki ben hala inanıyorum bir mantıksal kusur - veya zaman yok/kaynakları doğru.

Alt satırda Eğer ekran ile ivme olayları göndermek bir cep telefonu varsa, üretici yazılımı güncellemeyi deneyin. Bu çözmüyor ve gerçekten ciddi bir hack yapmak istiyorsanız, yeniden donanım katmanı uygulamak ipucu: muhtemelen bir şey libsensors ile alakalı.bu yüzden.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • International Secret Agents Concerts

    Internationa

    2 Aralık 2008
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006