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>