Exemples de code AndroidAndroid code examples

Cet article explique comment coder des éléments pour la version Android du Kit RMS SDK.This article shows how to code elements for the Android version of the RMS SDK.

Remarque Dans cet article, le terme MSIPC (Microsoft Information Protection and Control) fait référence au processus client.Note In this article, The term MSIPC (Microsoft Information Protection and Control) refers to the client process.

Utilisation de Microsoft Rights Management SDK 4.2 : principaux scénariosUsing the Microsoft Rights Management SDK 4.2 - key scenarios

Ces exemples de code sont tirés d’un exemple d’application plus large représentant des scénarios de développement importants pour votre compréhension de ce Kit SDK.These code samples are taken from a larger sample application representing development scenarios important to your orientation to this SDK. Ils montrent comment utiliser :They show how to use:

  • Le format de fichier protégé de Microsoft, également appelé fichier protégé.The Microsoft Protected File format, also called a protected file.
  • Formats de fichiers protégés personnalisésCustom protected file formats
  • Contrôles d’interface utilisateur (IU) personnalisésCustom user interface (UI) controls

L’exemple d’application MSIPCSampleApp est disponible pour une utilisation avec ce Kit SDK pour le système d’exploitation Android.The MSIPCSampleApp sample application is available for use with this SDK for the Android operating system. Pour plus d’informations, consultez rms-sdk-ui-for-android.To learn more, see rms-sdk-ui-for-android.

Scénario : Consommer un fichier protégé RMSScenario: Consume an RMS protected file

  • Étape 1 : Créer un ProtectedFileInputStream.Step 1: Create a ProtectedFileInputStream.

    Source : MsipcAuthenticationCallback.javaSource: MsipcAuthenticationCallback.java

    Description : instancier un objet ProtectedFileInputStream et implémenter l’authentification du service.Description: Instantiate a ProtectedFileInputStream object and implement service authentication. Utilisez AuthenticationRequestCallback pour obtenir un jeton en passant une instance de AuthenticationRequestCallback, comme le paramètre mRmsAuthCallback, à l’API MSIPC.Use the AuthenticationRequestCallback to get a token by passing an instance of AuthenticationRequestCallback, as the parameter mRmsAuthCallback, to the MSIPC API. Reportez-vous à l’appel à ProtectedFileInputStream.create vers la fin de la section de l’exemple de code suivant.See the call to ProtectedFileInputStream.create near the end of the following example code section.

        public void startContentConsumptionFromPtxtFileFormat(InputStream inputStream)
        {
            CreationCallback<ProtectedFileInputStream> protectedFileInputStreamCreationCallback =
              new CreationCallback<ProtectedFileInputStream>()
            {
                @Override
                public Context getContext()
                {
                   …
               }
    
                @Override
                public void onCancel()
                {
                   …
                }
    
                @Override
                public void onFailure(ProtectionException e)
                {
                   …
                }
    
                @Override
                public void onSuccess(ProtectedFileInputStream protectedFileInputStream)
                {
                   …
                   …
                    byte[] dataChunk = new byte[16384];
                    try
                    {
                        while ((nRead = protectedFileInputStream.read(dataChunk, 0,
                                dataChunk.length)) != -1)
                        {
                            …
                        }
                         …
                        protectedFileInputStream.close();
                    }
                    catch (IOException e)
                    {
                      …
                    }  
              }
            };
            try
            {
               …
                ProtectedFileInputStream.create(inputStream, null, mRmsAuthCallback,
                                                PolicyAcquisitionFlags.NONE,
                                                protectedFileInputStreamCreationCallback);
            }
            catch (com.microsoft.rightsmanagement.exceptions.InvalidParameterException e)
            {
                …
            }
        }
    
  • Étape 2 : Configurer l’authentification à l’aide de la bibliothèque d’authentification Active Directory (ADAL).Step 2: Set up authentication using the Active Directory Authentication Library (ADAL).

    Source : MsipcAuthenticationCallback.java.Source: MsipcAuthenticationCallback.java.

    Description : cette étape utilise la bibliothèque ADAL pour implémenter un AuthenticationRequestCallback avec des exemples de paramètres d’authentification.Description: This step uses ADAL to implement an AuthenticationRequestCallback with example authentication parameters. Pour en savoir plus, consultez la bibliothèque d'authentification Azure AD (ADAL).To learn more, see the Azure AD Authentication Library (ADAL).

