首页 > 解决方案 > 在后台捕获屏幕截图

问题描述

我正在使用ShotWatch来捕获屏幕截图事件。

包含的示例仅在应用程序内部有效,但我想捕获事件并启动一个活动。我的代码似乎忽略了该服务。

mainfest 定义了所有服务/活动。

主要活动:

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;

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

        this.imageView = findViewById(R.id.imageView);

        // run-time permissions
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
            // You can directly ask for the permission.
            // The registered ActivityResultCallback gets the result of this request.
            Toast.makeText(this, ":(", Toast.LENGTH_LONG).show();
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
        }
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // You can use the API that requires the permission.
            Toast.makeText(this, "OK", Toast.LENGTH_LONG).show();

            startService(new Intent(MainActivity.this, ScreenshotCaptureService.class));
        }
    }
}

截图捕获服务:

public class ScreenshotCaptureService extends Service implements ShotWatch.Listener {
    private ShotWatch shotWatch;

    @Override
    public void onCreate() {
        super.onCreate();

        this.shotWatch = new ShotWatch(getContentResolver(), this);

        this.shotWatch.register();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        this.shotWatch.unregister();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return Service.START_STICKY;
    }

    @Override
    public void onScreenShotTaken(ScreenshotData data) {
        Intent intent = new Intent(this, AddActivity.class);
        intent.putExtra(AddActivity.CAPTURE_PATH, data.getPath());
        startService(intent);
    }
}

添加活动:

public class AddActivity extends AppCompatActivity {
    public static final String CAPTURE_PATH = "ADD_CAPTURE_PATH";

    private ImageButton imageButton;

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

        Uri captura = Uri.fromFile(new File(getIntent().getStringExtra(AddActivity.CAPTURE_PATH)));

        this.imageButton = findViewById(R.id.imageButton);

        this.imageButton.setImageURI(captura);

        this.imageButton.setOnClickListener((View v)->{
            // ...
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != RESULT_OK) return;

        switch (requestCode) {
            // ...
        }
    }
}

标签: androidandroid-studioservice

解决方案


固定的。

我在 ScreenshotCaptureService 上的 onScreenShotTaken 中使用了“startService”而不是“startActivity”。


推荐阅读