1. 程式人生 > >android截圖功能實現

android截圖功能實現

這篇文章實現了擷取當前Activity頁面,並把截圖圖片儲存在SD卡指定路徑下功能(親測可用)。

首先要確保manifest有操作SD卡許可權

<!-- 允許應用內建sd卡 -->

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

下面方法是根據當前的activity截圖,生成bitmap物件

 /**
     * 獲取指定Activity的截圖,儲存到png檔案
     *
     * @author Johnson
     * **/
    private static Bitmap takeScreenShot(Activity activity) {
        // View是你需要截圖的View
        View view = activity.getWindow().getDecorView();
        // 設定是否可以進行繪圖快取
        view.setDrawingCacheEnabled(true);
        // 如果繪圖快取無法,強制構建繪圖快取
        view.buildDrawingCache();
        // 返回這個快取檢視
        Bitmap bitmap = view.getDrawingCache();
        // 獲取狀態列高度
        Rect frame = new Rect();
        // 測量螢幕寬和高
        view.getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
        Log.d("ViewDescActivity","狀態列的高度為: "+statusBarHeight);
        // 獲取螢幕長和高
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();
        int height = activity.getWindowManager().getDefaultDisplay().getHeight();
        // 去掉標題欄
        // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
        bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height-statusBarHeight);
        //view.destroyDrawingCache();
        return bitmap;
    }

然後我們應該檢視SD卡是不是夠用
 /***
     * Sd判斷SD卡是否可用
     *
     * @author Johnson minSizeSDcard>50kb
     * */
    public static boolean getAvailableSDcard(Context context) {
        long minSizeSDcard = 50;
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED); // 判斷sd卡是否存在
        System.out.println("+++" + sdCardExist);
        if (sdCardExist) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSize();
            long availableBlocks = stat.getAvailableBlocks();
            long sdCardSize = (availableBlocks * blockSize) / 1024;// KB值
            if (sdCardSize > minSizeSDcard) {
                return true;
            } else {
                Toast.makeText(context, "SD卡空間不足", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(context, "請插入SD卡", Toast.LENGTH_SHORT)
                    .show();
        }
        return false;
    }

最後生成png圖片儲存到指定路徑
/**
     * 截圖儲存
     *
     * @author Johnson
     * **/
    private static void savePic(Bitmap b, String filePath, String fileName) {
        File f = new File(filePath);
        if (!f.exists()) {
            f.mkdir();
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(filePath + File.separator + fileName);
            if (null != fos) {
                b.compress(Bitmap.CompressFormat.PNG, 90, fos);
                fos.flush();
                fos.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

可以這樣呼叫
  Bitmap bitmap = takeScreenShot(ViewDescActivity.this);
        String fileName = String.valueOf(System.currentTimeMillis());
        if(getAvailableSDcard(ViewDescActivity.this)){
            savePic(bitmap,Constant.SD_DIR_SCREEN_SHOT,fileName+".png");
            localUrl =  Constant.SD_DIR_SCREEN_SHOT+ fileName+".PNG";
        }

開始忘記加允許應用內建sd卡許可權,系統報錯:
01-06 23:32:40.203: ERROR/ActivityThread(1954): Failed to find provider info for com.qihoo360.daemon
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track delete
01-06 23:32:43.148: ERROR/AudioTrack(1632): stop 0x528b88
01-06 23:32:43.148: ERROR/AudioTrack(1632): Stop complete
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit start
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit done
01-06 23:32:43.335: ERROR/AudioTrack(1632): stop 0x545d70
01-06 23:32:43.335: ERROR/AudioTrack(1632): Stop complete

然後忘記在fileName後面加“.png” 後果就是生成非圖片檔案。

提醒自己以後不要這麼粗心了。