Android realizes long screen capture function

  • 2021-12-11 09:01:16
  • OfStack

In this paper, we share the specific code of Android to realize the long screen capture function for your reference. The specific contents are as follows

1. MainActivity


public class MainActivity extends AppCompatActivity {
  ScrollView scrollView;
  String sdRoot = Environment.getExternalStorageDirectory().getPath();
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    scrollView = (ScrollView) findViewById(R.id.scroll);
    // Authority 
    int permission_write= ContextCompat.checkSelfPermission(this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int permission_read=ContextCompat.checkSelfPermission(this,
        Manifest.permission.READ_EXTERNAL_STORAGE);
    if(permission_write!= PackageManager.PERMISSION_GRANTED
        || permission_read!=PackageManager.PERMISSION_GRANTED){
      Toast.makeText(this, " Requesting permission ", Toast.LENGTH_SHORT).show();
      // Apply for permission, and customize the signature as 1 You can make relevant judgments during callback 
      ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},1);
    }
  }

  @Override
  public void onWindowFocusChanged(boolean hasFocus) {
    shootScrollView(scrollView, "sdRoot");

//    takeScreenshot();
    super.onWindowFocusChanged(hasFocus);
  }

  @Override
  protected void onResume() {
    super.onResume();
  }

  /**
   *  Interception scrollview Screen of 
   * **/
  public static Bitmap getScrollViewBitmap(ScrollView scrollView, String picpath) {
    int h = 0;
    Bitmap bitmap;
    //  Get listView Actual height 
    for (int i = 0; i < scrollView.getChildCount(); i++) {
      h += scrollView.getChildAt(i).getHeight();
      scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));
    }
    Log.d(TAG, " Actual height :" + h);
    Log.d(TAG, "  Height :" + scrollView.getHeight());
    //  Object of the corresponding size bitmap
    bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
        Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    scrollView.draw(canvas);
    //  Test output 
    FileOutputStream out = null;
    try {
      out = new FileOutputStream(picpath);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    try {
      if (null != out) {
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
      }
    } catch (IOException e) {
    }
    Log.d("TAG", "getScrollViewBitmap() returned: " + bitmap.getHeight());
    return bitmap;
  }

  private static String TAG = "Listview and ScrollView item  Screenshot :";

  /**
   *  Screenshot listview
   * **/
  public static Bitmap getListViewBitmap(ListView listView, String picpath) {
    int h = 0;
    Bitmap bitmap;
    //  Get listView Actual height 
    for (int i = 0; i < listView.getChildCount(); i++) {
      h += listView.getChildAt(i).getHeight();
    }
    Log.d(TAG, " Actual height :" + h);
    Log.d(TAG, "list  Height :" + listView.getHeight());
    //  Object of the corresponding size bitmap
    bitmap = Bitmap.createBitmap(listView.getWidth(), h,
        Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    listView.draw(canvas);
    //  Test output 
    FileOutputStream out = null;
    try {
      out = new FileOutputStream(picpath);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    try {
      if (null != out) {
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
      }
    } catch (IOException e) {
    }
    return bitmap;
  }

  //  Program entry   Interception ScrollView
  public static void shootScrollView(ScrollView scrollView, String picpath) {
//    ScreenShot.savePic(getScrollViewBitmap(scrollView, picpath), picpath);
    ScreenShot.saveMyBitmap(getScrollViewBitmap(scrollView, picpath), picpath);
  }

  //  Program entry   Interception ListView
  public static void shootListView(ListView listView, String picpath) {
    ScreenShot.savePic(getListViewBitmap(listView,picpath), picpath);
  }

  private void takeScreenshot() {
    Date now = new Date();
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);

    try {
      // image naming and path to include sd card appending name you choose for file
      String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";

      // create bitmap screen capture
      View v1 = getWindow().getDecorView().getRootView();
      v1.setDrawingCacheEnabled(true);
      Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
      v1.setDrawingCacheEnabled(false);

      File imageFile = new File(mPath);

      FileOutputStream outputStream = new FileOutputStream(imageFile);
      int quality = 100;
      bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
      outputStream.flush();
      outputStream.close();

      openScreenshot(imageFile);
    } catch (Throwable e) {
      // Several error may come out with file handling or OOM
      e.printStackTrace();
    }
  }

  private void openScreenshot(File imageFile) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(imageFile);
    intent.setDataAndType(uri, "image/*");
    startActivity(intent);
  }
}

2.ScreenShot


public class ScreenShot{
  //  Gets the specified Activity Screenshot of, save to png Documents 
  public static Bitmap takeScreenShot(Activity activity) {
    // View You need a screenshot View
    View view = activity.getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b1 = view.getDrawingCache();

    //  Get the height of the status bar 
    Rect frame = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;
    System.out.println(statusBarHeight);

    //  Get screen length and height 
    int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    int height = activity.getWindowManager().getDefaultDisplay()
        .getHeight();
    //  Remove the title bar 
    // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
    Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
        - statusBarHeight);
    view.destroyDrawingCache();
    return b;
  }

  //  Save to sdcard
  public static void savePic(Bitmap b, String strFileName) {
    FileOutputStream fos = null;
    Log.d("TAG", "savePic() returned: " );
    try {
      fos = new FileOutputStream(strFileName);
      if (null != fos) {
        b.compress(Bitmap.CompressFormat.PNG, 90, fos);
        Log.d("TAG", "savePic() returned:  " + b.getHeight());
        fos.flush();
        fos.close();
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  //  Program entry   Intercept the current screen 
  public static void shootLoacleView(Activity a, String picpath) {
    ScreenShot.savePic(ScreenShot.takeScreenShot(a), picpath);
  }

  /**
   *  Save bitmap To SD Card 
   * @param bitName  Saved name 
   * @param mBitmap  Picture object 
   * return  Generate the picture path after compressing the picture 
   */
  @SuppressLint("SdCardPath")
  public static String saveMyBitmap(Bitmap mBitmap, String bitName) {
    String path = Environment.getExternalStorageDirectory()+"/"+bitName+".png";
    File f = new File(path);

    try {
      f.createNewFile();
    } catch (IOException e) {
      System.out.println(" Error saving picture: " + e.toString());
    }
    FileOutputStream fOut = null;
    try {
      fOut = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    try {
      mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
    } catch (Exception e) {
      return "create_bitmap_error";
    }
    try {
      fOut.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      fOut.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
//    File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");
//    FileOutputStream out = null;
//    try {
//      out = new FileOutputStream(file);
//      mBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
//      System.out.println("___________ Preserved __sd___ Under _______________________");
//    } catch (FileNotFoundException e) {
//      e.printStackTrace();
//    }
//    try {
//      out.flush();
//      out.close();
//    } catch (IOException e) {
//      e.printStackTrace();
//    }
    return path;
  //  Toast.makeText(HahItemActivity.this," Saved to "+Environment.getExternalStorageDirectory()+" Under ", Toast.LENGTH_SHORT).show();
  }
}

3.xml


<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/scroll"
  tools:context=".MainActivity">

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
  </LinearLayout>

</ScrollView>

Related articles: