Fix offline playback using widevine sample player

Previously the sample player relied on implementation
details of FileDescriptor.toString() to get the low
level int file descriptor, which changed in N release.
This updates the sample player to use a more reliable
method.

bug: 26422357
Change-Id: I73cc759542994a352eae646a3872ee1125445739
This commit is contained in:
Jeff Tinker
2016-04-01 18:04:22 -07:00
parent 0e929c2ec7
commit ad8e58f6f7
2 changed files with 15 additions and 14 deletions

View File

@@ -5,6 +5,8 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_DEX_PREOPT := false
LOCAL_PACKAGE_NAME := WidevineSamplePlayer
LOCAL_JAVA_LIBRARIES := org.apache.http.legacy

View File

@@ -4,15 +4,12 @@
package com.widevine.demo;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.File;
import java.util.EventListener;
import java.util.Set;
import android.util.Log;
import android.content.ContentValues;
import android.content.Context;
import android.drm.DrmErrorEvent;
import android.drm.DrmEvent;
import android.drm.DrmInfo;
@@ -20,6 +17,8 @@ import android.drm.DrmInfoEvent;
import android.drm.DrmInfoRequest;
import android.drm.DrmManagerClient;
import android.drm.DrmStore;
import android.os.ParcelFileDescriptor;
import android.util.Log;
public class WidevineDrm {
@@ -133,12 +132,12 @@ public class WidevineDrm {
return rightsAcquisitionInfo;
}
public DrmInfoRequest getDrmInfoRequest(String assetUri, FileDescriptor fd) {
public DrmInfoRequest getDrmInfoRequest(String assetUri, ParcelFileDescriptor pfd) {
DrmInfoRequest rightsAcquisitionInfo = getDrmInfoRequest(assetUri);
if (fd.valid()) {
rightsAcquisitionInfo.put("FileDescriptorKey", fd.toString());
if (pfd.getFileDescriptor().valid()) {
rightsAcquisitionInfo.put("FileDescriptorKey", Integer.toString(pfd.getFd()));
}
return rightsAcquisitionInfo;
@@ -147,11 +146,11 @@ public class WidevineDrm {
public boolean isProvisionedDevice() {
if (mWVDrmInfoRequestStatusKey == DEVICE_IS_PROVISIONED)
logMessage("Device is provisioined\n");
logMessage("Device is provisioned\n");
else if (mWVDrmInfoRequestStatusKey == DEVICE_IS_PROVISIONED_SD_ONLY)
logMessage("Device is provisioined SD only\n");
logMessage("Device is provisioned SD only\n");
else if (mWVDrmInfoRequestStatusKey == DEVICE_IS_NOT_PROVISIONED)
logMessage("Device is not provisioined\n");
logMessage("Device is not provisioned\n");
else
logMessage("Invalid provisioned status=" + mWVDrmInfoRequestStatusKey +"\n");
@@ -183,10 +182,10 @@ public class WidevineDrm {
int rights = 0;
if (assetUri.startsWith("/sdcard")) {
try {
FileInputStream fis = new FileInputStream(assetUri);
FileDescriptor fd = fis.getFD();
rights = mDrmManager.acquireRights(getDrmInfoRequest(assetUri, fd));
fis.close();
int mode = ParcelFileDescriptor.parseMode("r");
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(assetUri), mode);
rights = mDrmManager.acquireRights(getDrmInfoRequest(assetUri, pfd));
pfd.close();
}
catch (java.io.IOException e) {
logMessage("Unable to acquire rights for '" + assetUri + ": File I/O error'\n");