【问题标题】:How to make an application which can take screenshot of whole screen of android device programatically?如何制作一个可以以编程方式截取android设备全屏的应用程序?
【发布时间】:2013-10-25 12:10:04
【问题描述】:

我想制作一个可以以编程方式截取android设备全屏的应用程序。

我已经进行了一些研发,但它表明只有在 root 设备或 API 级别 4.0 允许访问的更高设备上截屏才能实现此目的。

已经有一些付费应用程序允许在无根设备上截屏。

所以,如果有人建议我如何在未植根的设备上执行此操作,那就太好了。

提前致谢。

【问题讨论】:

    标签: android screen-scraping screenshot video-capture screen-capture


    【解决方案1】:

    我最近做了一些与社交媒体分享类似的事情。这是允许我的屏幕截图存储在 sd 卡上并稍后用于您需要的任何代码的代码:

    // image naming and path  to include sd card  appending name you choose for file
    String mPath = Environment.getExternalStorageDirectory().toString() + "/" + Image;   
    
    // create bitmap screen capture
    Bitmap bitmap;
    View v1 = mCurrentUrlMask.getRootView();
    v1.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);
    
    OutputStream fout = null;
    imageFile = new File(mPath);
    
    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
        fout.flush();
        fout.close();
    
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    然后,当您需要访问时,请使用以下内容:

    Uri uri = Uri.fromFile(new File(mPath));
    

    【讨论】:

    • 你能告诉我什么是 mCurrentUrlMask 吗?
    • 这就是我如何查看完整的android设备屏幕的问题。
    • 这就是我如何查看完整的android设备屏幕的问题。
    【解决方案2】:

    使用 SDK,您只能截取根视图(及其所有子视图)的屏幕截图,这意味着:仅限您的视图。不会使用对话框、toast、键盘、微调器和状态栏,因为它们不共享同一个视图树。

    Play 商店中有一些应用程序,但它们肯定不是跨平台的。使用有根设备,您可以使用 ASL(Android 屏幕截图库)通过 /dev/graphics/fb0 帧缓冲区抓取屏幕截图。这会很好地工作,并且会产生类似于 ddms 的抓取。视频硬件叠加层将保持黑色。

    我没有对您提到的那些应用程序进行逆向工程,但我相信它们会识别您正在使用的设备,然后发送将截取屏幕截图的密钥(例如音量 + 调低),然后观察 sdcard 上的新文件.您可以看到他们需要时间来截取屏幕截图。

    TestFairy (http://www.testfairy.com) 会抓取您应用的整个屏幕,包括 opengl 表面视图、toast 和对话框。它通过检测来执行此操作,并且会自动执行此操作。

    我希望这会有所帮助:)

    【讨论】:

    • 是否可以通过 Open GL 实现?因为我是新手,所以我对它没有完美的想法。
    • 使用 OpenGL,您可以通过 glReadPixels 接收像素。不幸的是,如果您在此 OpenGL 层之上还有其他视图,则必须自己进行混合,因为 View.draw 将使 GL 视图保持黑色。所以很容易做到其中之一。正如我所说,ASL 和 TestFairy 都解决了这个问题。一个需要root,另一个不需要。
    【解决方案3】:

    试试这个

    public void shareit()
        {
            View view =  findViewById(R.id.layout);//ur layout id
            view.getRootView();
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) 
            {
                picDir  = new File(Environment.getExternalStorageDirectory()+ "/myPic");
                if (!picDir.exists())
                {
                    picDir.mkdir();
                }
                view.setDrawingCacheEnabled(true);
                view.buildDrawingCache(true);
                Bitmap bitmap = view.getDrawingCache();
    //          Date date = new Date();
                String fileName = "mylove" + ".jpg";
                picFile = new File(picDir + "/" + fileName);
                try 
                {
                    picFile.createNewFile();
                    FileOutputStream picOut = new FileOutputStream(picFile);
                    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));
                    boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut);
                    if (saved) 
                    {
                        Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show();
                    } else 
                    {
                        //Error
                    }
                    picOut.close();
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
                view.destroyDrawingCache();
            } else {
                //Error
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多