我正在尝试使用离子电容器框架实现一个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()
,你需要活动性。
成功resultCode
onActivityResult()
后,您可以将该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;
}
}
}
}