2012-11-01 7 views
7

Tôi biết CÁCH chụp ảnh màn hình, nhưng tôi đã tự hỏi nó hoạt động như thế nào.Android chụp ảnh màn hình như thế nào?

Ít nhất kể từ Android 4.0, bạn có thể chụp màn hình bằng cách giữ cả hai phím giảm âm lượng trên điện thoại và Android sẽ chụp màn hình hiện tại và lưu màn hình vào thẻ SD.

Tôi chỉ tự hỏi nếu có ai biết CÁCH này hoạt động, như trong, nếu đó là một dịch vụ liên tục chạy trong nền, hoặc một cái gì đó được xây dựng trong mỗi ứng dụng, hoặc. Ngoài ra, nó nằm ở đâu trong mã nguồn của Android?

Cảm ơn!

+1

Nếu bạn thực sự muốn hiểu Android, bạn nên cố gắng hiểu GNU/Linux. Trong trường hợp này, có một trình quản lý cửa sổ đang chạy, xử lý nó, giống như có X11 trong GNU/Linux. – Flavius

Trả lời

1

Ứng dụng Android sử dụng ý định để gọi tài nguyên ở cấp Hệ thống. Ví dụ - hầu hết các phần mềm để chạy máy ảnh được cung cấp bởi hệ điều hành. Hệ điều hành Android được dựa trên hạt nhân unix/linux để sử dụng máy ảnh sẽ như thế này.

  1. Ứng dụng/Quy trình quyết định muốn sử dụng máy ảnh.
  2. Ứng dụng/Quy trình đó xây dựng ý định và chuyển nó đến hệ điều hành.
  3. Mục đích được xử lý bởi hệ điều hành và phần mềm máy ảnh được thực thi (exec) trong một quy trình mới. Quá trình gọi có thể chặn nó nếu nó được gọi là ý định đồng bộ, hoặc nó có thể chạy không đồng bộ và cả ứng dụng gọi điện và ứng dụng được gọi có mục đích có thể chạy cùng một lúc. Trong ví dụ về máy ảnh, nó có thể sẽ được gọi là đồng bộ và chặn.
  4. Quy trình máy ảnh được người dùng sử dụng để chụp ảnh.
  5. Quy trình Máy ảnh thoát và tạo ra lỗi hoặc hình ảnh.
  6. Hệ điều hành thực hiện một số ipc (giao tiếp liên tục) để chuyển ảnh trở lại quá trình gọi. Sự lựa chọn để sử dụng đường ống hoặc thông điệp đi qua được để lại cho hệ điều hành, dựa trên loại ý định được gọi bởi ứng dụng. Một máy ảnh có thể sẽ sử dụng tin nhắn đi qua vì quá trình cha mẹ bị chặn trong khi tiến trình con đang chạy.
  7. Bây giờ quy trình gọi, đang chặn đang chờ ý định trả lại được hệ điều hành đánh thức và quay trở lại trạng thái đang hoạt động.
  8. Hình ảnh đã được trả lại cho ứng dụng gọi điện, để nó được sử dụng theo ý muốn.

Khi bạn chụp ảnh màn hình, đây chính xác là những gì sẽ xảy ra. Có một quá trình chạy để xử lý giao diện người dùng. Về cơ bản nó ngồi và chờ đầu vào và các bộ lọc cho bất cứ điều gì cần được hệ điều hành giải thích trước khi nó được chuyển đến ứng dụng đang chạy. Đây là một quy ước khác unix rằng tại thời điểm này là tiêu chuẩn trong mọi hệ điều hành mà tôi có thể nghĩ đến - các luồng đầu vào đường ống. Nó cho phép hệ điều hành nắm bắt đầu vào ưu tiên cao hơn, chẳng hạn như lệnh điều khiển OS trước khi chúng được truyền cho các ứng dụng. (nghĩ ctrl-alt-delete trong windows, hoặc ctrl-c/ctrl-z trong unix.) Khi nhấn phím chụp màn hình, quá trình io ngược dòng này thực hiện một chương trình đặc biệt để chụp ảnh màn hình (thông qua ý định) và lệnh không bao giờ thực sự được chuyển đến ứng dụng 'đang chạy'. Chương trình đó được thực thi (exec) trong một quá trình mới, xây dựng một bitmap của màn hình, lưu nó vào không gian bộ sưu tập và chết - tất cả không đồng bộ với tính năng chia sẻ thời gian xử lý lịch trình để điện thoại cảm thấy 'đáp ứng' toàn bộ thời gian. Bạn thấy trong John Bokers trả lời mã nguồn với tất cả các gorp để thực hiện điều này.

+0

Vì vậy, lý do bạn không thể chụp ảnh màn hình trong khi ứng dụng máy ảnh của bạn là vì điều đó sẽ liên quan đến việc gọi không đồng bộ một hoạt động mà bạn đã tham gia? –

+1

Máy ảnh và ứng dụng chụp liên tục sẽ đọc từ hai bộ đệm khác nhau. Máy ảnh đọc từ bộ đệm máy ảnh và chương trình chụp màn hình đang đọc từ bộ đệm màn hình. Vì vậy, nó sẽ là * có thể * để chụp ảnh màn hình từ máy ảnh nếu bạn muốn và có toàn quyền kiểm soát nguồn. Tôi đoán là bạn không thể bởi vì máy ảnh được đặt một khối IO trên thư mục bộ sưu tập để chương trình chụp màn hình không thể ghi vào nó trong khi máy ảnh đang chạy. Lý do nó thực hiện điều này là cung cấp sự đồng bộ hóa tốt trên thư mục ảnh và giữ cho máy ảnh ổn định hơn. – gbtimmon

+0

Nhưng đó là một đoán, tôi havent nhìn vào nguồn hoặc bất cứ điều gì như thế. – gbtimmon

6

Nếu bạn chỉ muốn để có một màn hình bắn rất thẳng về phía trước:

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

chỉ cần gọi phương thức này với chế độ xem bạn muốn có một bản chụp của .. vì vậy nếu bạn muốn toàn bộ màn hình chỉ cần vượt qua trong bạn đầu nhất ViewGroup. nếu bạn muốn các điều khiển Hệ thống cũng chỉ cần gọi:

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

Bây giờ, nếu bạn tự hỏi cách "phím giảm âm lượng" hoạt động sâu hơn trong hệ điều hành thì bạn cũng sẽ có quyền truy cập. Không có cách nào để chặn nút nguồn từ APK AFAIK.

+1

Cảm ơn, nhưng tôi đã đề cập đến quá trình chụp toàn màn hình toàn cầu. –

+0

Có lẽ, nhưng tôi đang đánh dấu câu trả lời này cho sau này. –

+0

'Bitmap bm = screenShot (v.getRootView());' rất tuyệt. – kangear

6

Tôi chỉ tìm thấy mã trong cây nguồn ở đây: https://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot

Tôi đoán nó chỉ là một vấn đề đọc qua nó để có được một sự hiểu biết tốt hơn về quá trình này.

+1

Không thể thấy lý do tại sao downvote. Tất cả mọi thứ cần thiết là có. +1 để khôi phục lại sự cân bằng tự nhiên của Androidverse. BTW, bạn nên quay lại sau và chấp nhận câu trả lời của riêng bạn. – Simon

+0

Cảm ơn bạn, tôi không biết tại sao nó lại bị bỏ phiếu ... Tôi không muốn chấp nhận câu trả lời của riêng tôi bởi vì tôi không nghĩ nó khá thích hợp. Nó chỉ cho thấy một số mã nằm trong cây nguồn, nhưng không phải là nó hoạt động như thế nào. –