Lire la capture d'écran de la console kotlin.UninitializedPropertyAccessException: sur com.videoplayer.VideoPlayerActivity.onStart (VideoPlayerActivity.kt: 224) à android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1395) à android.app.Activity.performStart (Activity.java:7361) à android.app.ActivityThread.handleStartActivity (ActivityThread.java:3163) à android.app.servertransaction.TransactionExecutor.performLifecycleSequence (TransactionExecutor.java:180) à android.app.servertransaction.TransactionExecutor.cycleToPath (TransactionExecutor.java:165) à android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:142) à android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:70) à android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1970)

Définition de variables

private var captionIconVisibility: Boolean = false
    private  var videoStarted: Boolean=false
    private  var lastItemPosition: Int = 1
    private  var itemsCount: Int = 1
    private var videoWatchedTime: Long=0
    private var isPreparing: Boolean=true
    private lateinit var currentPlayingPlayList: List<ObjectVideo>
    private lateinit var sharedPrefMemory: SharedPrefMemory
    private lateinit var mCastApplication: CastApplication
    private lateinit var player: SimpleExoPlayer
    private var isAdPlaying: Boolean =false
    private lateinit var mediaPlayer: MediaPlayer
  //  private lateinit var dtm: DTM
    private lateinit var adPlayerManger: AdPlayerManger
    private var podSize = 1
    private var adType = "midroll"
    private var videoPaused: Boolean = false
    private lateinit var objectVideo: ObjectVideo
    var currentPlayingVodPosition = 0
    private var previousVideoPositionNumber=-1
    private var playBackPosition:Long=0
    private var numberOfVideoWatched: Int=0
    private var isCaptionsOff : Boolean = false
    private var isInfoLayoutVisible:Boolean = false
    private lateinit var binding: ActivityVideoPlayerBinding
    private lateinit var videoPlayerActivityVM: VideoPlayerActvityVM
    private var midAdPositionList = ArrayList<Long>()
    private var runnable: Runnable? = null
    private val mHandler: Handler = Handler()
    private var watchedVideoStatus: HashMap<String, Long>? = null
    private lateinit var bottomSheetBehavior :BottomSheetBehavior<View>
    private lateinit var bottomSheetRv: RecyclerView
    private lateinit var bottomSheetPlaylistAdapter: BottomSheetPlaylistAdapter
    private var bottomSheetList = ArrayList<ObjectVideo>()
    private var resumedPosition:Long=0
    private var pageNumber:Int =1
    private var url : String = ""
    private var isPreviousClicked: Boolean = false
    private lateinit var mDetector: GestureDetectorCompat
    private lateinit var vods:ArrayList<ObjectVideo>

    companion object {
         var dtm:DTM = DTM()
      //    var vods: ArrayList<ObjectVideo> = ArrayList()
    }

Ma méthode OnCreate

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_video_player)

        // flags to make media player screen full screen
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        bottomSheetBehavior = BottomSheetBehavior.from(binding.bottomsheetView.bottomSheetLayout)
        bottomSheetRv = binding.bottomsheetView.bottomSheetRv


        sharedPrefMemory = SharedPrefMemory(this, Context.MODE_PRIVATE, true)

//        val mToolbar = binding.toolbarMediaPlayer as Toolbar
//        setSupportActionBar(mToolbar)
//        supportActionBar!!.setDisplayShowTitleEnabled(false)

        val intentObj = intent
      //  dtm = intentObj.getSerializableExtra("dtm") as DTM

      try {
          vods = dtm.videoArrayList

          bottomSheetList = vods
          currentPlayingVodPosition = dtm.position
          Log.d("loggingurl",vods[currentPlayingVodPosition].videoUrl);
          url = dtm.url
          if (!(vods.size>0 && currentPlayingVodPosition<vods.size)){
              finish()

          }
          binding.movie = vods[currentPlayingVodPosition]
          mediaPlayer = PlayerBuilder.getMediaPlayer(this, dtm, vods)
          objectVideo = vods[currentPlayingVodPosition]

      }
      catch (e:java.lang.Exception){
          Toast.makeText(this,"Something went wrong",Toast.LENGTH_SHORT).show()
      }

        bottomSheetBehaviorCallbacks()
        binding.infoImg.setOnClickListener(this)
        binding.repeatImg.setOnClickListener(this)
        binding.captionImg.setOnClickListener(this)


        videoPlayerActivityVM = ViewModelProviders.of(this)[VideoPlayerActvityVM::class.java]

        videoPlayerActivityVM.getMoreVideosList().observe(this, androidx.lifecycle.Observer<List<ObjectVideo>> { moreVideosList ->
            if (moreVideosList.isNotEmpty()) {
                bottomSheetList.addAll(moreVideosList)
                bottomSheetPlaylistAdapter.notifyDataSetChanged()
                mediaPlayer.updatePlayList(moreVideosList)
            } else {
                GlobalObject.hasMoreDataMap[url] = false
            }


        })

        mCastApplication = CastApplication(this, this)
        mCastApplication.createSessionManager()

Voici ma méthode OnStart

 override fun onStart() {
        super.onStart()
        Log.d("LifeCycle", "OnStart is called")
        if (true) {
            player = mediaPlayer.getPlayer()
            isCaptionsOff = sharedPrefMemory.subtitlePreference
            updateCaption()
            player.addListener(this)
            binding.exoPlayerView.player = player
            binding.exoPlayerView.setOnClickListener(this)

            //var pos:Long=0

            mediaPlayer.playVideo(dtm.position,videoPlayerActivityVM.getSeekTime(objectVideo,videoPaused,resumedPosition))

            setBottomSheetPlayList()

            videoPaused = false

        }
    }
1
Wahdat Kashmiri 15 avril 2020 à 18:50

2 réponses

Meilleure réponse

Je n'ai pas de numéros de ligne donc je ne fais que deviner ici.

Jetez un œil à onCreate:

try {
    vods = dtm.videoArrayList
    // ...
    mediaPlayer = PlayerBuilder.getMediaPlayer(this, dtm, vods)
    objectVideo = vods[currentPlayingVodPosition]
} catch (e: Exception) {
      Toast.makeText(this,"Something went wrong",Toast.LENGTH_SHORT).show()
}

Donc, quand PlayerBuilder.getMediaPlayer(this, dtm, vods) ou quoi que ce soit avant échoue

  1. mediaPlayer reste non initialisé,
  2. l'utilisateur reçoit un toast mais vous, en tant que développeur, ne recevez aucun rapport d'exception,
  3. player = mediaPlayer.getPlayer() se produit pendant onStart ce qui provoque un plantage car (1).

Je n'ai pas de solution pour vous, le code est énorme, difficile à lire et difficile à raisonner. Bonne chance pour le réparer.

1
Eugen Pechanec 15 avril 2020 à 17:31

Cette erreur signifie qu'un property avec lateinit a été accédé avant d'être initialisé.

Sur la base du code que vous avez fourni, je ne peux pas dire de quel champ il s'agit, mais à la ligne 224, vérifiez la propriété à laquelle vous accédez car elle n'est pas encore définie.

0
jbarat 15 avril 2020 à 16:26