``` java
    class MsipcAuthenticationCallback implements AuthenticationRequestCallback
    {

    …

    @Override
    public void getToken(Map<String, String> authenticationParametersMap,
                         final AuthenticationCompletionCallback authenticationCompletionCallbackToMsipc)
    {
        String authority = authenticationParametersMap.get("oauth2.authority");
        String resource = authenticationParametersMap.get("oauth2.resource");
        String userId = authenticationParametersMap.get("userId");
        final String userHint = (userId == null)? "" : userId;
        AuthenticationContext authenticationContext = App.getInstance().getAuthenticationContext();
        if (authenticationContext == null || !authenticationContext.getAuthority().equalsIgnoreCase(authority))
        {
            try
            {
                authenticationContext = new AuthenticationContext(App.getInstance().getApplicationContext(), authority, …);
                App.getInstance().setAuthenticationContext(authenticationContext);
            }
            catch (NoSuchAlgorithmException e)
            {
                …
                authenticationCompletionCallbackToMsipc.onFailure();
            }
            catch (NoSuchPaddingException e)
            {
                …
                authenticationCompletionCallbackToMsipc.onFailure();
            }
       }
        App.getInstance().getAuthenticationContext().acquireToken(mParentActivity, resource, mClientId, mRedirectURI, userId, mPromptBehavior,
                       "&USERNAME=" + userHint, new AuthenticationCallback<AuthenticationResult>()
                        {
                            @Override
                            public void onError(Exception exc)
                            {
                                …
                                if (exc instanceof AuthenticationCancelError)
                                {
                                     …
                                    authenticationCompletionCallbackToMsipc.onCancel();
                                }
                                else
                                {
                                     …
                                    authenticationCompletionCallbackToMsipc.onFailure();
                                }
                            }

                            @Override
                            public void onSuccess(AuthenticationResult result)
                            {
                                …
                                if (result == null || result.getAccessToken() == null
                                        || result.getAccessToken().isEmpty())
                                {
                                     …
                                }
                                else
                                {
                                    // request is successful
                                    …
                                    authenticationCompletionCallbackToMsipc.onSuccess(result.getAccessToken());
                                }
                            }
                        }

                        );
                  }
```
  • Étape 3 : Vérifier l’existence de l’autorisation Edit pour cet utilisateur avec ce contenu via la méthode UserPolicy.accessCheck.Step 3: Check if the Edit right exists for this user with this content via the UserPolicy.accessCheck method.

    Source : TextEditorFragment.javaSource: TextEditorFragment.java

         //check if user has edit rights and apply enforcements
                if (!mUserPolicy.accessCheck(EditableDocumentRights.Edit))
                {
                    mTextEditor.setFocusableInTouchMode(false);
                    mTextEditor.setFocusable(false);
                    mTextEditor.setEnabled(false);
                    …
                }
    

Scénario : Créer un fichier protégé à l’aide d’un modèleScenario: Create a new protected file using a template

Ce scénario commence par obtenir une liste de modèles, sélectionne le premier pour créer une stratégie, puis nous crée et écrit dans le nouveau fichier protégé.This scenario begins with getting a list of templates, selecting the first one to create a policy, then creates and writes to the new protected file.

  • Étape 1 : Afficher la liste de modèles via un objet TemplateDescriptor.Step 1: Get list of templates via a TemplateDescriptor object.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    CreationCallback<List<TemplateDescriptor>> getTemplatesCreationCallback = new CreationCallback<List<TemplateDescriptor>>()
      {
          @Override
          public Context getContext()
          {
              …
          }
    
          @Override
          public void onCancel()
          {
              …
          }
    
          @Override
          public void onFailure(ProtectionException e)
          {
              …
          }
    
          @Override
          public void onSuccess(List<TemplateDescriptor> templateDescriptors)
          {
             …
          }
      };
      try
      {
              …
          mIAsyncControl = TemplateDescriptor.getTemplates(emailId, mRmsAuthCallback, getTemplatesCreationCallback);
      }
      catch (com.microsoft.rightsmanagement.exceptions.InvalidParameterException e)
      {
              …
      }
    
  • Étape 2 : Créer un UserPolicy en utilisant le premier modèle de la liste.Step 2: Create a UserPolicy using the first template in the list.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

      CreationCallback<UserPolicy> userPolicyCreationCallback = new CreationCallback<UserPolicy>()
      {
          @Override
          public Context getContext()
          {
              …
          }
    
          @Override
          public void onCancel()
          {
              …
          }
    
          @Override
          public void onFailure(ProtectionException e)
          {
              …
          }
    
          @Override
          public void onSuccess(final UserPolicy item)
          {
              …
          }
      };
      try
      {
           …
          mIAsyncControl = UserPolicy.create((TemplateDescriptor)selectedDescriptor, mEmailId, mRmsAuthCallback,
                            UserPolicyCreationFlags.NONE, userPolicyCreationCallback);
           …
      }
      catch (InvalidParameterException e)
      {
              …
      }
    
  • Étape 3 : Créer un ProtectedFileOutputStream et y écrire du contenu.Step 3: Create a ProtectedFileOutputStream and write content to it.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    private void createPTxt(final byte[] contentToProtect)
        {
             …
            CreationCallback<ProtectedFileOutputStream> protectedFileOutputStreamCreationCallback = new CreationCallback<ProtectedFileOutputStream>()
            {
                @Override
                public Context getContext()
                {
                 …
                }
    
                @Override
                public void onCancel()
                {
                 …
                }
    
                @Override
                public void onFailure(ProtectionException e)
                {
                 …
                }
    
                @Override
                public void onSuccess(ProtectedFileOutputStream protectedFileOutputStream)
                {
                    try
                    {
                        // write to this stream
                        protectedFileOutputStream.write(contentToProtect);
                        protectedFileOutputStream.flush();
                        protectedFileOutputStream.close();
                        …
                    }
                    catch (IOException e)
                    {
                        …
                    }
                }
            };
            try
            {
                File file = new File(filePath);
                outputStream = new FileOutputStream(file);
                mIAsyncControl = ProtectedFileOutputStream.create(outputStream, mUserPolicy, originalFileExtension,
                        protectedFileOutputStreamCreationCallback);
            }
            catch (FileNotFoundException e)
            {
                 …
            }
            catch (InvalidParameterException e)
            {
                 …
            }
        }
    

