android截取屏幕截图

Kri*_*dra 19 android screenshot off-screen android-activity

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

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

Kan*_*dha 14

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

 View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
Run Code Online (Sandbox Code Playgroud)

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

我觉得这对你很有帮助......


Kri*_*dra 5

好吧,我已经实现了我想要的.这些是我使用的步骤.

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

    Intent bIntent = new Intent(A.this,B.class);
    startActivityForResult(bIntent,B_REQUEST_CODE);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在onCreate of activity B中,使用B的mainLayout并启用其绘图缓存

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

    ViewTreeObserver vto = layout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
      layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      getDrawingBitmap();
     }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,我将位图和保存为文件并返回文件名作为结果代码.我确信有更好的方法将位图发送到父活动,而不是保存为文件和发送文件名.但无论如何我有一个要求保存位图的要求.所以对我来说这是更简单的方法.设置结果完成活动后.

  5. 现在,在Activity 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);
        } 
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)