我正在尝试使用 Android 15 (V OS) 中提供的新 api MediaProjectionConfig.createConfigForUserChoice() 构建单个应用程序屏幕录像机应用程序。
MediaProjectionConfig mediaProjectionConfig = MediaProjectionConfig.createConfigForUserChoice(); val requestIntent = mediaProjectionManager != null ? mediaProjectionManager.createScreenCaptureIntent(mediaProjectionConfig) : null;
但我无法这样做并出现以下错误:
09-20 13:22:51.617 515 515 D [ScreenRecorder]:onActivityResult requestCode:777,resultCode:-1,data:Intent {(有额外内容)} .... .... 09-20 13:22:51.624 515 515 E TransactionExecutor: 执行事务失败: tId:-179619724 ClientTransaction{ 09-20 13:22:51.624 515 515 E TransactionExecutor: tId:-179619724 transactionItems=[ 09-20 13:22:51.624 515 515 E TransactionExecutor: tId:-179619724 TopResumedActivityChangeItem{mActivityToken=android.os.BinderProxy@3cc47fb,onTop=true} 09-20 13:22:51.624 515 515 E TransactionExecutor:tId:-179619724 目标活动:com.android.app.screenrecorder.MainActivity 09-20 13:22:51.624 515 515 E TransactionExecutor: tId:-179619724 ActivityResultItem{mActivityToken=android.os.BinderProxy@3cc47fb,resultInfoList=[ResultInfo{who=null, request=777, result=-1, data=Intent {(有额外内容)}}]} 09-20 13:22:51.624 515 515 E TransactionExecutor:tId:-179619724 目标活动:com.android.app.screenrecorder.MainActivity 09-20 13:22:51.624 515 515 E TransactionExecutor:tId:-179619724 ResumeActivityItem {mActivityToken = android.os.BinderProxy@3cc47fb,procState = 2,updateProcState = true,isForward = true,shouldSendCompatFakeFocus = false} 09-20 13:22:51.624 515 515 E TransactionExecutor:tId:-179619724 目标活动:com.android.app.screenrecorder.MainActivity 09-20 13:22:51.624 515 515 E 事务执行器:tId:-179619724] 09-20 13:22:51.624 515 515 E TransactionExecutor: tId:-179619724 } …… …… 09-20 13:22:55.635 453 669 D [ScreenRecorder]:mediaProjectionManager:null
class MainActivity : AppCompatActivity() {
Val TAG = "MainActivity" as String
val SCREEN_RECORD_REQUEST_CODE: Int = 777
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("TAG","MainActivity::onCreate() called.")
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
val displayContext: Context
if (DeviceUtils.isSubDisplayOn(applicationContext)) {
displayContext = ContextUtil.getDisplayContext(applicationContext)
} else {
displayContext = applicationContext
}
mediaProjectionManager = displayContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
MediaProjectionConfig mediaProjectionConfig = MediaProjectionConfig.createConfigForUserChoice();
val permissionIntent = mediaProjectionManager != null ? mediaProjectionManager.createScreenCaptureIntent(mediaProjectionConfig) : null;
startActivityForResult(permissionIntent!!, SCREEN_RECORD_REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (requestCode == SCREEN_RECORD_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
data?.let {
mMediaProjection =
mediaProjectionManager.getMediaProjection()!!
}
Log.d("TAG","mMediaProjection initialised : $mMediaProjection")
}
}
}
}
}
这段代码对我有用,我正在关注: https://medium.com/jamesob-com/recording-your-android-screen-7e0e75aae260
因为我没有看到我想问的代码的其他部分,您是否在清单文件中添加了所需的权限?
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
您是否尝试过直接使用 getSystemService 像这样:
mediaProjectionManager = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
val mediaProjectionConfig = MediaProjectionConfig.createConfigForUserChoice()
if (mediaProjectionManager != null) {
val permissionIntent = mediaProjectionManager.createScreenCaptureIntent(mediaProjectionConfig)
startActivityForResult(permissionIntent, SCREEN_RECORD_REQUEST_CODE)
} else {
Log.e("TAG", "MediaProjectionManager is null")
}