Android 截圖

方法三:java

第三種方法是用FrameBuffer實現的截屏,這纔是真正意義上的截圖!linux

先介紹下FrameBuffer:framebuffer是linux內核對顯示的最底層驅動。在通常的linux文件系統中,經過/dev/fb0設備文件來提供給應用程序對framebuffer進行讀寫的訪問。這裏,若是有多個顯示設備,就將依次出現fb1,fb2,…等文件。而在咱們所說的android系統中,這個設備文件被放在了/dev/graphics/fb0,並且每每只有這一個。android

public static Bitmap captureScreen(Activity activity) {shell

// 獲取屏幕大小:spa

DisplayMetrics metrics = new DisplayMetrics();.net

WindowManager WM = (WindowManager) activityorm

.getSystemService(Context.WINDOW_SERVICE);xml

Display display = WM.getDefaultDisplay();blog

display.getMetrics(metrics);圖片

int height = metrics.heightPixels; // 屏幕高

int width = metrics.widthPixels; // 屏幕的寬

// 獲取顯示方式

int pixelformat = display.getPixelFormat();

PixelFormat localPixelFormat1 = new PixelFormat();

PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1);

int deepth = localPixelFormat1.bytesPerPixel;// 位深

byte[] piex = new byte[height * width * deepth];

try {

Runtime.getRuntime().exec(

new String[] { "/system/bin/su", "-c",

"chmod 777 /dev/graphics/fb0" });

} catch (IOException e) {

e.printStackTrace();

}

try {

// 獲取fb0數據輸入流

InputStream stream = new FileInputStream(new File(

"/dev/graphics/fb0"));//java.io.FileNotFoundException: /dev/graphics/fb0: open failed: EACCES (Permission denied)

DataInputStream dStream = new DataInputStream(stream);

dStream.readFully(piex);

} catch (Exception e) {

e.printStackTrace();

}

// 保存圖片

int[] colors = new int[height * width];

for (int m = 0; m < colors.length; m++) {

int r = (piex[m * 4] & 0xFF);

int g = (piex[m * 4 + 1] & 0xFF);

int b = (piex[m * 4 + 2] & 0xFF);

int a = (piex[m * 4 + 3] & 0xFF);

colors[m] = (a << 24) + (r << 16) + (g << 8) + b;

}

// piex生成Bitmap

Bitmap bitmap = Bitmap.createBitmap(colors, width, height,

Bitmap.Config.ARGB_8888);

return bitmap;

}

記得在AndroidManifest.xml加上兩行權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />

還有須要注意的是,手機須要root權限,沒root過的手機我還沒試過,但估計是不行的。

原文地址:https://my.oschina.net/u/816576/blog/345761 

 

解決方案一: 
經過cmd進入控制檯,輸入如下命令便可:adb shell chmod 777 /dev/graphics/fb0

解決方案二: 
因爲安裝到手機上用戶不可能去輸入命令,所以可採用如下方案,編寫代碼執行Linux命令

http://blog.csdn.net/Markslin/article/details/48090587

相關文章
相關標籤/搜索