FileDocCategorySizeDatePackage
DrmManagerClient.javaAPI DocAndroid 5.1 API34629Thu Mar 12 22:22:30 GMT 2015android.drm

DrmManagerClient

public class DrmManagerClient extends Object
The main programming interface for the DRM framework. An application must instantiate this class to access DRM agents through the DRM framework.

Fields Summary
public static final int
ERROR_NONE
Indicates that a request was successful or that no error occurred.
public static final int
ERROR_UNKNOWN
Indicates that an error occurred and the reason is not known.
public static final int
INVALID_SESSION
{@hide}
android.os.HandlerThread
mInfoThread
android.os.HandlerThread
mEventThread
private static final String
TAG
private final dalvik.system.CloseGuard
mCloseGuard
private static final int
ACTION_REMOVE_ALL_RIGHTS
private static final int
ACTION_PROCESS_DRM_INFO
private int
mUniqueId
private long
mNativeContext
private volatile boolean
mReleased
private android.content.Context
mContext
private InfoHandler
mInfoHandler
private EventHandler
mEventHandler
private OnInfoListener
mOnInfoListener
private OnEventListener
mOnEventListener
private OnErrorListener
mOnErrorListener
Constructors Summary
public DrmManagerClient(android.content.Context context)
Creates a DrmManagerClient.

param
context Context of the caller.

        mContext = context;
        createEventThreads();

        // save the unique id
        mUniqueId = _initialize();
        mCloseGuard.open("release");
    
Methods Summary
private native DrmInfo_acquireDrmInfo(int uniqueId, DrmInfoRequest drmInfoRequest)

private native boolean_canHandle(int uniqueId, java.lang.String path, java.lang.String mimeType)

private native int_checkRightsStatus(int uniqueId, java.lang.String path, int action)

private native DrmConvertedStatus_closeConvertSession(int uniqueId, int convertId)

private native DrmConvertedStatus_convertData(int uniqueId, int convertId, byte[] inputData)

private native DrmSupportInfo[]_getAllSupportInfo(int uniqueId)

private native android.content.ContentValues_getConstraints(int uniqueId, java.lang.String path, int usage)

private native int_getDrmObjectType(int uniqueId, java.lang.String path, java.lang.String mimeType)

private native android.content.ContentValues_getMetadata(int uniqueId, java.lang.String path)

private native java.lang.String_getOriginalMimeType(int uniqueId, java.lang.String path, java.io.FileDescriptor fd)

private native int_initialize()

private native void_installDrmEngine(int uniqueId, java.lang.String engineFilepath)

private native int_openConvertSession(int uniqueId, java.lang.String mimeType)

private native DrmInfoStatus_processDrmInfo(int uniqueId, DrmInfo drmInfo)

private native void_release(int uniqueId)

private native int_removeAllRights(int uniqueId)

private native int_removeRights(int uniqueId, java.lang.String path)

private native int_saveRights(int uniqueId, DrmRights drmRights, java.lang.String rightsPath, java.lang.String contentPath)

private native void_setListeners(int uniqueId, java.lang.Object weak_this)

public DrmInfoacquireDrmInfo(DrmInfoRequest drmInfoRequest)
Retrieves information for registering, unregistering, or acquiring rights.

param
drmInfoRequest The {@link DrmInfoRequest} that specifies the type of DRM information being retrieved.
return
A {@link DrmInfo} instance.

        if (null == drmInfoRequest || !drmInfoRequest.isValid()) {
            throw new IllegalArgumentException("Given drmInfoRequest is invalid/null");
        }
        return _acquireDrmInfo(mUniqueId, drmInfoRequest);
    
public intacquireRights(DrmInfoRequest drmInfoRequest)
Processes a given {@link DrmInfoRequest} and returns the rights information asynchronously.

This is a utility method that consists of an {@link #acquireDrmInfo(DrmInfoRequest) acquireDrmInfo()} and a {@link #processDrmInfo(DrmInfo) processDrmInfo()} method call. This utility method can be used only if the selected DRM plug-in (agent) supports this sequence of calls. Some DRM agents, such as OMA, do not support this utility method, in which case an application must invoke {@link #acquireDrmInfo(DrmInfoRequest) acquireDrmInfo()} and {@link #processDrmInfo(DrmInfo) processDrmInfo()} separately.

param
drmInfoRequest The {@link DrmInfoRequest} used to acquire the rights.
return
ERROR_NONE for success; ERROR_UNKNOWN for failure.

        DrmInfo drmInfo = acquireDrmInfo(drmInfoRequest);
        if (null == drmInfo) {
            return ERROR_UNKNOWN;
        }
        return processDrmInfo(drmInfo);
    
public booleancanHandle(java.lang.String path, java.lang.String mimeType)
Checks whether the given MIME type or path can be handled.

param
path Path of the content to be handled.
param
mimeType MIME type of the object to be handled.
return
True if the given MIME type or path can be handled; false if they cannot be handled.

        if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) {
            throw new IllegalArgumentException("Path or the mimetype should be non null");
        }
        return _canHandle(mUniqueId, path, mimeType);
    
public booleancanHandle(android.net.Uri uri, java.lang.String mimeType)
Checks whether the given MIME type or URI can be handled.

param
uri URI for the content to be handled.
param
mimeType MIME type of the object to be handled
return
True if the given MIME type or URI can be handled; false if they cannot be handled.

        if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) {
            throw new IllegalArgumentException("Uri or the mimetype should be non null");
        }
        return canHandle(convertUriToPath(uri), mimeType);
    
public intcheckRightsStatus(java.lang.String path)
Checks whether the given content has valid rights.

param
path Path to the rights-protected content.
return
An int representing the {@link DrmStore.RightsStatus} of the content.

        return checkRightsStatus(path, DrmStore.Action.DEFAULT);
    
public intcheckRightsStatus(android.net.Uri uri)
Check whether the given content has valid rights.

param
uri URI of the rights-protected content.
return
An int representing the {@link DrmStore.RightsStatus} of the content.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Given uri is not valid");
        }
        return checkRightsStatus(convertUriToPath(uri));
    
public intcheckRightsStatus(java.lang.String path, int action)
Checks whether the given rights-protected content has valid rights for the specified {@link DrmStore.Action}.

param
path Path to the rights-protected content.
param
action The {@link DrmStore.Action} to perform.
return
An int representing the {@link DrmStore.RightsStatus} of the content.

        if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) {
            throw new IllegalArgumentException("Given path or action is not valid");
        }
        return _checkRightsStatus(mUniqueId, path, action);
    
public intcheckRightsStatus(android.net.Uri uri, int action)
Checks whether the given rights-protected content has valid rights for the specified {@link DrmStore.Action}.

param
uri URI for the rights-protected content.
param
action The {@link DrmStore.Action} to perform.
return
An int representing the {@link DrmStore.RightsStatus} of the content.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Given uri is not valid");
        }
        return checkRightsStatus(convertUriToPath(uri), action);
    
public DrmConvertedStatuscloseConvertSession(int convertId)
Informs the DRM plug-in (agent) that there is no more data to convert or that an error has occurred. Upon successful conversion of the data, the DRM agent will provide an offset value indicating where the header and body signature should be added. Appending the signature is necessary to protect the integrity of the converted file.

param
convertId Handle for the conversion session.
return
A {@link DrmConvertedStatus} object that contains the status of the data conversion, the converted data, and the offset for the header and body signature.

        return _closeConvertSession(mUniqueId, convertId);
    
public DrmConvertedStatusconvertData(int convertId, byte[] inputData)
Converts the input data (content) that is part of a rights-protected file. The converted data and status is returned in a {@link DrmConvertedStatus} object. This method should be called each time there is a new block of data received by the application.

