android - 在后台捕获屏幕截图
问题描述
我正在使用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) {
// ...
}
}
}
解决方案
固定的。
我在 ScreenshotCaptureService 上的 onScreenShotTaken 中使用了“startService”而不是“startActivity”。
推荐阅读
- java - 使用多边形创建形状无法正常工作 Java3d
- msmq - Microsoft 消息队列,系统时间为 2038 时未收到消息
- css - 如何在 nextcloud/vue 应用中使用谷歌字体
- cassandra - 一台 DC 停止同步。日志中的错误
- android - Android Instant 应用程序,为什么这些限制谁可以打开它们
- python - 用作类对象时出现 tkinter Listbox 错误
- ios - Facebook for Unity SDK (iOS) - 未找到 FBSDKCoreKit-Swift.h
- z3 - Z3Py:如何设置在 List 中声明的布尔变量?
- node.js - 使用 Node.Js 使用 shell 命令打开文件
- recharts - Recharts:堆叠多轴可能吗?