Il mio dispositivo è Nexus 4 con Jelly Bean 4.2. Sto provando a registrare lo schermo e inviarlo. La maggior parte dei codici su internet fa il cap di read/dev/graphics/fb0. Funziona bene su alcuni dispositivi e sui vecchi sistemi. Ma quando lo provo sul mio dispositivo, fallisce. Mi dà solo la schermata nera e tutto lo "0" nei dati grezzi. Ho eseguito "adb root" per ottenere il permesso di root, provato "chmod 777 fb0", "cat fb0>/sdcard/fb0". Inoltre ho provato codici come "mmap" e "memcpy" per ottenere i dati. Ma tutti falliscono. Ho cercato su internet e non sembra esserci soluzione. E alcuni thread hanno detto che il kernel potrebbe proibirti di leggere l'fb0. Qualcuno ha idea al riguardo?Android leggi fb0 sempre mi dia schermo nero
risposta
Con l'avanzare dell'hardware, è sempre meno probabile trovare un framebuffer effettivo con il contenuto dello schermo.
Come indicato nei commenti, adb utilizza il comando "screencap", che contatta il surfaceflinger tramite una chiamata Binder, ricadendo su /dev/graphcs/fb0
in caso di esito negativo. Quest'ultimo percorso è usato raramente ora.
Se si vuole veramente indagare su come funziona, è necessario esaminare come il surfaceflinger compie la composizione, in particolare l'HAL di hwcomposer. Il compositore hardware prende più superfici gralloc e le compone durante la scansione. Come funziona differisce da dispositivo a dispositivo; l'implementazione di hwcomposer viene solitamente eseguita dal produttore del chip grafico.
Generazione di screenshot, utilizzata dal framework dell'app per generare le miniature per la funzione "app recenti", applica gli stessi passaggi di composizione che HWC fa ma esclusivamente con GLES. A partire da Android 4.2, il compositore hardware non è in grado di eseguire il composito in un buffer.
A volte il compositore hardware "punts", ad es. perché ci sono più livelli da comporre rispetto a quelli che l'hardware può gestire. In tal caso, il surfaceflinger ritorna alla composizione GLES, e ci sarà un buffer da qualche parte che ha l'immagine completa; se lo troverai o meno aprendo /dev/graphics/fb0
è un'altra questione.
alcuni punti di partenza:
- surfaceflinger
- hwcomposer HAL interface
adb shell dumpsys SurfaceFlinger
- 1. Perché OpenCV mi dà uno schermo nero?
- 2. Come acquisire lo schermo utilizzando/dev/graphics/fb0 (Android)
- 3. Perché Android WebView visualizza uno schermo nero?
- 4. Android Google Analytics che causa schermo nero
- 5. Schermo nero fotocamera in Android zbar
- 6. Schermo nero in preferenza internaScreen
- 7. PushViewController conduce a schermo nero
- 8. UIView Colore sfondo sempre nero
- 9. Schermo nero su Chrome per Android Video HTML5
- 10. UIColor colorWithRed: verde: blu: produce sempre nero
- 11. Uno schermo nero lampeggia per un istante
- 12. Schermo nero invece di multi-texturing
- 13. AVAssetWriterInput - schermo nero, 46 ore di lunghezza
- 14. iOS Presente viewController ottenere schermo nero
- 15. Excel Range.BorderAround(), di frontiera è sempre nero
- 16. Testo verticale in Dia
- 17. Android - sfondo nero diventa grigio
- 18. MPMoviePlayerController mi dà una vista vuoto nero, nessuna riproduzione video
- 19. ios 9 - xcode 7 - SFSafariViewController - Upload immagine - Schermo nero fotocamera
- 20. FLAG_ACTIVITY_REORDER_TO_TOP che causa RuntimeException o schermo nero a rotazione
- 21. Android AlertDialog produce testo nero con sfondo nero
- 22. Cercando di far sì che UIBinder mi dia una span non div.
- 23. Xcode 5 IOS simulatore schermo nero e installazione app falliscono
- 24. android google map v2 frammento nero bg issue
- 25. Invece di UICollectionView viene visualizzato uno schermo nero
- 26. Schermo nero dopo l'impostazione si traduceAutoresizingMaskIntoConstraints su NO
- 27. QNXStageWebView - drawViewPortToBitmapData() disegna sempre uno schermo bianco
- 28. Leggi altro pulsante in Android
- 29. R presentation (rpres) diventa nero in modalità schermo intero
- 30. Lo schermo di Xcode Instrument diventa nero durante la registrazione
Con le GPU più moderni, il framebuffer è probabilmente solo non banalmente accessibili (almeno non nella sua interezza) a la CPU principale il più delle volte. La maggior parte delle implementazioni di ADBD sono passate da molto tempo all'uso di un dispositivo esterno: un eseguibile unico chiamato qualcosa come screencap per fare il vero lavoro di catturare il framebuffer. Puoi usarlo, provare a trovare documentazione/fonte, o provare a decodificare l'eseguibile. Normalmente direi "buona fortuna" sulla fonte, ma per un dispositivo Nexus potrebbe essere effettivamente disponibile (o potrebbero semplicemente fornire il binario insieme agli altri bit chiusi) –
Grazie per la risposta. In realtà, i codici originali di Android contengono due nomi eseguibili: screencap e screenshot. E ci sono due modi nei loro codici. Uno è leggendo l'fb0, un altro è chiamando glPixel() fornito dalla libreria nativa di Android. Il secondo è piuttosto lento. In realtà ne ho implementato uno con il secondo metodo, ma l'fps non è l'ideale. Quindi torno indietro e cerco di farlo nel primo modo. Non ci sono restrizioni nel mio progetto. Posso anche hackerare il kernel per implementarlo. Bloccato dal problema per settimane. Ho bisogno di aiuto. – user1659072
Ciò di cui hai bisogno sono informazioni di programmazione di GPU di basso livello che, purtroppo, in genere non vengono rilasciate dai produttori. Non credo che abbiano rinunciato al semplice fb letto per essere difficile o addirittura per sicurezza; lo hanno fatto perché l'hardware non è più facilmente (o almeno portabile) esposto l'intera cosa come un buffer contiguo.Tracciai un'altra implementazione subito dopo questa modifica che legge il vero framebuffer in blocchi che interagiscono con un codice di basso livello - più efficiente dell'approccio pixel per pixel, ma ancora univoco per hardware specifico. –