Android截图(可全局任何地方调用)

通过Application的registerActivityLifecycleCallbacks,存储运行Activity实现灵活截图。在任意位置调用简单方便,受启发于优快云博客。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这里利用了一个小技巧啦~就是通过application类中的registerActivityLifecycleCallbacks,去存储了当前正在运行的activity来实现的。(本质还是依赖于activity,但是更加灵活)

首先,在自己的application类的oncreate方法中加入

public class BSApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

...

        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityStopped(Activity arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onActivityStarted(Activity arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onActivitySaveInstanceState(Activity arg0, Bundle arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onActivityResumed(Activity activity) {
                BSActivityManager.getInstance().setCurrentActivity(activity);  
            }

            @Override
            public void onActivityPaused(Activity arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onActivityDestroyed(Activity arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onActivityCreated(Activity arg0, Bundle arg1) {
                // TODO Auto-generated method stub

            }
        });

    }

然后写一个BSActivityManager类

public class BSActivityManager {  

    private static BSActivityManager sInstance = new BSActivityManager();  
    private WeakReference<Activity> sCurrentActivityWeakRef;  


    private BSActivityManager() {  

    }  

    public static BSActivityManager getInstance() {  
      return sInstance;  
    }  

    public Activity getCurrentActivity() {  
      Activity currentActivity = null;  
      if (sCurrentActivityWeakRef != null) {  
        currentActivity = sCurrentActivityWeakRef.get();  
      }  
      return currentActivity;  
    }  

    public void setCurrentActivity(Activity activity) {  
      sCurrentActivityWeakRef = new WeakReference<Activity>(activity);  
    }  
}  

然后正常截图工具类

public class ScreenUtil {

    public static Bitmap GetandSaveCurrentImage(Activity act) {
        // 1.构建Bitmap
        WindowManager windowManager = act.getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        int w = display.getWidth();
        int h = display.getHeight();

        Bitmap Bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888);

        // 2.获取屏幕
        View decorview = act.getWindow().getDecorView();
        decorview.setDrawingCacheEnabled(true);
        Bmp = decorview.getDrawingCache();

        // 3.保存Bitmap
        try {
            File path = new File(AppConfig.getInstance().APP_PATH_ROOT);
            // 文件
            String filepath = AppConfig.getInstance().APP_PATH_ROOT
                    + "/Screen_1.png";
            File file = new File(filepath);
            if (!path.exists()) {
                path.mkdirs();
            }
            if (!file.exists()) {
                file.createNewFile();
            }

            FileOutputStream fos = null;
            fos = new FileOutputStream(file);
            if (null != fos) {
                Bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
                fos.flush();
                fos.close();

                Toast.makeText(act, "截屏文件已保存至SDCard/BsAppConfig/下",
                        Toast.LENGTH_LONG).show();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return Bmp;
    }

    public static String Bitmap2StrByBase64(Bitmap bit) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bit.compress(CompressFormat.JPEG, 40, bos);// 参数100表示不压缩
        byte[] bytes = bos.toByteArray();
        return Base64.encodeToString(bytes, Base64.DEFAULT);
    }

}

最后在想截图的地方

currActivity = BSActivityManager.getInstance().getCurrentActivity();
        Bitmap crash_img = ScreenUtil.GetandSaveCurrentImage(currActivity);
        String crash_img_base64 = ScreenUtil.Bitmap2StrByBase64(crash_img);

直接这样写,即可! 很方便吧~

感谢
http://blog.youkuaiyun.com/cjyusha/article/details/51274075
的原作者,受到了你的启发~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值