/** * Try to open a session, do provisioning if necessary. * @param allowProvisioning if provisioning is allowed, set this to false when calling from * processing provision response. * @return true on success, false otherwise. */ private boolean openInternal(boolean allowProvisioning) { if (isOpen()) { // Already opened return true; } try { sessionId = mediaDrm.openSession(); eventDispatcher.dispatch(DefaultDrmSessionEventListener::onDrmSessionAcquired); mediaCrypto = mediaDrm.createMediaCrypto(sessionId); state = STATE_OPENED; return true; } catch (NotProvisionedException e) { if (allowProvisioning) { provisioningManager.provisionRequired(this); } else { onError(e); } } catch (Exception e) { onError(e); } return false; }
@SuppressWarnings("deprecation") public void onMediaDrmEvent(int what) { if (!isOpen()) { return; } switch (what) { case ExoMediaDrm.EVENT_KEY_REQUIRED: doLicense(false); break; case ExoMediaDrm.EVENT_KEY_EXPIRED: // When an already expired key is loaded MediaDrm sends this event immediately. Ignore // this event if the state isn't STATE_OPENED_WITH_KEYS yet which means we're still // waiting for key response. onKeysExpired(); break; case ExoMediaDrm.EVENT_PROVISION_REQUIRED: state = STATE_OPENED; provisioningManager.provisionRequired(this); break; default: break; } }
private void onKeysError(Exception e) { if (e instanceof NotProvisionedException) { provisioningManager.provisionRequired(this); } else { onError(e); } }