android 第三方app截图

将View生成相应的图片是很容易的,所以app内截图可以采用此种方式。

view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap screenshot = view.getDrawingCache();
//使用完图片之后再执行destroyDrawingCache,因为destroyDrawingCache内部会调用bitmap.recycle()
view.destroyDrawingCache();
view.setDrawingCacheEnabled(false);

拿到了bitmap之后,还需要对其进行处理,分为下面几个部分/几种情况:

1.状态栏

2.导航栏

3.魅族flyme的smartbar

对于状态栏,app是无法截图的,截出来只是状态栏底色,上面的通知和时间电量等信息是没有的,所以一般会去掉状态栏这一块

对于导航栏,这个是可以截到的,但是内容和app无关,只是3个按钮,可能也不好看,所以一般也会去掉

另外,魅族还有smartbar,一般也需要干掉

对于上面3条,我们只需要得知其高度即可,然后去除这几部分(这里没有考虑横屏)

//width为截图宽度,height为最终的图片高度,即处理过状态栏/导航栏/smartbar之后的高度
//top为状态栏的高度
Bitmap bg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bg);
canvas.drawBitmap(screenshot, width, top, null);
screenshot.recycle();

下面是对于魅族的flyme特殊处理的部分

判断flyme系统

/**
 * 判断是否是魅族系统
 * @return
 */
public static boolean isFlyme() {
    try {
        // Invoke Build.hasSmartBar()
        final Method method = Build.class.getMethod("hasSmartBar");
        return method != null;
    } catch (final Exception e) {
        return false;
    }
}

获取smartbar高度

//获取魅族smartbar高度
public static int getSmartBarHeight(Context context) {
    try {
        Class clazz = Class.forName("com.android.internal.R$dimen");
        Object obj = clazz.newInstance();
        Field field = clazz.getField("mz_action_button_min_height");
        int height = Integer.parseInt(field.get(obj).toString());
        return context.getResources().getDimensionPixelSize(height);
    } catch (ClassNotFoundException e) {
        Log.w(TAG, e);
    } catch (InstantiationException e) {
        Log.w(TAG, e);
    } catch (IllegalAccessException e) {
        Log.w(TAG, e);
    } catch (NoSuchFieldException e) {
        Log.w(TAG, e);
    }
    return 0;
}

如何获取状态栏/导航栏高度这里不再赘述

上面说的是一般情况,下面我们来说说几种特殊情况

1.如何截取dialog

如果直接在activity获取window中的DecorView,截取的图片实际是没有dialog部分的,只有dialog下面的页面。想要获取dialog截图,我们可以先获取dialog引用,然后获取

dialog.getWindow().getDecorView()

2.当页面没有占满屏幕时

举个例子,有的时候我们会把页面做成半窗形式,屏幕上方还能看到上一个页面的内容。这时activity只有屏幕下方那部分,所以这时处理截图时不能再减去状态栏那部分了,因为此时截图上面根本没有状态栏

3.webview截图

在4.3系统上面,使用getDecorView().getDrawingCache()方法有时不能准确的截取webview上面显示的内容。当webview里显示tab形式的页面时,有时不管当前处于哪个tab,截图出来的都是第一个tab的内容。

但是,如果使用webview.getDrawingCache(),那么是能得到正确的图片的,所以我在含有webview的页面中截图方式是遍历页面中的view,然后将图片拼到一起

猜你喜欢

转载自su1216.iteye.com/blog/2390128