当前位置: 首页 > 知识库问答 >
问题:

Android屏幕截图处理程序

贲高寒
2023-03-14

我已经在活动中创建了处理程序。这个Hanlder负责在10秒后拍摄屏幕截图。在运行方法中,我使用了虽然(标志==true)和屏幕捕获util标志==false,但这卡住了我的活动。我不能工作。它把屏幕拍摄一遍又一遍的相同的图像,因为动作被卡住了。我如何可以工作与我的屏幕和我正在做的处理程序采取屏幕截图后10秒?而循环卡住了我的应用程序。

它可以拍照,但我无法进行我的活动。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    flag = true;


    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {

            while (flag == true) {
                String SCREENSHOTS_LOCATIONS = Environment
                        .getExternalStorageDirectory().toString() + "/re/";
                // Get root view
                View view = getWindow().getDecorView().getRootView();
                // Create the bitmap to use to draw the screenshot
                final Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
                        view.getHeight(), Bitmap.Config.ARGB_8888);
                final Canvas canvas = new Canvas(bitmap);

                // Get current theme to know which background to use
                final Theme theme = getTheme();
                final TypedArray ta = theme
                        .obtainStyledAttributes(new int[] { android.R.attr.windowBackground });
                final int res = ta.getResourceId(0, 0);
                final Drawable background = getResources().getDrawable(res);

                // Draw background
                background.draw(canvas);

                // Draw views
                view.draw(canvas);
                FileOutputStream fos = null;

                try {
                    final File sddir = new File(SCREENSHOTS_LOCATIONS);
                    if (!sddir.exists()) {
                        sddir.mkdirs();
                    }

                    fos = new FileOutputStream(SCREENSHOTS_LOCATIONS + x
                            + ".jpg");
                    x++;
                    if (fos != null) {
                        if (!bitmap.compress(Bitmap.CompressFormat.JPEG,
                                90, fos)) {
                            Log.d("ScreenShot", "Compress/Write failed");
                        }
                        fos.flush();
                        fos.close();
                    }
                } catch (Exception e) {

                }
            }
        }

    }, 1000);

}

共有1个答案

徐杰
2023-03-14

也许尝试使用AsyncWork或其他线程。postDelayed()函数附加到主UI线程并锁定应用程序,直到run()完成(这永远不会发生,因为标志永远不会等于false,所以而循环变得无限?)。

下面是一个使用ScheduledThreadPoolExecutor的示例:

private ScheduledThreadPoolExecutor exec = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    flag = true;

    exec = new ScheduledThreadPoolExecutor(5);
    long interval = (long) 10; // 10 seconds for you
    exec.scheduleAtFixedRate(new savePicTask(), 0, interval, TimeUnit.SECONDS);

}

class savePicTask implements Runnable {
    @Override
    public void run() {
        while (flag == true) {
            String SCREENSHOTS_LOCATIONS = Environment
                    .getExternalStorageDirectory().toString() + "/re/";
            // Get root view
            View view = getWindow().getDecorView().getRootView();
            // Create the bitmap to use to draw the screenshot
            final Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
                    view.getHeight(), Bitmap.Config.ARGB_8888);
            final Canvas canvas = new Canvas(bitmap);

            // Get current theme to know which background to use
            final Theme theme = getTheme();
            final TypedArray ta = theme
                    .obtainStyledAttributes(new int[] { android.R.attr.windowBackground });
            final int res = ta.getResourceId(0, 0);
            final Drawable background = getResources().getDrawable(res);

            // Draw background
            background.draw(canvas);

            // Draw views
            view.draw(canvas);
            FileOutputStream fos = null;

            try {
                final File sddir = new File(SCREENSHOTS_LOCATIONS);
                if (!sddir.exists()) {
                    sddir.mkdirs();
                }

                fos = new FileOutputStream(SCREENSHOTS_LOCATIONS + x
                        + ".jpg");
                x++;
                if (fos != null) {
                    if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos)) {
                        Log.d("ScreenShot", "Compress/Write failed");
                    }
                    fos.flush();
                    fos.close();
                }
            } catch (Exception e) {

            }
        }
    }       
}

编辑1:这个代码对我有效,除了我使用

numberOfSeconds = 0.5;
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(5);
long interval = (long) (1000* numberOfSeconds); // numberOfSeconds = 10 for you
exec.scheduleAtFixedRate(new savePicTask(), 0, interval, TimeUnit.MILLISECONDS);

我没有截图,而是用相机拍照。所以我不知道为什么它不适合你。

 类似资料:
  • 我想让应用程序像“简易屏幕录制器”。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何用于创建屏幕录制器的api,而不是屏幕截图。我不想使用javacv从屏幕截图创建视频。我只想让用户启动应用程序,点击开始录制按钮,然后用户在手机上所做的一切来录制这些内容。 1) Android系统中是否有相关的api。 2) 如何在android中创建屏幕录制器应用程序。 3)是没有任何api

  • 在Linux下有很多屏幕载图的工具,下面简单介绍一下: 在GNOME桌面中自带了一个屏幕截图工具,位于“动作”栏内。该工具功能很少,只能截取当前屏幕。 在GMIP中也可截图,在“文件”--“获取”菜单下有一个“屏幕抓图”选项可进行屏幕截图。它可截取任意图窗口的内容,并自动输入到GMIP中,我们可方便地进行处理和保存。 安装ImageMagick软件,它有一个工具叫import可用于屏幕截图。该工具

  • 点击按钮进行截屏,可以将截屏图像保存到相册中。 作者说:听说会和苹果的策略有冲突,应用如果上架可能会被拒绝。这个估计是看人品了吧。经过测试发现,如果先弹出对话框,然后再截屏,似乎并不能把对话框也给保存下来。 [Code4App.com]

  • 我试图截图Android Studio模拟器像素4 XL API 30,但每当我试图采取一个,模拟器结束自己。然后我得到消息"失去连接到设备"。谁能告诉我是否有办法解决这个问题? __ 我尝试更改保存的文件夹,并重新启动模拟器

  • 我正在使用AlarmManager和Pending Intent调用BroadcastReceiver类。这是每天安排的。 以下是“活动”中调用的BroadCast Receiver类的代码(它是一个单独的类)。 问题陈述是,在此接收器中,我正在打开另一个应用程序,我想捕获屏幕截图并将其上传到服务器。但是窗口功能在广播接收器类中不可用,我无法实现,因为我超出了活动控制。 关键挑战: -在以下类中实

  • 我正在开发一个Android应用程序,这个应用程序是一个家长顾问应用程序,它将安装在父母的手机和孩子的手机上。我的问题是,在男孩不知情的情况下,如何从他的手机中截图?