我想编一个应用程序,它可以以编程方式拍摄android设备的全屏截图。如何制作一个应用程序,可以采用编程方式截取android设备的整个屏幕?
我已经做了一些R & D,但它建议只有在根级设备上采取屏幕截图的方法或者在API级别4.0允许访问的设备上才能实现此目的。
已经有一些支付的应用程序,允许在无根设备上截屏。
所以,如果有人建议我如何在没有固定的设备上做到这一点,那就太好了。
在此先感谢。
我想编一个应用程序,它可以以编程方式拍摄android设备的全屏截图。如何制作一个应用程序,可以采用编程方式截取android设备的整个屏幕?
我已经做了一些R & D,但它建议只有在根级设备上采取屏幕截图的方法或者在API级别4.0允许访问的设备上才能实现此目的。
已经有一些支付的应用程序,允许在无根设备上截屏。
所以,如果有人建议我如何在没有固定的设备上做到这一点,那就太好了。
在此先感谢。
我刚刚做了一些类似的用于与社交媒体共享的东西。这里是让我的屏幕快照存储在SD卡上,后来的各种需求使用的代码是:
// image naming and path to include sd card appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + Image;
// create bitmap screen capture
Bitmap bitmap;
View v1 = mCurrentUrlMask.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后,当你需要访问使用这样的事情:
Uri uri = Uri.fromFile(new File(mPath));
使用SDK,您只能截取根视图(及其所有子项)的屏幕截图,这意味着:仅用于您的视图。对话框,吐司,键盘,旋钮和状态栏不会被采用,因为它们不共享相同的视图树。
Play商店有一些应用程序,但它们肯定不是跨平台的。使用固定设备,您可以使用ASL(Android Screenshot Library)通过/ dev/graphics/fb0 framebuffer获取屏幕截图。这将工作得很好,并会产生类似ddms的抓斗。视频硬件叠加层将保持黑色。
我还没有对你提到的那些应用程序进行反向工程,但我相信他们可以识别出你正在使用哪个设备,然后发送截取屏幕截图的密钥(比如音量+下),然后观察SD卡。你可以看到他们需要时间来抓取截图。
TestFairy(http://www.testfairy.com)抓取您的应用程序的整个屏幕,包括opengl表面视图,吐司和对话框。它通过工具完成,并自动执行此操作。
我希望这有助于:)
是否可以通过Open GL实现?因为我对它很陌生,所以我对它没有完美的想法。 –
使用OpenGL,您可以通过glReadPixels接收像素。不幸的是,如果你在这个OpenGL层上有其他视图,你将不得不自己进行混合,因为View.draw会使GL视图保持黑屏。所以做这个或那个很容易。正如我所说,ASL和TestFairy都解决了这个问题。一个需要根,另一个不需要。 – gilm
试试这个
public void shareit()
{
View view = findViewById(R.id.layout);//ur layout id
view.getRootView();
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state))
{
picDir = new File(Environment.getExternalStorageDirectory()+ "/myPic");
if (!picDir.exists())
{
picDir.mkdir();
}
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(true);
Bitmap bitmap = view.getDrawingCache();
// Date date = new Date();
String fileName = "mylove" + ".jpg";
picFile = new File(picDir + "/" + fileName);
try
{
picFile.createNewFile();
FileOutputStream picOut = new FileOutputStream(picFile);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2));
boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut);
if (saved)
{
Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show();
} else
{
//Error
}
picOut.close();
}
catch (Exception e)
{
e.printStackTrace();
}
view.destroyDrawingCache();
} else {
//Error
}
}
能否请你告诉我什么是mCurrentUrlMask? –
你必须得到查看... –
这就是问题我怎么才能得到完整的Android设备屏幕的视图。 –