尝试为单个应用程序屏幕捕获配置媒体投影时获取 mediaProjectionManager : null

问题描述 投票:0回答:1

我正在尝试使用 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")
                }
            }
        }
    }

 }
android screen-recording android-mediaprojection mediaprojectionmanager
1个回答
0
投票

这段代码对我有用,我正在关注: 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")
}
© www.soinside.com 2019 - 2024. All rights reserved.