CONNECT Player SDK 5 for Android
5.42.x 5.41.x 5.40.x 5.39.x 5.38.x 5.37.x 5.36.x 5.35.x 5.34.x 5.33.x 5.32.x 5.31.x 5.30.x 5.29.x 5.28.x 5.27.x 5.26.x 5.25.x 5.24.x 5.23.x 5.22.x 5.21.x 5.20.x 5.19.x 5.18.x 5.17.x 5.16.x 5.15.x 5.14.x 5.13.x 5.12.x 5.11.x 5.10.x 5.9.x 5.8.x 5.7.x 5.6.x 5.5.x
5.42.x 5.41.x 5.40.x 5.39.x 5.38.x 5.37.x 5.36.x 5.35.x 5.34.x 5.33.x 5.32.x 5.31.x 5.30.x 5.29.x 5.28.x 5.27.x 5.26.x 5.25.x 5.24.x 5.23.x 5.22.x 5.21.x 5.20.x 5.19.x 5.18.x 5.17.x 5.16.x 5.15.x 5.14.x 5.13.x 5.12.x 5.11.x 5.10.x 5.9.x 5.8.x 5.7.x 5.6.x 5.5.x

Adding playback of Widevine encrypted content

To add playback of Widevine encrypted content to the player:

  1. Add the dependency com.google.protobuf:protobuf-lite:3.0.1:

    Groovy
        dependencies {
           implementation fileTree(dir: 'libs', include: ['*.aar'])
           implementation 'androidx.appcompat:appcompat:1.4.1'
           implementation 'com.google.protobuf:protobuf-lite:3.0.1'
         }
    
  2. In the MainActivity.java file, add the following imports :

    Java
        import java.util.HashMap;
        import java.util.Map;
        import nagra.otv.sdk.OTVVideoView;
        import nagra.otv.sdk.drm.OTVHttpMediaDrmCallback;
    
  3. Replace the following code:

    Java
        static final String TAG = "MainActivity";
            private OTVVideoView mOTVVideoView = null;
            private int mPausePos = 0;
            private String mVideoURI = "https://d3bqrzf9w11pn3.cloudfront.net/basic_dash_bbb_clear/bbb_public.mpd";
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                OTVSDK.load(this);
                setContentView(R.layout.activity_main);
                mOTVVideoView = findViewById(R.id.otvVideoView);
            }
    
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.menu_main, menu);
                return true;
            }
    

    With:

    Java
        private OTVVideoView mOTVVideoView = null;
        private int mPausePos = 0;
        private final String STREAM_URI = "https://d3bqrzf9w11pn3.cloudfront.net/basic_dash_bbb_encrypted/bbb_public_android.mpd";
        private final String STREAM_TOKEN = "eyJraWQiOiI4MTI0MjUiLCJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ2ZXIiOiIxLjAiLCJ0eXAiOiJDb250ZW50QXV0aFoiLCJjb250ZW50UmlnaHRzIjpbeyJkdXJhdGlvbiI6NzIwMCwiZGVmYXVsdEtjSWRzIjpbIjAyMDgxMTNlLWU2ZTgtNDI0Mi04NjdjLWQ5NjNmNWQ3ODkyMyJdLCJjb250ZW50SWQiOiI0NjgyZjFkNi05ODIwLTQwNmEtOWJhMC03YzAzZGJjZjE5NmMiLCJzdG9yYWJsZSI6dHJ1ZSwiZW5jcnlwdGlvbk1ldGhvZCI6IlJBV19BRVNfMTI4X0NUUl9DRU5DIiwiZGVmYXVsdFVzYWdlUnVsZXMiOnsibWluTGV2ZWwiOjAsIndhdGVybWFya2luZ0VuYWJsZWQiOnRydWUsImltYWdlQ29uc3RyYWludCI6dHJ1ZSwiaGRjcFR5cGUiOiJUWVBFXzEiLCJ1bmNvbXByZXNzZWREaWdpdGFsQ2FwcGluZ1Jlc29sdXRpb24iOiJOT19SRVNUUklDVElPTlMiLCJ1bnByb3RlY3RlZEFuYWxvZ091dHB1dCI6dHJ1ZSwiYW5hbG9nQ2FwcGluZ1Jlc29sdXRpb24iOiJOT19SRVNUUklDVElPTlMiLCJoZGNwIjp0cnVlLCJkZXZpY2VDYXBwaW5nUmVzb2x1dGlvbiI6Ik5PX1JFU1RSSUNUSU9OUyIsImRpZ2l0YWxPbmx5IjpmYWxzZSwidW5wcm90ZWN0ZWREaWdpdGFsT3V0cHV0Ijp0cnVlfX1dfQ.fZpotjTjiddueE_nPVcON0FnJwBO4FecTcYIoMmocnw,eyJrY0lkcyI6WyIwMjA4MTEzZS1lNmU4LTQyNDItODY3Yy1kOTYzZjVkNzg5MjMiXSwidHlwIjoiSldUIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImFsZyI6ImRpciIsImtpZCI6IjgxMjQyNSJ9..ntJUOAc-g8sXrGLjZhx-MQ.nHnm-aciNeCz6kwUZEjOQgg-1PsLN1Uc8eYihUv_OUK8EaBoFH7JcdIyB9igEFfR9Cufau_5H-EvTdrmws20_ViWKjUTOZmUn7xPQOmwSftb99-rgd3g4QZO0quHIDB5qiBoKmksts8qDbcMZbr_aKMFIOlzNUUcBwiOvmrGyzo.-zTh5sY7tmbe7Ow94EQT9A";
        // The URI for PlayReady servers is different. In the example below replace wvls with prls  
        private final String DRM_URI = "https://vsd02fy1.anycast.nagra.com/VSD02FY1/wvls/contentlicenseservice/v1/licenses";
        private final Map<String, String> DRM_HEADERS = new HashMap<>();
        {
          // Server headers
          // For PlayReady DRM servers, the 'Accept' and 'Content-Type' headers must be set to 'text/xml' instead.
          DRM_HEADERS.put("Accept", "application/octet-stream");
          DRM_HEADERS.put("Content-Type", "application/octet-stream");
          DRM_HEADERS.put("nv-tenant-id", "UEX3XJ0I");
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          mOTVVideoView = findViewById(R.id.otvVideoView);
          mOTVVideoView.setMediaDrmCallback(mDrmCallback);
          mOTVVideoView.setVideoPath(STREAM_URI);
        }
        private OTVHttpMediaDrmCallback mDrmCallback = new OTVHttpMediaDrmCallback(DRM_URI);
        {
          for (Map.Entry<String, String> pair : DRM_HEADERS.entrySet()) {
            mDrmCallback.setKeyRequestProperty(pair.getKey(), pair.getValue());
          }
          mDrmCallback.setKeyRequestProperty("nv-authorizations", STREAM_TOKEN);
          // For PlayReady protected content, un-comment the line below to explicitly specify PlayReady DRM.
          // mDrmCallback.setDrmType(OTVMediaDrmCallback.OTV_DRMTYPE_PLAYREADY);
        }