我想編一個應用程序,它可以以編程方式拍攝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設備屏幕的視圖。 –