ScreenRecorder:如何在服务或IntentService中使用createScreenCaptureInte



我正在尝试使用离子电容器框架实现一个ScreenRecoder应用程序,并实现一个插件,以便能够使用本机代码来完成任务。

我以这个项目为参考:https://github.com/yrom/ScreenRecorder

那里的所有内容都实现到活动组件中,但我不想使用本机 UI,所以我不能像在项目中那样使用活动并将其集成到电容器插件中。

我曾尝试将基本录制功能实现到服务中,但失败了。我发现的最大问题是,如何从服务运行下一行代码:

private void requestMediaProjection() {
Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_MEDIA_PROJECTION);
}

这部分需要onActivityResult来处理它,对吧?

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_MEDIA_PROJECTION) {
// NOTE: Should pass this result data into a Service to run ScreenRecorder.
// The following codes are merely exemplary.
MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
if (mediaProjection == null) {
Log.e("@@", "media projection is null");
return;
}
mMediaProjection = mediaProjection;
mMediaProjection.registerCallback(mProjectionCallback, new Handler());
startCapturing(mediaProjection);
}
}

这样就可以实现初始化MediaProject的请求,并继续下一步startCapture方法,这样设备屏幕就会被记录下来。

有没有人知道如何从服务,IntentService或任何其他方式做到这一点,避免实现本机UI并能够处理startActivityForResult所需的(至少我认为是这样)在捕获意图后继续代码流?

多谢。

你不能在服务中startActivityForResult()onActivityResult(),你需要活动性。

成功resultCodeonActivityResult()后,您可以将该resultIntent发送到Service。然后在服务中,您可以创建并启动mediaProjection

尝试创建透明活动并执行startActivityForResult()调用。在onActivityResult()检查resultCode是否正常,如果正常,您可以将resultIntent发送到服务,然后初始化并在那里启动mediaProjection

毕竟,finish()透明的活动。

public class ProjectionActivity extends AppCompatActivity {
private static final int REQUEST_CODE_MEDIA_PROJECTION = 4578;
public static void requestProjectionIntentActivity(Context ctx) {
Intent pIntent = new Intent(ctx, ProjectionActivity.class);
pIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NO_HISTORY);
ctx.startActivity(pIntent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MediaProjectionManager mgr = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
startActivityForResult(mgr.createScreenCaptureIntent(), REQUEST_CODE_MEDIA_PROJECTION);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_MEDIA_PROJECTION: {
if (resultCode == RESULT_OK) {
//send screen capture intent (data) to service
}
else {
//FAIL
}
finishAndRemoveTask();
break;
}
}
}
}

最新更新