param
convertId Handle for the conversion session.
param
inputData Input data that needs to be converted.
return
A {@link DrmConvertedStatus} object that contains the status of the data conversion, the converted data, and offset for the header and body signature. An application can ignore the offset because it is only relevant to the {@link #closeConvertSession closeConvertSession()} method.

        if (null == inputData || 0 >= inputData.length) {
            throw new IllegalArgumentException("Given inputData should be non null");
        }
        return _convertData(mUniqueId, convertId, inputData);
    
private java.lang.StringconvertUriToPath(android.net.Uri uri)
This method expects uri in the following format content://media// (or) file://sdcard/test.mp4 http://test.com/test.mp4 Here shall be "video" or "audio" or "images" the index of the content in given table

        String path = null;
        if (null != uri) {
            String scheme = uri.getScheme();
            if (null == scheme || scheme.equals("") ||
                    scheme.equals(ContentResolver.SCHEME_FILE)) {
                path = uri.getPath();

            } else if (scheme.equals("http")) {
                path = uri.toString();

            } else if (scheme.equals(ContentResolver.SCHEME_CONTENT)) {
                String[] projection = new String[] {MediaStore.MediaColumns.DATA};
                Cursor cursor = null;
                try {
                    cursor = mContext.getContentResolver().query(uri, projection, null,
                            null, null);
                    if (null == cursor || 0 == cursor.getCount() || !cursor.moveToFirst()) {
                        throw new IllegalArgumentException("Given Uri could not be found" +
                                " in media store");
                    }
                    int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
                    path = cursor.getString(pathIndex);
                } catch (SQLiteException e) {
                    throw new IllegalArgumentException("Given Uri is not formatted in a way " +
                            "so that it can be found in media store.");
                } finally {
                    if (null != cursor) {
                        cursor.close();
                    }
                }
            } else {
                throw new IllegalArgumentException("Given Uri scheme is not supported");
            }
        }
        return path;
    
private voidcreateEventThreads()

        if (mEventHandler == null && mInfoHandler == null) {
            mInfoThread = new HandlerThread("DrmManagerClient.InfoHandler");
            mInfoThread.start();
            mInfoHandler = new InfoHandler(mInfoThread.getLooper());

            mEventThread = new HandlerThread("DrmManagerClient.EventHandler");
            mEventThread.start();
            mEventHandler = new EventHandler(mEventThread.getLooper());
        }
    
private voidcreateListeners()

        _setListeners(mUniqueId, new WeakReference<DrmManagerClient>(this));
    
protected voidfinalize()

        try {
            if (mCloseGuard != null) {
                mCloseGuard.warnIfOpen();
            }
            release();
        } finally {
            super.finalize();
        }
    
public java.lang.String[]getAvailableDrmEngines()
Retrieves information about all the DRM plug-ins (agents) that are registered with the DRM framework.

return
A String array of DRM plug-in descriptions.

        DrmSupportInfo[] supportInfos = _getAllSupportInfo(mUniqueId);
        ArrayList<String> descriptions = new ArrayList<String>();

        for (int i = 0; i < supportInfos.length; i++) {
            descriptions.add(supportInfos[i].getDescriprition());
        }

        String[] drmEngines = new String[descriptions.size()];
        return descriptions.toArray(drmEngines);
    
public android.content.ContentValuesgetConstraints(android.net.Uri uri, int action)
Retrieves constraint information for rights-protected content.

param
uri URI for the content from which you are retrieving DRM constraints.
param
action Action defined in {@link DrmStore.Action}.
return
A {@link android.content.ContentValues} instance that contains key-value pairs representing the constraints. Null in case of failure.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Uri should be non null");
        }
        return getConstraints(convertUriToPath(uri), action);
    
public android.content.ContentValuesgetConstraints(java.lang.String path, int action)
Retrieves constraint information for rights-protected content.

param
path Path to the content from which you are retrieving DRM constraints.
param
action Action defined in {@link DrmStore.Action}.
return
A {@link android.content.ContentValues} instance that contains key-value pairs representing the constraints. Null in case of failure. The keys are defined in {@link DrmStore.ConstraintsColumns}.

        if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) {
            throw new IllegalArgumentException("Given usage or path is invalid/null");
        }
        return _getConstraints(mUniqueId, path, action);
    
public intgetDrmObjectType(java.lang.String path, java.lang.String mimeType)
Retrieves the type of rights-protected object (for example, content object, rights object, and so on) using the specified path or MIME type. At least one parameter must be specified to retrieve the DRM object type.

param
path Path to the content or null.
param
mimeType MIME type of the content or null.
return
An int that corresponds to a {@link DrmStore.DrmObjectType}.

        if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) {
            throw new IllegalArgumentException("Path or the mimetype should be non null");
        }
        return _getDrmObjectType(mUniqueId, path, mimeType);
    
public intgetDrmObjectType(android.net.Uri uri, java.lang.String mimeType)
Retrieves the type of rights-protected object (for example, content object, rights object, and so on) using the specified URI or MIME type. At least one parameter must be specified to retrieve the DRM object type.

param
uri URI for the content or null.
param
mimeType MIME type of the content or null.
return
An int that corresponds to a {@link DrmStore.DrmObjectType}.

        if ((null == uri || Uri.EMPTY == uri) && (null == mimeType || mimeType.equals(""))) {
            throw new IllegalArgumentException("Uri or the mimetype should be non null");
        }
        String path = "";
        try {
            path = convertUriToPath(uri);
        } catch (Exception e) {
            // Even uri is invalid the mimetype shall be valid, so allow to proceed further.
            Log.w(TAG, "Given Uri could not be found in media store");
        }
        return getDrmObjectType(path, mimeType);
    
