安卓中的屏幕截图

11

我想开发一个应用程序,可以对Android屏幕进行截屏。有人知道如何做吗? 这类似于koushik duttas的截屏,但不需要root权限。 有人有正在运行的koushik dutta屏幕截图应用程序吗? 它对我来说无法工作,请告诉我,谢谢。

4个回答

19

假设你点击了一个按钮:

findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
       Bitmap bitmap = takeScreenshot();
       saveBitmap(bitmap);
   }
});

之后您需要这两种方法:

public Bitmap takeScreenshot() {
   View rootView = findViewById(android.R.id.content).getRootView();
   rootView.setDrawingCacheEnabled(true);
   return rootView.getDrawingCache();
}

 public void saveBitmap(Bitmap bitmap) {
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }
}

1
你应该使用CompressFormat.PNG而不是CompressFormat.JPG,因为要保存的文件是.png格式吗?(或者将文件名更改为.jpg) - joshaidan
这只是一个基本的代码示例。您可以使用任何您想要的! :) - Kristijan Drača
2
我只是想说,你的文件名是“screenshot.png”,但使用的压缩格式是CompressFormat.JPEG。不一致。 - joshaidan
@joshaidan 如果你想的话,你可以去编辑他的回答 :) - fedmich
请注意,此解决方案有时会返回缓存的图像(当单击按钮时,不一定是“当前”屏幕)。请参阅我的答案,以了解更为稳定的方法。 - zpr
我认为这个解决方案是对应用程序进行截屏,而不是整个屏幕,这意味着如果启动应用程序是半透明的,则不会显示其他应用程序的内容,也不会截取通知栏。 - AlikElzin-kilaka

4
你可以尝试像这样做:
private RelativeLayout view;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    view = (RelativeLayout)findViewById(R.id.relativeView);

    View v1 = view.getRootView();

    v1.setDrawingCacheEnabled(true);
    Bitmap bm = v1.getDrawingCache();
}

3

方法 view.getDrawingCache() 首先尝试检索其先前缓存的图像。如果你想保证你的屏幕截图是最新的,这可能会导致问题。例如,如果用户单击了屏幕截图按钮,然后更改了 UI,然后再次单击它,则第二个屏幕截图将与第一个相同,除非你清除缓存。我发现以下方法更方便:

public Bitmap takeScreenshot() {
  View rootView = findViewById(android.R.id.content).getRootView();
  Bitmap bitmap = Bitmap.createBitmap(rootView.getWidth(), rootView.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(bitmap);
  rootView.draw(canvas);
  return bitmap;
}

0

我认为没有root或SDK是不可能的,抱歉。

我很乐意被证明是错误的。

虽然不是一个应用程序,但如果您有USB电缆,您可以在PC上安装Android SDK并使用androidscreencast从PC上截屏,而无需对手机进行root。


你好Nichola,感谢您的回复。那么您有任何在已root手机上运行的工作源代码吗?因为Koushik Duttas的代码对我来说不起作用。 - Sri Sri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接