我正在使用此帖How to programmatically take a screenshot in Android?中接受的答案中描述的方法截取屏幕截图。我改变该方法只是因为我没有使用该帖子中使用的public static void
方法,因为我只需要将图像文件存储在存储空间中,而我不需要立即打开它。
我将此方法用作android:largeHeap="true"
方法,因为我需要在我的应用的几个部分中使用它。
问题是我有内存泄漏,使用5-6次后,我得到了这种类型的错误:
java.lang.OutOfMemoryError:无法分配3686412字节 分配899204个空闲字节和878KB直到OOM
我尝试通过在manifest.xml.
文件中设置 Canvas bitmapCanvas = new Canvas(bitmap);
bitmap.eraseColor(Color.TRANSPARENT);
bitmapCanvas.setBitmap(null);
bitmapCanvas = null;
bitmap.recycle();
来增加可用内存的解决方案。但这只会将误差推迟2-3倍。
我还尝试首先清除位图,然后通过添加以下内容来回收它:
outputStream.flush();
outputStream.close();
之前和之后
public static void takeScreenshot(View v1, File f, Context context) {
Date now = new Date();
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
try {
String mPath = f.getPath();
// create bitmap screen capture
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);
//trying to release memory
Canvas bitmapCanvas = new Canvas(bitmap);
bitmap.eraseColor(Color.TRANSPARENT);
bitmapCanvas.setBitmap(null);
bitmapCanvas = null;
bitmap.recycle();
outputStream.flush();
outputStream.close();
} catch (Throwable e) {
// Several error may come out with file handling or OOM
e.printStackTrace();
Toast.makeText(context, "An error occurred!" + e.getMessage().toString() , Toast.LENGTH_LONG).show();
}
}
但没有任何改变。有什么建议吗?
PS这是完整的方法:
Commonmethods
以下是我如何调用它(该方法放在名为 View v1 = getWindow().getDecorView().getRootView();
File imagefile = new File(Environment.getExternalStorageDirectory().getPath() + "/my_files/" + "screenshot.png");
CommonMethods.takeScreenshot(v1, imagefile, this);
response
答案 0 :(得分:0)
我通过更改流的位置并添加了bitmap.recycle(),然后将其指定为null并且找不到任何内存泄漏来尝试对代码进行微小更改。
您的屏幕截图代码工作正常......
我正在附加我在android studio中尝试过的代码片段供您参考。还附上记忆日志
请检查捕获快照后发生的事情
package com.fun.test;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void capture(View view) {
View v1 = getWindow().getDecorView().getRootView();
File imagefile = new File(Environment.getExternalStorageDirectory().getPath()+ "/screenshot.png");
try {
imagefile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
takeScreenshot(v1, imagefile, this);
}
public void takeScreenshot(View v1, File f, Context context) {
Date now = new Date();
android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
try {
String mPath = f.getPath();
// create bitmap screen capture
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();
//trying to release memory
/*Canvas bitmapCanvas = new Canvas(bitmap);
bitmap.eraseColor(Color.TRANSPARENT);
bitmapCanvas.setBitmap(null);
bitmapCanvas = null;*/
bitmap.recycle();
bitmap = null;
} catch (Throwable e) {
// Several error may come out with file handling or OOM
e.printStackTrace();
Toast.makeText(context, "An error occurred!" + e.getMessage().toString() , Toast.LENGTH_LONG).show();
}
}
}
这是android studio的内存分配日志
10-09 19:08:17.195 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 6 mFalseSizeCnt:0
10-09 19:08:17.275 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 245K, 23% free 7702K/9884K, paused 62ms, total 63ms
10-09 19:08:17.285 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.386MB for 2073616-byte allocation
10-09 19:08:17.295 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 5K, 19% free 9722K/11912K, paused 16ms, total 16ms
10-09 19:08:17.335 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:08:17.335 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9722K/11912K, paused 2ms+16ms, total 38ms
10-09 19:08:17.335 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 27ms
10-09 19:08:17.345 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.359MB for 2073616-byte allocation
10-09 19:08:17.355 28618-28627/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:08:17.365 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11747K/13940K, paused 26ms, total 26ms
10-09 19:08:37.085 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 3 mFalseSizeCnt:0
10-09 19:08:37.105 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 8126K, 23% free 7698K/9884K, paused 19ms, total 19ms
10-09 19:08:37.115 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.382MB for 2073616-byte allocation
10-09 19:08:37.125 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 9723K/11912K, paused 14ms, total 14ms
10-09 19:08:37.145 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:08:37.145 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9723K/11912K, paused 3ms+2ms, total 20ms
10-09 19:08:37.145 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 10ms
10-09 19:08:37.145 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.360MB for 2073616-byte allocation
10-09 19:08:37.165 28618-28627/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:08:37.165 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11748K/13940K, paused 12ms, total 12ms
10-09 19:08:51.208 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 3 mFalseSizeCnt:0
10-09 19:08:51.228 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 8124K, 23% free 7698K/9884K, paused 20ms, total 20ms
10-09 19:08:51.238 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.382MB for 2073616-byte allocation
10-09 19:08:51.248 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 9723K/11912K, paused 15ms, total 15ms
10-09 19:08:51.268 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:08:51.268 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9723K/11912K, paused 2ms+1ms, total 19ms
10-09 19:08:51.268 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 11ms
10-09 19:08:51.268 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.360MB for 2073616-byte allocation
10-09 19:08:51.288 28618-28618/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:08:51.288 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11748K/13940K, paused 13ms, total 13ms
10-09 19:08:58.676 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 4 mFalseSizeCnt:0
10-09 19:08:59.516 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 2 mFalseSizeCnt:0
10-09 19:08:59.546 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 8123K, 23% free 7698K/9884K, paused 19ms, total 20ms
10-09 19:08:59.546 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.382MB for 2073616-byte allocation
10-09 19:08:59.566 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 9723K/11912K, paused 15ms, total 15ms
10-09 19:08:59.586 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:08:59.586 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9723K/11912K, paused 3ms+2ms, total 19ms
10-09 19:08:59.586 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 10ms
10-09 19:08:59.586 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.360MB for 2073616-byte allocation
10-09 19:08:59.606 28618-28627/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:08:59.606 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11748K/13940K, paused 16ms, total 16ms
10-09 19:09:08.085 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 5 mFalseSizeCnt:0
10-09 19:09:09.066 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 3 mFalseSizeCnt:0
10-09 19:09:09.096 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 8123K, 23% free 7698K/9884K, paused 18ms, total 18ms
10-09 19:09:09.096 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.382MB for 2073616-byte allocation
10-09 19:09:09.116 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 9723K/11912K, paused 15ms, total 15ms
10-09 19:09:09.136 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:09:09.136 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9723K/11912K, paused 3ms+1ms, total 20ms
10-09 19:09:09.136 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 11ms
10-09 19:09:09.136 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.360MB for 2073616-byte allocation
10-09 19:09:09.156 28618-28627/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:09:09.156 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11748K/13940K, paused 15ms, total 15ms
10-09 19:09:16.163 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 2 mFalseSizeCnt:0
10-09 19:09:18.605 28618-28618/com.fun.test D/GestureDetector: [Surface Touch Event] mSweepDown False, mLRSDCnt : -1 mTouchCnt : 4 mFalseSizeCnt:0
10-09 19:09:18.645 28618-28618/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed 8123K, 23% free 7698K/9884K, paused 31ms, total 31ms
10-09 19:09:18.645 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 11.383MB for 2073616-byte allocation
10-09 19:09:18.655 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 19% free 9723K/11912K, paused 15ms, total 15ms
10-09 19:09:18.685 28618-28622/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=4194304, min=1048576, ut=568
10-09 19:09:18.685 28618-28622/com.fun.test D/dalvikvm: GC_CONCURRENT freed <1K, 19% free 9723K/11912K, paused 3ms+1ms, total 21ms
10-09 19:09:18.685 28618-28618/com.fun.test D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 12ms
10-09 19:09:18.685 28618-28618/com.fun.test I/dalvikvm-heap: Grow heap (frag case) to 13.360MB for 2073616-byte allocation
10-09 19:09:18.695 28618-28627/com.fun.test E/dalvikvm: adjustAdaptiveCoef max=6291456, min=1572864, ut=368
10-09 19:09:18.695 28618-28627/com.fun.test D/dalvikvm: GC_FOR_ALLOC freed <1K, 16% free 11748K/13940K, paused 14ms, total 14ms