屏幕截图另存为空白图片[Android]

时间:2018-10-05 19:04:18

标签: android camera android-camera screenshot camera-view

我正在尝试制作一个“相机”应用程序,该应用程序不过是一个全屏取景器,当用户单击屏幕上的任何位置时,它将通过屏幕截图捕获图像。我知道这会拍出可怕的照片,但是我有一个非常特定的用例,要求将其作为屏幕截图。

我的问题是该应用正在保存一个完全空白的图像。我已请求并授予WRITE_EXTERNAL_STORAGE和CAMERA运行时权限,因此我认为我的问题可能与获取错误的视图有关。

这是我的activity_fullscreen.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.cameraview.CameraView
        android:id="@+id/camera"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:keepScreenOn="true"
        app:autoFocus="true"
        app:aspectRatio="4:3"
        app:facing="back"
        app:flash="auto"/>

</FrameLayout>

以下是截屏时使用的一些方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fullscreen);
    mCameraView = findViewById(R.id.camera);
    if (mCameraView != null) {
        mCameraView.addCallback(mCallback);
    }

    mContentView = findViewById(R.id.camera);
    mContentView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            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(Bitmap.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);
    }
}

0 个答案:

没有答案