2012-11-01 15 views
7

Wiem, JAK wykonać zrzut ekranu, ale zastanawiałem się, jak to działa.W jaki sposób Android wykonuje zrzuty ekranu?

Przynajmniej od wersji Androida 4.0 byłeś w stanie zrobić zrzut ekranu, przytrzymując jednocześnie klawisze zmniejszania głośności + przyciski zasilania w telefonie, a Android przechwyci bieżący ekran i zapisze go na karcie SD.

Zastanawiam się tylko, czy ktoś wie JAK to działa, jak w przypadku, jeśli jest to usługa stale działająca w tle lub coś wbudowanego w każdą aplikację, lub. Ponadto, gdzie znajduje się w kodzie źródłowym Androida?

Dzięki!

+1

Jeśli naprawdę chcesz zrozumieć Androida, powinieneś spróbować zrozumieć system GNU/Linux. W tym przypadku jest uruchomiony menedżer okien, który obsługuje go, podobnie jak X11 pod GNU/Linux. – Flavius

Odpowiedz

1

Aplikacja Android używa intencji do wywoływania zasobów na poziomie Systemu. Na przykład - większość oprogramowania do uruchomienia kamery jest dostarczana przez system operacyjny. System operacyjny Android jest oparty na jądrze systemu Unix/Linux, więc użycie kamery wygląda tak.

  1. Aplikacja/proces decyduje, czy chce korzystać z aparatu.
  2. Ta aplikacja/proces tworzy intencję i przekazuje ją do systemu operacyjnego.
  3. Cel jest przetwarzany przez system operacyjny, a oprogramowanie kamery jest wykonywane (exec) w nowym procesie. Proces wywołujący może albo go zablokować, jeśli wywoła synchronizację, albo może działać asynchronicznie i jednocześnie można uruchomić zarówno aplikację wywołującą, jak i aplikację, do której należy wywoływać zamiar. W przykładzie kamery będzie ona prawdopodobnie wywoływana synchronicznie i blokowana.
  4. Proces aparatu jest używany przez użytkownika do robienia zdjęć.
  5. Proces kamery kończy działanie i wyświetla błąd lub obraz.
  6. System operacyjny wykonuje pewne polecenie ipc (komunikacja między procesami), aby przekazać obraz z powrotem do procesu wywołującego. Wybór użycia potoków lub przekazywania komunikatów jest pozostawiony systemowi operacyjnemu, w zależności od rodzaju intencji wywoływanej przez aplikację. Kamera prawdopodobnie użyje przekazywania komunikatów, ponieważ proces nadrzędny jest blokowany, gdy proces potomny jest uruchomiony.
  7. Teraz proces wywołujący, który blokował oczekiwanie na zamiar powrotu, jest budzony przez system operacyjny i przywracany do stanu działania.
  8. Zdjęcie zostało zwrócone do aplikacji wywołującej, aby mogło być używane zgodnie z życzeniem.

Kiedy robisz zrzut ekranu, tak właśnie się dzieje. Uruchomiony jest proces obsługi interfejsu użytkownika. Zasadniczo siedzi i czeka na dane wejściowe i filtry dla wszystkiego, co powinno być zinterpretowane przez system operacyjny, zanim zostanie podłączony do działającej aplikacji. Jest to kolejna konwencja uniksowa, która w tym momencie jest standardem w każdym systemie operacyjnym, jakie mogę sobie wyobrazić - potokowe strumienie wejściowe. Pozwala systemowi operacyjnemu przechwytywać dane wejściowe o wyższym priorytecie, takie jak polecenia sterujące systemu operacyjnego, zanim zostaną przekazane do aplikacji. (pomyśl o ctrl-alt-delete w systemie Windows lub ctrl-c/ctrl-z w systemie UNIX.) Po naciśnięciu klawiszy zrzutu ekranu, ten proces o wyższym priorytecie uruchomi specjalny program, aby wykonać zrzut ekranu (za pomocą intencji) i polecenie nigdy nie jest faktycznie przekazywane do aplikacji "działającej". Ten program jest wykonywany (exec) w nowym procesie, buduje mapę bitową ekranu, zapisuje go w przestrzeni galerii i umiera - wszystko to asynchronicznie z harmonogramem, który obsługuje współdzielenie czasu, dzięki czemu telefon czuje się "responsywny" przez cały czas. Widzisz w John Bokers odpowiedź kodu źródłowego ze wszystkimi gorp, aby to zaimplementować.

+0

A więc, dlaczego nie możesz wykonać zrzutu ekranu podczas korzystania z aplikacji aparatu, ponieważ wymagałoby to asynchronicznego wywoływania działania, które już masz? –

+1

Aparat i aplikacja do scrrenowania będą czytać z dwóch różnych buforów. Aparat odczytuje z bufora aparatu, a program zrzutu ekranu odczytuje z bufora ekranu. Byłoby * możliwe * zrobienie zdjęcia z kamery, gdybyś chciał i miał pełną kontrolę nad źródłem. Domyślam się, że nie możesz, ponieważ kamera umieszcza blok IO w folderze galerii, aby program zrzutu ekranu nie zapisywał go podczas pracy kamery. Powodem tego jest zapewnienie dobrej synchronizacji w folderze ze zdjęciami i utrzymanie stabilności aparatu. – gbtimmon

+0

Ale to domysły, nie spojrzałem na źródło ani nic w tym stylu. – gbtimmon

6

Jeśli tylko chce wziąć ekran strzał jest bardzo prosty:

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; 
} 

po prostu wywołaj tę metodę z widokiem chcesz migawkę .. więc jeśli chcesz, aby cały ekran po prostu przechodził w górę najbardziej ViewGroup. jeśli chcesz kontrole systemowe też po prostu zadzwonić:

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

Teraz, jeśli zastanawiasz się, w jaki sposób „głośność w dół + klawisze power” działa, że ​​jest głębszy niż w OS będziesz mieć dostęp także. Nie ma sposobu na przechwycenie przycisku zasilania z APK AFAIK.

+1

Dzięki, ale miałem na myśli globalny proces zrzutu ekranu. –

+0

Być może, ale i tak dodam tę odpowiedź do zakładek na później. –

+0

'Bitmap bm = screenShot (v.getRootView());' tak fajnie. – kangear

6

Właśnie znalazłem kod w drzewie źródłowym tutaj: https://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot

myślę, że to tylko kwestia czytania przez niego, aby uzyskać lepsze zrozumienie procesu.

+1

Nie widzę powodu, dla którego upadł. Wszystko, co potrzebne, jest tam. +1, aby przywrócić naturalną równowagę Androidverse. BTW, powinieneś wrócić później i zaakceptować własną odpowiedź. – Simon

+0

Dziękuję, nie wiem, dlaczego ten głos został odrzucony ... Nie chcę przyjąć mojej własnej odpowiedzi, ponieważ nie sądzę, że jest ona wystarczająca. Pokazuje tylko, gdzie NIEKTÓRE z kodu znajduje się w drzewie źródłowym, ale nie w jaki sposób działa. –

Powiązane problemy