Scénario : Ouvrir un fichier protégé personnaliséScenario: Open a custom protected file

  • Étape 1 : Créer un UserPolicy à partir d’un serializedContentPolicy.Step 1: Create a UserPolicy from a serializedContentPolicy.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    CreationCallback<UserPolicy> userPolicyCreationCallbackFromSerializedContentPolicy = new CreationCallback<UserPolicy>()
            {
                @Override
                public void onSuccess(UserPolicy userPolicy)
                {
                  …
                }
    
                @Override
                public void onFailure(ProtectionException e)
                {
                  …
                }
    
                @Override
                public void onCancel()
                {
                  …
                }
    
                @Override
                public Context getContext()
                {
                  …
                }
            };
    
    
    
    
try
{
  ...

  // Read the serializedContentPolicyLength from the inputStream.
  long serializedContentPolicyLength = readUnsignedInt(inputStream);

  // Read the PL bytes from the input stream using the PL size.
  byte[] serializedContentPolicy = new byte[(int)serializedContentPolicyLength];
  inputStream.read(serializedContentPolicy);

  ...

  UserPolicy.acquire(serializedContentPolicy, null, mRmsAuthCallback, PolicyAcquisitionFlags.NONE,
          userPolicyCreationCallbackFromSerializedContentPolicy);
}
catch (com.microsoft.rightsmanagement.exceptions.InvalidParameterException e)
{
  ...
}
catch (IOException e)
{
  ...
}
```
  • Étape 2 : Créer un CustomProtectedInputStream en utilisant le UserPolicy de l’Étape 1.Step 2: Create a CustomProtectedInputStream using the UserPolicy from Step 1.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

      CreationCallback<CustomProtectedInputStream> customProtectedInputStreamCreationCallback = new CreationCallback<CustomProtectedInputStream>()
      {
         @Override
         public Context getContext()
         {
             …
         }
    
         @Override
         public void onCancel()
         {
             …
         }
    
         @Override
         public void onFailure(ProtectionException e)
         {
             …
         }
    
         @Override
         public void onSuccess(CustomProtectedInputStream customProtectedInputStream)
         {
            …
    
             byte[] dataChunk = new byte[16384];
             try
             {
                 while ((nRead = customProtectedInputStream.read(dataChunk, 0, dataChunk.length)) != -1)
                 {
                      …
                 }
                  …
                 customProtectedInputStream.close();
             }
             catch (IOException e)
             {
                …
             }
             …
         }
     };
    
    try
    {
      ...
    
      // Retrieve the encrypted content size.
      long encryptedContentLength = readUnsignedInt(inputStream);
    
      updateTaskStatus(new TaskStatus(TaskState.Starting, "Consuming content", true));
    
      CustomProtectedInputStream.create(userPolicy, inputStream,
                                     encryptedContentLength,
                                     customProtectedInputStreamCreationCallback);
    }
    catch (com.microsoft.rightsmanagement.exceptions.InvalidParameterException e)
    {
      ...
    }
    catch (IOException e)
    {
      ...
    }
    
  • Étape 3 : Lire du contenu provenant de CustomProtectedInputStream dans mDecryptedContent, puis fermer.Step 3: Read content from the CustomProtectedInputStream into mDecryptedContent then close.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    @Override
    public void onSuccess(CustomProtectedInputStream customProtectedInputStream)
    {
      mUserPolicy = customProtectedInputStream.getUserPolicy();
      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    
      int nRead;                      
      byte[] dataChunk = new byte[16384];
    
      try
      {
        while ((nRead = customProtectedInputStream.read(dataChunk, 0,
                                                            dataChunk.length)) != -1)
        {
           buffer.write(dataChunk, 0, nRead);
        }
    
        buffer.flush();
        mDecryptedContent = new String(buffer.toByteArray(), Charset.forName("UTF-8"));
    
        buffer.close();
        customProtectedInputStream.close();
      }
      catch (IOException e)
      {
        ...
      }
    }
    

Scénario : Créer un fichier protégé personnalisé à l’aide d’une stratégie personnaliséeScenario: Create a custom protected file using a custom policy

  • Étape 1 : Avec une adresse e-mail fournie par l’utilisateur, créer un descripteur de stratégie.Step 1: With an email address provided by the user, create a policy descriptor.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    Description : Dans la pratique, les objets suivants sont créés en utilisant des entrées de l’utilisateur à partir de l’interface de l’appareil : UserRights et PolicyDescriptor.Description: In practice, the following objects would be created by using user inputs from the device interface; UserRights and PolicyDescriptor.

      // create userRights list
      UserRights userRights = new UserRights(Arrays.asList("consumer@domain.com"),
        Arrays.asList( CommonRights.View, EditableDocumentRights.Print));
      ArrayList<UserRights> usersRigthsList = new ArrayList<UserRights>();
      usersRigthsList.add(userRights);
    
      // Create PolicyDescriptor using userRights list
      PolicyDescriptor policyDescriptor = PolicyDescriptor.createPolicyDescriptorFromUserRights(
                                                             usersRigthsList);
      policyDescriptor.setOfflineCacheLifetimeInDays(10);
      policyDescriptor.setContentValidUntil(new Date());
    
  • Étape 2 : Créer un UserPolicy personnalisé à partir du descripteur de stratégie selectedDescriptor.Step 2: Create a custom UserPolicy from the policy descriptor, selectedDescriptor.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

       mIAsyncControl = UserPolicy.create((PolicyDescriptor)selectedDescriptor,
         mEmailId, mRmsAuthCallback, UserPolicyCreationFlags.NONE, userPolicyCreationCallback);
    
  • Étape 3 : Créer et écrire du contenu dans CustomProtectedOutputStream, puis fermer.Step 3: Create and write content to the CustomProtectedOutputStream and then close.

    Source : MsipcTaskFragment.javaSource: MsipcTaskFragment.java

    File file = new File(filePath);
        final OutputStream outputStream = new FileOutputStream(file);
        CreationCallback<CustomProtectedOutputStream> customProtectedOutputStreamCreationCallback = new CreationCallback<CustomProtectedOutputStream>()
        {
            @Override
            public Context getContext()
            {
              …
            }
    
            @Override
            public void onCancel()
            {
              …
            }
    
            @Override
            public void onFailure(ProtectionException e)
            {
              …
            }
    
            @Override
            public void onSuccess(CustomProtectedOutputStream protectedOutputStream)
            {
                try
                {
                    // write serializedContentPolicy
                    byte[] serializedContentPolicy = mUserPolicy.getSerializedContentPolicy();
                    writeLongAsUnsignedIntToStream(outputStream, serializedContentPolicy.length);
                    outputStream.write(serializedContentPolicy);
                    // write encrypted content
                    if (contentToProtect != null)
                    {
                        writeLongAsUnsignedIntToStream(outputStream,
                                CustomProtectedOutputStream.getEncryptedContentLength(contentToProtect.length,
                                        protectedOutputStream.getUserPolicy()));
                        protectedOutputStream.write(contentToProtect);
                        protectedOutputStream.flush();
                        protectedOutputStream.close();
                    }
                    else
                    {
                        outputStream.flush();
                        outputStream.close();
                    }
                    …
                }
                catch (IOException e)
                {
                  …
                }
            }
        };
        try
        {
            mIAsyncControl = CustomProtectedOutputStream.create(outputStream, mUserPolicy,
                    customProtectedOutputStreamCreationCallback);
        }
        catch (InvalidParameterException e)
        {
          …
        }
    

CommentairesComments

Avant de transmettre vos commentaires, nous vous demandons de consulter notre règlement interne.Before commenting, we ask that you review our House rules.