У меня есть приложение, которое создает отчет в TableLayout с переменным числом TableRows.Растровые изображения и захват Android
Я использую следующий код, чтобы захватить таблицу в растровое изображение:
TableLayout tl = (TableLayout)findViewById(R.id.CSRTableLayout);
Bitmap csr = Bitmap.createBitmap(tl.getWidth(), tl.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(csr);
tl.draw(canvas);
После того как я захвата экрана как растровое изображение, я прикрепить его к электронной почте с помощью:
//folder already exists
File file = new File(folder.getAbsolutePath()+"/CSR"+csrnum+".jpg");
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
fos=new FileOutputStream(file);
bos=new BufferedOutputStream(fos);
if(bos!=null) {
try {
csr.compress(Bitmap.CompressFormat.JPEG, 60, bos);
} catch (OutOfMemoryError e) {
Toast.makeText(CustomerReportActivity.this, "Out of Memory!", Toast.LENGTH_SHORT).show();
} finally {
fos.flush();
fos.close();
bos.flush();
bos.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
if(file.exists()) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setType("message/rfc822");
String emailTo[] = {"***@****.***"};
i.putExtra(Intent.EXTRA_EMAIL,emailTo);
i.putExtra(Intent.EXTRA_SUBJECT,"...");
i.putExtra(Intent.EXTRA_TEXT, "...");
i.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+file.getAbsolutePath()));
startActivity(i);
} else {
Toast.makeText(CustomerReportActivity.this, "Error attaching report to email!", Toast.LENGTH_SHORT).show();
}
Проблема заключается в том, что иногда таблица может стать довольно большой, например, 1600x2400dp. Я получил OutOfMemoryError в строке «Bitmap.createBitmap (...)» Есть ли альтернативный метод захвата экрана, не переполняя кучу VM? Если я правильно понимаю, вызов Bitmap.createBitmap (...) создает растровое изображение полного размера, который является просто белым. Возможно ли создать его без NO пиксельных данных и заполнить его только после того, как я позвонил csr.compress (...), чтобы он оставался маленьким? Любые идеи/предложения приветствуются! Заранее спасибо!
Я думаю, что это ваш друг http: // stackoverflow.com/questions/5663671/create-a-empty-bitmap-and-drawing-but-canvas-in-android, и я бы рекомендовал использовать Bitmap.Config.ARGB_8 при запуске, а затем обновить его. –
Подробнее об этом http://stackoverflow.com/questions/477572/android-strange-out-of-memory-issue –
попробуйте добавить в файл манифеста –
asenovm