打开透明活动并截图

时间:2018-11-25 18:05:08

标签: android android-intent android-activity android-bitmap

我想截取设备当前屏幕的屏幕快照(不生根)。因此,我正在打开一个透明的活动来截屏,以便获取当前设备屏幕的截屏。但是我收到如下所述的错误。

P.S:如果将takeScreen()方法放在MainActivity类中,则可以获取屏幕快照。但是我不要。

MainActivity.java

public class MainActivity extends Activity {
    Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
    }

    public void btn_1(View view) {
        Intent mainIntent = new Intent(this, transparentActivity.class);
        startActivity(mainIntent);
    }
}

transparentActivity.java

public class transparentActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.transparent_layout);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Bitmap image = takeScreen();
    }

    public Bitmap takeScreen() {
        View v1 = getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);
        return bitmap;
    }
}

main_layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <Button xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/button1"
        style="?android:attr/buttonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="center_horizontal|center"
        android:layout_marginStart="235dp"
        android:layout_marginBottom="99dp"
        android:onClick="btn_1"
        android:text="Button 1" />
</RelativeLayout>

transparent_layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">

</android.support.constraint.ConstraintLayout>

AndroidManifest.xml

    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

<activity
    android:name=".transparentActivity"
    android:exported="true"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

运行代码时出现以下错误。

java.lang.RuntimeException: Unable to start activity ComponentInfo{transparentActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference

2 个答案:

答案 0 :(得分:1)

您的方法不会在透明活动后面截取屏幕截图,因为该方法仅保存垂直视图或布局的内容,而不是您在屏幕上实际看到的内容。

因此,请尝试按照评论中的建议使用Media Projection API-https://developer.android.com/reference/android/media/projection/package-summary

对于错误部分,请单击android studio中的错误消息-这会将光标移至发生错误的行,并希望您能迅速得出结论。

答案 1 :(得分:-1)

您收到该错误,因为您试图在活动完成之前获取活动的宽度和高度。您需要在活动完成后使用不可见的按钮或其他方式触发它。

顺便说一句,您不能使用生命周期来触发您的屏幕截图操作,因为我已经尝试过并给出与您相同的错误。而且需要注意的是,即使它可以截取屏幕截图,结果也将是黑色的,我不知道为什么,但是我的想法是,即使我们可以将其视为透明的,它本身也是活动的。