エンドウの莢といくつかのブラシソフトを真似て携帯電話の画面の画像を取得します


昨日午後、システムのスクリーンショットを研究しました.実行可能な案は2つあります.
1.携帯端末:現在の画面のデータを記憶した/dev/graphics/fb 0ファイルを読み出し、このデータを画像に変換して携帯端末に記憶すればよい.しかし、米国ではシステムroot権限を取得する必要がある.
2.pc端:ddmsで携帯電話に接続し、IDeviceのgetScreenshot()で携帯電話の画面情報を取得する.しかし、欠点は携帯電話がadbデバッグを開く必要があることです.
現在、アプリケーション市場にはScreenshotItがrootを必要とせずに使用できるのは1つしかないが、使用前に煩雑なインストール手順を経て、携帯電話システムrootの権限を取得した可能性がある.
それ以外に、関連ソフトウェアはroot権限を取得してから図を切り取る必要があります.赤米はワンタッチでスクリーンショットできますが、それはカスタマイズされたromが持参したもので、PhoneWindowManagerでシステムスクリーンショット(Surface.screenshot(int,int)メソッド)を呼び出すと簡単に実現できます.
PC側の実現機能は比較的容易で、javaファイル+ddmuilibが1つしか必要ありません.JArでいいです.コードは次のとおりです.
import com.android.ddmlib.AdbCommandRejectedException;
import com.android.ddmlib.AndroidDebugBridge;
import com.android.ddmlib.IDevice;
import com.android.ddmlib.RawImage;
import com.android.ddmlib.TimeoutException;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class DDMScreen {

    /**
     * @param args
     */
    public static void main(String[] args) {
        IDevice device;
        AndroidDebugBridge.init(false);
        AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
        waitDeviceList(bridge);
        IDevice devices[] = bridge.getDevices();
        device = devices[0];
        try {
            RawImage rawScreen = device.getScreenshot();
            if (rawScreen != null) {
                boolean landscape = false;
                BufferedImage image = null;
                int width2 = landscape ? rawScreen.height : rawScreen.width;
                int height2 = landscape ? rawScreen.width : rawScreen.height;
                image = new BufferedImage(width2, height2,
                            BufferedImage.TYPE_INT_RGB);
                int index = 0;
                int indexInc = rawScreen.bpp >> 3;
                for (int y = 0; y < rawScreen.height; y++) {
                    for (int x = 0; x < rawScreen.width; x++, index += indexInc) {
                        int value = rawScreen.getARGB(index);
                        if (landscape)
                            image.setRGB(y, rawScreen.width - x - 1, value);
                        else
                            image.setRGB(x, y, value);
                    }
                }
                ImageIO.write((RenderedImage) image, "PNG", new File("C:\\Users\\sjyBing\\Desktop\\123.png"));
            }
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (AdbCommandRejectedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void waitDeviceList(AndroidDebugBridge bridge) {
        int count = 0;
        while (bridge.hasInitialDeviceList() == false) {
            try {
                Thread.sleep(100); //           ,   
                count++;
            } catch (InterruptedException e) {
            }
            if (count > 300) {
                //       300×100 ms        
                System.err.print("Time out");
                break;
            }
        }
    }

}
もっと良い方法は発掘に努力する必要があります.
PC側は携帯電話の画面のピクチャーコードのダウンロードアドレスを取得します(jarバッグを含みます):http://download.csdn.net/detail/singleton1900/6543671