private intgetErrorType(int infoType)

        int error = -1;

        switch (infoType) {
        case DrmInfoRequest.TYPE_REGISTRATION_INFO:
        case DrmInfoRequest.TYPE_UNREGISTRATION_INFO:
        case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO:
            error = DrmErrorEvent.TYPE_PROCESS_DRM_INFO_FAILED;
            break;
        }
        return error;
    
private intgetEventType(int infoType)

        int eventType = -1;

        switch (infoType) {
        case DrmInfoRequest.TYPE_REGISTRATION_INFO:
        case DrmInfoRequest.TYPE_UNREGISTRATION_INFO:
        case DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO:
            eventType = DrmEvent.TYPE_DRM_INFO_PROCESSED;
            break;
        }
        return eventType;
    
public android.content.ContentValuesgetMetadata(java.lang.String path)
Retrieves metadata information for rights-protected content.

param
path Path to the content from which you are retrieving metadata information.
return
A {@link android.content.ContentValues} instance that contains key-value pairs representing the metadata. Null in case of failure.

        if (null == path || path.equals("")) {
            throw new IllegalArgumentException("Given path is invalid/null");
        }
        return _getMetadata(mUniqueId, path);
    
public android.content.ContentValuesgetMetadata(android.net.Uri uri)
Retrieves metadata information for rights-protected content.

param
uri URI for the content from which you are retrieving metadata information.
return
A {@link android.content.ContentValues} instance that contains key-value pairs representing the constraints. Null in case of failure.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Uri should be non null");
        }
        return getMetadata(convertUriToPath(uri));
    
public java.lang.StringgetOriginalMimeType(java.lang.String path)
Retrieves the MIME type embedded in the original content.

param
path Path to the rights-protected content.
return
The MIME type of the original content, such as video/mpeg.

        if (null == path || path.equals("")) {
            throw new IllegalArgumentException("Given path should be non null");
        }

        String mime = null;

        FileInputStream is = null;
        try {
            FileDescriptor fd = null;
            File file = new File(path);
            if (file.exists()) {
                is = new FileInputStream(file);
                fd = is.getFD();
            }
            mime = _getOriginalMimeType(mUniqueId, path, fd);
        } catch (IOException ioe) {
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch(IOException e) {}
            }
        }

        return mime;
    
public java.lang.StringgetOriginalMimeType(android.net.Uri uri)
Retrieves the MIME type embedded in the original content.

param
uri URI of the rights-protected content.
return
MIME type of the original content, such as video/mpeg.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Given uri is not valid");
        }
        return getOriginalMimeType(convertUriToPath(uri));
    
public voidinstallDrmEngine(java.lang.String engineFilePath)
Installs a new DRM plug-in (agent) at runtime.

param
engineFilePath File path to the plug-in file to be installed. {@hide}

        if (null == engineFilePath || engineFilePath.equals("")) {
            throw new IllegalArgumentException(
                "Given engineFilePath: "+ engineFilePath + "is not valid");
        }
        _installDrmEngine(mUniqueId, engineFilePath);
    
public static voidnotify(java.lang.Object thisReference, int uniqueId, int infoType, java.lang.String message)
{@hide}

        DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();

        if (null != instance && null != instance.mInfoHandler) {
            Message m = instance.mInfoHandler.obtainMessage(
                InfoHandler.INFO_EVENT_TYPE, uniqueId, infoType, message);
            instance.mInfoHandler.sendMessage(m);
        }
    
public intopenConvertSession(java.lang.String mimeType)
Initiates a new conversion session. An application must initiate a conversion session with this method each time it downloads a rights-protected file that needs to be converted.

This method applies only to forward-locking (copy protection) DRM schemes.

param
mimeType MIME type of the input data packet.
return
A convert ID that is used used to maintain the conversion session.

        if (null == mimeType || mimeType.equals("")) {
            throw new IllegalArgumentException("Path or the mimeType should be non null");
        }
        return _openConvertSession(mUniqueId, mimeType);
    
public intprocessDrmInfo(DrmInfo drmInfo)
Processes the given DRM information based on the information type.

