android截取屏幕截图

时间:2011-04-09 09:26:41

标签: android android-activity screenshot off-screen

我正在开发一个Android应用程序。我有一个活动,比如A,它用整个屏幕填充视图。点击A中的一个按钮,我想开始另一个活动,比如B,它也有一些视图和控件。我希望活动B在屏幕外,并希望从A获取B的屏幕截图。可能吗?

注意:通过将绘图缓存保存到位图中,我成功获取了页面A的屏幕截图,但很难获取屏幕外页面的截图。

4 个答案:

答案 0 :(得分:14)

是的,有可能......你应该在Activity'A'中扩展ActivityGroup。 然后在按钮点击事件中执行此操作...

 View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();

然后将该视图转换为位图...

我认为这对你有帮助......

答案 1 :(得分:5)

我已经达到了我想要的水平。这些是我使用的步骤。

  1. 使用startActivityForResult()而不是使用startActivityForResult()启动活动B. startActivity()。

    Intent bIntent = new Intent(A.this,B.class);
    startActivityForResult(bIntent,B_REQUEST_CODE);
    
  2. 在活动B的onCreate中,取B的mainLayout并启用它 绘图缓存

    final LinearLayout layout = (LinearLayout)
                         findViewById(R.id.app_parent_layout);
    layout.setDrawingCacheEnabled(true);
    layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
    
  3. 在活动B中等待其布局完全绘制(这是非常的 重要)。对于活动B的onCreate(),获取mainLayout B,使用ViewTreeObserver在绘制布局时获取回调 完全。

    ViewTreeObserver vto = layout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
      layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      getDrawingBitmap();
     }
    });
    
  4. 现在,在完全绘制布局时会调用getDrawingBitmap()。 截取你的截图。

    public void getDrawingBitmap(){
        LinearLayout mainLayout = (LinearLayout)
                            findViewById(R.id.app_parent_layout);
        Bitmap b = mainLayout.getDrawingCache();
    
        File file = saveBitmapAsFile(b);
    
        Intent resultIntent = new Intent();
        resultIntent.putExtra("FullFileName",file.getAbsolutePath());
        setResult(Activity.RESULT_OK,resultIntent);
        finish();
    }
    

    这里我正在使用位图并将其保存为文件并返回 filename作为结果代码。我相信有更好的发送方法 父节点的位图比保存为文件和发送 文件名。但我还是要求保存位图 一段时间。所以对我来说这是更简单的方法。设定结果后 完成活动。

  5. 现在,在活动A上,onActivityResult()检索文件名。

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if(requestCode == B_REQUEST_CODE){
        if (resultCode == Activity.RESULT_OK) { 
          String newText = data.getStringExtra("FullFileName");
         File dir = new File (newText);
        } 
      }
    }
    

答案 2 :(得分:1)

我认为这样做很难,因为我知道无法控制这些视图的绘图方法,并且除非可见,否则Android操作系统不会绘制它们。

但是,有可能只在很短的时间内将其他视图前景化以填充其绘图缓存。也许它可以在它变得可见之前再次放入背景,因为在平滑的体验中,操作系统似乎在它们实际组成前景之前在屏幕外绘制视图。

另一个技巧可能是将您的前景视图作为子视图附加到背景上,并为其提供非常轻微的Alpha透明度。例如,WebView可以很好地叠加,实际上强制绘制WebView及其背景。也许这也适用于其他观点。

答案 3 :(得分:0)

即时通讯使用这种方式它工作得很好,但有一个问题,我只是第一次拍摄一个布局的快照,当我采取快照,它给了我正确的照片,但经过一些更改,我再次采取它,它给了我以前的快照。

RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview);
    layout.setDrawingCacheEnabled(true);
    layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
    layout.buildDrawingCache();
    Bitmap bitmap = layout.getDrawingCache();

          File file =  new File(Environment.getExternalStorageDirectory().toString() + "/sPenimg.png");
          FileOutputStream ostream;
          try {
              ostream = new FileOutputStream(file);
              bitmap.compress(CompressFormat.PNG, 100, ostream);
              ostream.flush();
              ostream.close();      
          } catch (FileNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }

此问题已解决添加   ((RelativeLayout的)findViewById(R.id.mainview))destroyDrawingCache();