2012-11-01 13 views
7

So come fare uno screenshot, ma mi chiedevo come funziona.In che modo Android acquisisce screenshot?

Almeno dal momento che Android 4.0, è stato in grado di scattare una schermata tenendo premuto entrambi i tasti volume-down + power sul telefono, e Android catturerà la schermata corrente e la salverà sulla scheda SD.

Mi stavo chiedendo se qualcuno sa COME funziona, come in, se si tratta di un servizio costantemente in esecuzione in background, o qualcosa di incorporato in ogni app, o. Inoltre, dove si trova nel codice sorgente di Android?

Grazie!

+1

Se vuoi veramente capire Android, dovresti provare a capire GNU/Linux. In questo caso, c'è un gestore di finestre in esecuzione, che lo gestisce, proprio come c'è X11 sotto GNU/Linux. – Flavius

risposta

1

L'applicazione Android utilizza intenti per richiamare risorse a livello di sistema. Ad esempio, la maggior parte del software per eseguire la videocamera è fornito dal sistema operativo. Il sistema operativo Android si basa sul kernel unix/linux, quindi l'uso della fotocamera sarebbe simile a questo.

  1. Un'applicazione/processo decide che desidera utilizzare la telecamera.
  2. Quell'applicazione/processo crea un intento e lo passa al sistema operativo.
  3. L'intento viene elaborato dal sistema operativo e il software della videocamera viene eseguito (exec) in un nuovo processo. Il processo chiamante può bloccarlo se chiama l'intento in modo sincrono oppure può essere eseguito in modo asincrono e sia l'applicazione chiamante che l'applicazione intentata possono essere eseguite contemporaneamente. Nell'esempio di una telecamera, verrà probabilmente chiamato in modo sincrono e bloccato.
  4. Il processo fotocamera viene utilizzato dall'utente per scattare una foto.
  5. Il processo Fotocamera viene chiuso e genera un errore o un'immagine.
  6. Il sistema operativo esegue alcune ipc (comunicazione tra processi) per ritrasferire l'immagine al processo di chiamata. La scelta di utilizzare pipe o message passing è lasciata al sistema operativo, in base al tipo di intento richiamato dall'applicazione. Una telecamera probabilmente utilizzerà il passaggio dei messaggi poiché il processo principale è bloccato mentre il processo figlio è in esecuzione.
  7. Ora il processo chiamante, che bloccava l'attesa dell'intenzione di ritorno, viene risvegliato dal sistema operativo e riportato allo stato di esecuzione.
  8. L'immagine è stata restituita all'applicazione chiamante, perché possa essere utilizzata come desidera.

Quando si scatta una schermata, questo è esattamente ciò che accade. Esiste un processo in esecuzione per gestire l'interfaccia utente. Fondamentalmente si siede e attende input e filtri per tutto ciò che deve essere interpretato dal sistema operativo prima che venga convogliato alla corrente applicazione in esecuzione. Questa è un'altra convenzione Unix che a questo punto è standard in ogni sistema operativo che posso immaginare: flussi di input convogliati. Consente al sistema operativo di acquisire input con priorità più elevata, come i comandi di controllo del sistema operativo prima che vengano passati alle applicazioni. (si pensi ctrl-alt-delete in windows, o ctrl-c/ctrl-z in unix.) Quando si premono i tasti dello screen shot, questo processo io upstream esegue un programma speciale per scattare una schermata (tramite intento) e il comando non viene mai effettivamente passato all'applicazione 'in esecuzione'. Questo programma viene eseguito (exec) in un nuovo processo, crea una bitmap dello schermo, lo salva nello spazio della galleria e muore, tutto in modo asincrono con lo scheduler che gestisce la condivisione del tempo in modo che il telefono si senta "reattivo" per tutto il tempo. Vedete in John Bokers rispondere al codice sorgente con tutto il gorp per implementarlo.

+0

Quindi, il motivo per cui non è possibile acquisire uno screenshot mentre ci si trova nell'applicazione fotocamera è perché ciò implicherebbe il richiamo asincrono di un'attività in cui ci si trova già? –

+1

La fotocamera e l'applicazione del colpo scrren leggono da due diversi buffer. La fotocamera legge dal buffer della fotocamera e il programma di cattura dello schermo sta leggendo dal buffer dello schermo. Quindi sarebbe * possibile * prendere una schermata dalla fotocamera se lo si desidera e avere il controllo completo della sorgente. La mia ipotesi è che non puoi perché la fotocamera sta mettendo un blocco IO nella cartella della galleria in modo che il programma di screenshot non possa scriverlo mentre la videocamera è in esecuzione. La ragione per cui lo fa è di fornire una buona sincronizzazione sulla cartella delle foto e mantenere la fotocamera più stabile. – gbtimmon

+0

Ma questa è una supposizione, non ho guardato la fonte o qualcosa del genere. – gbtimmon

6

Se sono solo vogliono prendere uno schermo colpo che è molto semplice:

public Bitmap screenShot(View view) { 
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), 
      view.getHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    view.draw(canvas); 
    return bitmap; 
} 

basta chiamare questo metodo con la vista vuoi un'istantanea di .. quindi se vuoi che l'intero schermo ti passi sopra in cima a tutti più ViewGroup. se si desidera che i controlli di sistema anche semplicemente chiamare:

screenShot((ViewGroup) view.getParent()); 

Ora, se vi state chiedendo come il "tasti del volume di potere-giù +" funziona che è più profondo nel sistema operativo che avrete accesso anche. Non c'è modo di intercettare il pulsante di accensione da un APK AFAIK.

+1

Grazie, ma mi riferivo al processo globale delle schermate. –

+0

Forse, ma sto segnalando questa risposta per dopo comunque. –

+0

'Bitmap bm = screenShot (v.getRootView());' molto interessante. – kangear

6

Ho appena trovato il codice nell'albero dei sorgenti qui: https://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot

Credo che sia solo una questione di lettura attraverso di essa per ottenere una migliore comprensione del processo.

+1

Impossibile vedere perché il downvote. Tutto il necessario è lì. +1 per ripristinare il bilanciamento naturale di Androidverse. A proposito, dovresti tornare più tardi e accettare la tua risposta. – Simon

+0

Grazie, non so perché sia ​​stato votato ... Non voglio accettare la mia risposta perché non penso che sia abbastanza adeguata. Mostra solo dove SOME del codice si trova nell'albero dei sorgenti, ma non come funziona. –

Problemi correlati