Intereting Posts
   

截图

我正在开发一个在设备中截取屏幕截图的应用程序。 在这个应用程序中,我们可以在屏幕上绘制任何内容。 为此,我使用Canvas,Paint和Path来执行此操作。

我正在使用此代码截取屏幕截图:

public void saveScreenshot() { if (ensureSDCardAccess()) { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); onDraw(canvas); File file = new File(mScreenshotPath + "/" + System.currentTimeMillis() + ".jpg"); FileOutputStream fos; try { fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.close(); } catch (FileNotFoundException e) { Log.e("Panel", "FileNotFoundException", e); } catch (IOException e) { Log.e("Panel", "IOEception", e); } } } /** * Helper method to ensure that the given path exists. * TODO: check external storage state */ private boolean ensureSDCardAccess() { File file = new File(mScreenshotPath); if (file.exists()) { return true; } else if (file.mkdirs()) { return true; } return false; } 

但是,运行以下行时:

 Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 

我的应用程序因以下exception而关闭:

 11-28 15:05:46.291: E/AndroidRuntime(8209): java.lang.IllegalArgumentException: width and height must be > 0 

如果我更改高度和宽度,则会截取屏幕截图,但它是空的:

空

为什么会这样? 我究竟做错了什么?

你可以这样做,

为您的主布局提供ID并在屏幕上显示内容后,在一些Listener说按钮单击或菜单项或任何此类监听器上写下面的代码(确保在显示布局后调用这些行,否则它将给出一个黑屏)。

  View content = findViewById(R.id.myLayout); content.setDrawingCacheEnabled(true); getScreen(content); 

方法getScreen(内容)

 private void getScreen(View content) { Bitmap bitmap = content.getDrawingCache(); File file = new File("/sdcard/test.png"); try { file.createNewFile(); FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.PNG, 100, ostream); ostream.close(); } catch (Exception e) { e.printStackTrace(); } } 

也不要添加将文件写入SDCard的权限。

   

例外是因为您创建的Bitmap的高度和宽度为零

尝试下面的代码来获得高度和宽度

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); 

如果没有getWindowManager访问权限

 Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); 

需要使用上下文调用getWidth(),getHeight(),如果您在Activity之外尝试它将失败。 尝试使用getApplicationContext.getWidth()。

你能展示一下你的代码吗? 看起来你正在调用宽度和高度没有正整数值。 您可以通过打印宽度和高度值来调试它。

我遇到了类似的问题,解决方案是:

在视图被淹没之前,你会得到宽度和高度,所以首先检查宽度或高度等于零:

 if (getWidth() == 0 || getHeight() == 0) { initRemote(remote); isViewInitialized=false; } 

isViewInitialized是一个成员值。

然后将此代码放在OnSizeChanged中

 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if(!isViewInitialized&&){ // this is the right place to take snapshot :) } } 

我已将截屏代码包装到一个非常简单的库中。 它允许您截取屏幕截图并将其存储到磁盘中(如果需要)。

https://github.com/abdallahalaraby/Blink