param
drmInfo The {@link DrmInfo} to be processed.
return
ERROR_NONE for success; ERROR_UNKNOWN for failure.

        if (null == drmInfo || !drmInfo.isValid()) {
            throw new IllegalArgumentException("Given drmInfo is invalid/null");
        }
        int result = ERROR_UNKNOWN;
        if (null != mEventHandler) {
            Message msg = mEventHandler.obtainMessage(ACTION_PROCESS_DRM_INFO, drmInfo);
            result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result;
        }
        return result;
    
public voidrelease()
Releases resources associated with the current session of DrmManagerClient. It is considered good practice to call this method when the {@link DrmManagerClient} object is no longer needed in your application. After release() is called, {@link DrmManagerClient} is no longer usable since it has lost all of its required resource.

        if (mReleased) return;
        mReleased = true;

        if (mEventHandler != null) {
            mEventThread.quit();
            mEventThread = null;
        }
        if (mInfoHandler != null) {
            mInfoThread.quit();
            mInfoThread = null;
        }
        mEventHandler = null;
        mInfoHandler = null;
        mOnEventListener = null;
        mOnInfoListener = null;
        mOnErrorListener = null;
        _release(mUniqueId);
        mCloseGuard.close();
    
public intremoveAllRights()
Removes all the rights information of every DRM plug-in (agent) associated with the DRM framework. Will be used during a master reset.

return
ERROR_NONE for success; ERROR_UNKNOWN for failure.

        int result = ERROR_UNKNOWN;
        if (null != mEventHandler) {
            Message msg = mEventHandler.obtainMessage(ACTION_REMOVE_ALL_RIGHTS);
            result = (mEventHandler.sendMessage(msg)) ? ERROR_NONE : result;
        }
        return result;
    
public intremoveRights(java.lang.String path)
Removes the rights associated with the given rights-protected content.

param
path Path to the rights-protected content.
return
ERROR_NONE for success; ERROR_UNKNOWN for failure.

        if (null == path || path.equals("")) {
            throw new IllegalArgumentException("Given path should be non null");
        }
        return _removeRights(mUniqueId, path);
    
public intremoveRights(android.net.Uri uri)
Removes the rights associated with the given rights-protected content.

param
uri URI for the rights-protected content.
return
ERROR_NONE for success; ERROR_UNKNOWN for failure.

        if (null == uri || Uri.EMPTY == uri) {
            throw new IllegalArgumentException("Given uri is not valid");
        }
        return removeRights(convertUriToPath(uri));
    
public intsaveRights(DrmRights drmRights, java.lang.String rightsPath, java.lang.String contentPath)
Saves rights to a specified path and associates that path with the content path.

Note: For OMA or WM-DRM, rightsPath and contentPath can be null.

param
drmRights The {@link DrmRights} to be saved.
param
rightsPath File path where rights will be saved.
param
contentPath File path where content is saved.
return
ERROR_NONE for success; ERROR_UNKNOWN for failure.
throws
IOException If the call failed to save rights information at the given rightsPath.

        if (null == drmRights || !drmRights.isValid()) {
            throw new IllegalArgumentException("Given drmRights or contentPath is not valid");
        }
        if (null != rightsPath && !rightsPath.equals("")) {
            DrmUtils.writeToFile(rightsPath, drmRights.getData());
        }
        return _saveRights(mUniqueId, drmRights, rightsPath, contentPath);
    
public synchronized voidsetOnErrorListener(android.drm.DrmManagerClient$OnErrorListener errorListener)
Registers an {@link DrmManagerClient.OnErrorListener} callback, which is invoked when the DRM framework sends error information.

param
errorListener Interface definition for the callback.

        mOnErrorListener = errorListener;
        if (null != errorListener) {
            createListeners();
        }
    
public synchronized voidsetOnEventListener(android.drm.DrmManagerClient$OnEventListener eventListener)
Registers an {@link DrmManagerClient.OnEventListener} callback, which is invoked when the DRM framework sends information about DRM processing.

param
eventListener Interface definition for the callback.

        mOnEventListener = eventListener;
        if (null != eventListener) {
            createListeners();
        }
    
public synchronized voidsetOnInfoListener(android.drm.DrmManagerClient$OnInfoListener infoListener)
Registers an {@link DrmManagerClient.OnInfoListener} callback, which is invoked when the DRM framework sends status or warning information during registration or rights acquisition.

param
infoListener Interface definition for the callback.

        mOnInfoListener = infoListener;
        if (null != infoListener) {
            createListeners();
        }