拍摄任何屏幕的截屏

时间:2014-07-29 20:34:09

标签: android screenshot

我使用以下代码拍摄当前活动的屏幕截图:

View rootview = findViewById(android.R.id.content).getRootView();
rootview.setDrawingCacheEnabled(true);

将图像保存在SD卡上。

但是我试图截取不仅仅是这个应用程序的截图,但是在这个应用程序之外,我做了一些研究,发现它只能用ROOTED设备,但有没有办法我们可以拍摄任何屏幕的屏幕截图而不需要设备生根吗?

5 个答案:

答案 0 :(得分:3)

尝试使用反射从PhoneWindowManager.java Refer to this link

调用takeScreenshot()

请参阅here

中的以下代码

为PhoneWindowManger执行此操作。

TelephonyManager telephony = (TelephonyManager) 
  context.getSystemService(Context.TELEPHONY_SERVICE);  
  try {
      Log.v(TAG, "Get getTeleService...");
      Class c = Class.forName(telephony.getClass().getName());
      Method m = c.getDeclaredMethod("getITelephony");
      m.setAccessible(true);
      telephonyService = (ITelephony) m.invoke(telephony);
      telephonyService.silenceRinger();
      Log.v(TAG, "Answering Call now...");
      telephonyService.answerRingingCall();
      Log.v(TAG, "Call answered...");
      //telephonyService.endCall();
  } catch (Exception e) {
   e.printStackTrace();
   Log.e(TAG,
           "FATAL ERROR: could not connect to telephony subsystem");
   Log.e(TAG, "Exception object: " + e);
  }

Android L提供API来捕获screenshot.refer - https://developer.android.com/reference/android/media/projection/package-summary.html

答案 1 :(得分:1)

您对READ_FRAME_BUFFER权限感兴趣:http://developer.android.com/reference/android/Manifest.permission.html#READ_FRAME_BUFFER

问题在于它明确指出:"不适用于第三方应用程序。"

你运气不好。这是一项安全功能(不允许任何应用程序截取其他应用程序的屏幕截图),但不会消失。您将被限制为root设备。

答案 2 :(得分:1)

以下代码允许我的屏幕截图存储在SD卡上,以后用于满足您的任何需求:

// image naming and path  to include sd card  appending name you choose for file

String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND;   

// 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));

答案 3 :(得分:0)

取决于您的目的。如果您的应用程序中需要该功能分发到Playstore,那么您就没有运气了。没有root权限,根本不可能。

但是,出于测试或个人目的,adb会提供帮助。你发送 一些数据包到你机器的adb服务器,你可以检索设备的屏幕截图。

为此,您应该读出adb client <-> server protocolframebuffer协议对你来说似乎很完美。

或者如果您熟悉node.js,adbkit将节省您的时间。

答案 4 :(得分:0)