Secure Storage Manager のファイル展開

DataWedge 13.0

概要

このガイドでは、Secure Storage Manager (SSM) を使用して、NG SimulScan テンプレートおよび DataWedge 構成ファイル (.DB) を安全に展開する方法について説明します。これらのファイルは、StageNow を経由して展開するか、あるいはアプリケーション内部でプログラムで展開することができます。

NG SimulScan テンプレート

テンプレート ビルダを使用して NG SimulScan テンプレートを生成した後、以下のいずれかの方法を使用してテンプレートを安全に展開します。

  • Zebra の StageNow ツール
  • アプリケーションからプログラムで

StageNow 経由での展開

StageNowを使用して NG SimulScan テンプレートを安全に展開する方法は以下の通りです。

  1. ホスト コンピュータで StageNow を起動します。

  2. StageNow のホーム画面で、左側のメニューから [新しいプロファイルの作成] をクリックします。画像

  3. MX バージョン 11.3 以降を選択します (これにより、ファイル マネージャの 「ファイルをアプリに展開」 オプションがサポートされます)。デバイスの MX バージョンは、選択したバージョンと一致している必要があります。バージョンの確認方法については、MX のドキュメンテーション をご覧ください。画像

  4. リストから [Xpert モード] を選択し、[作成] をクリックします。 画像

  5. プロファイル名を入力します。[スタート] をクリックします 画像

  6. 下にスクロールし、[FileMgr] の横のプラス記号 (+) をクリックします。これにより、右側の Config タブに [FileMgr] が追加されます。画像

  7. [追加] をクリックします。 画像

  8. FileMgr 設定で、次の項目を入力/選択します。

    • ファイル アクション: アプリケーションのファイルを展開
    • ターゲット アプリケーション フィールドの定義: com.symbol.datawedge/ngsstemplate/TemplateName.xml
      (「TemplateName.xml」をテンプレートの XML ファイル名に置き換えてください。)

    画像

  9. 下にスクロールし、以下を選択します。

    • ソース アクセス方法: デバイス ファイル システム内のファイル

    画像

  10. [ソース パスとファイル名] の隣にある [...] をクリックします。以下の項目を入力/選択し、[OK] をクリックします。

    • ローカル デバイスのメディア タイプ: その他
    • ファイル名を入力します。 /storage/emulated/0/Download/TemplateName.xml
      (「TemplateName.xml」をテンプレートXMLファイル名に置き換えてください。デバイスのストレージ場所 /storage/emulated/0/Download として確認してください。)

    画像

  11. [続行] をクリックします。 画像

  12. [プロファイルの完了] をクリックします。 画像

  13. 展開中はデバイスをネットワークに接続しておく必要があります。NG SimulScan テンプレートをデバイスに展開するためには、目的のツールに基づいて以下のいずれかの方法を使用します。

    • StageNow: StageNow プロファイルからバーコードを生成します。デバイスの StageNow クライアントを開き、バーコードをスキャンします。
    • EMM: StageNow インストールから StageNow XML ファイルをエクスポートします。OEMConfig または MX を使用して XML を送信します。

アプリケーション経由での展開

アプリケーションで NG SimulScan をプログラムで安全に展開するには、以下の手順に従います。

  1. AndroidManifest.xml ファイルに以下の権限を追加します。

    <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.WRITE" />
    <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.READ" />
    
  2. AndroidManifest.xml ファイルに、アプリケーションで SSM を操作できるようにする次のクエリを追加します。

    <queries>
        <package android:name="com.zebra.securestoragemanager" />
        <provider android:authorities="com.zebra.securestoragemanager.securecontentprovider"/>
    </queries>
    
  3. AndroidManifest.xml ファイルで、次のコードを追加して、アプリケーションでファイルに読み取り権限を付与できる FileProvider を定義します。com.your.package.name をアプリケーションの実際のパッケージ名に置き換えます。

    <provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.your.package.name.provider"
    android:exported="false"
    android:grantUriPermissions="true">
        <meta-data 
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
    </provider>
    
  4. アプリケーションプロジェクト内の 「res」 親フォルダにある 「xml」 サブフォルダに、「provider_paths.xml」という名前のファイルを次の内容で追加します。

    <?xml version="1.0" encoding="utf-8"?>
        <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <root-path path="/data/tmp/public" name="public"/>
        <root-path path="/enterprise/usr"  name="user"/>
        <external-path path="." name="external_files"/>
        <files-path path="." name="template"/>
    </paths>
    
  5. アプリケーション プロジェクト内で、「assets」 フォルダ内にディレクトリ (documentCaptureTemplates など) を作成し、このフォルダ内に XML テンプレートをコピーします。画像

  6. アプリケーションで、uploadTemplates() という関数を追加します。この関数は、「assets」 ディレクトリからファイルをコピーし、copy 関数 copyFileViaSSM() を使用してファイルをアップロードします。

    public void uploadTemplates() {
    
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list(ASSET_TEMPLATE_DIR);
    } catch (IOException e) {
        Log.e(TAG, "Failed to get asset file list: " + e.getMessage());
    }
    if (files != null) {
    
        for (String filename : files) {
            InputStream in = null;
            OutputStream out = null;
    
            try {
                in = assetManager.open(ASSET_TEMPLATE_DIR + "/" + filename);
    
                String outDir = getFilesDir().getAbsolutePath() + "/";
    
                File outFile = new File(outDir, filename);
    
                out = new FileOutputStream(outFile);
    
                copyFile(in, out);
                in.close();
                out.flush();
                out.close();
    
                copyFileViaSSM(outFile.getAbsolutePath(), "ngsstemplate");
    
            } 
    
            catch (IOException e) {
                Log.e("tag", "Failed to copy asset file: " + filename, e);
            }
        }
    } 
    
    else {
        Log.d(TAG, "asset file list is null");
    }
    
    } private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
    
    
    }
    
    public void copyFileViaSSM(String sourcePath, String type) {
    File file = new File(sourcePath);
    
    Uri contentUri = FileProvider.getUriForFile(this, this.getPackageName() + ".provider", file);
    
    this.getApplicationContext().grantUriPermission("com.zebra.securestoragemanager", contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); // Needed to grant permission for SSM to read the uri
    
    Uri cpUriQuery = Uri.parse(AUTHORITY_FILE + this.getPackageName());
    
    try {
        ContentValues values = new ContentValues();
        values.put("target_app_package", String.format("{\"pkgs_sigs\": [{\"pkg\":\"%s\",\"sig\":\"%s\"}]}", "com.symbol.datawedge", signature));
        values.put("data_name", String.valueOf(contentUri)); // Passes the content uri as a input source
        values.put("data_type", "3");
        values.put("data_value", "com.symbol.datawedge/" + type + "/" + file.getName()); // Replace “targetPath” with the package name of the target app that is accessing the deployed file (or retrieve the app package using context.getPackageName()) followed by "/" and the full path of the file, e.g. "context.getPackageName()/A.txt"
    
        values.put("data_persist_required", false);
        Uri createdRow = this.getContentResolver().insert(cpUriQuery, values);
        Log.i(TAG, "SSM Insert File: " + createdRow.toString());
    
    } 
    
    catch (Exception e) {
        Log.e(TAG, "SSM Insert File - error: " + e.getMessage() + "\n\n");
    }
    
    
    }
    
  7. uploadTemplates() メソッドを呼び出して、アセット フォルダから DataWedge にテンプレート ファイルをアップロードします。

DataWedge 構成ファイル

DataWedge プロファイル (dwprofile_profilename.db) および/または構成ファイル (datawedge.db) をエクスポートした後、次のいずれかの方法を使用して、ファイルを安全に展開します。

  • Zebra の StageNow ツール
  • アプリケーションからプログラムで

StageNow 経由での展開

StageNow を使用して DataWedge プロファイルまたは設定ファイルを安全に展開するには、次の手順を実行します。

  1. ホスト コンピュータで StageNow を起動します。

  2. StageNow のホーム画面で、左側のメニューから [新しいプロファイルの作成] をクリックします。画像

  3. MX バージョン 11.3 以降を選択します (これにより、ファイル マネージャの 「ファイルをアプリに展開」 オプションがサポートされます)。デバイスの MX バージョンは、選択したバージョンと一致している必要があります。バージョンの確認方法については、MX のドキュメンテーション をご覧ください。画像

  4. リストから [Xpert モード] を選択し、[作成] をクリックします。 画像

  5. プロファイル名を入力します。[スタート] をクリックします 画像

  6. 下にスクロールし、[FileMgr] の横のプラス記号 (+) をクリックします。これにより、右側の Config タブにFileMgr が追加されます。画像

  7. [追加] をクリックします。 画像

  8. FileMgr 設定で、次の項目を入力/選択します。

    • ファイル アクション: アプリケーションのファイルを展開
    • ターゲット アプリケーション フィールドの定義: com.symbol.datawedge/config/datawedge.db

      (プロファイルを展開する場合は、「datawedge.db」 をプロファイルファイル名に置き換えてください。)
    • ソース アクセス方法: デバイス ファイル システム内のファイル

    画像

  9. [ソース パスとファイル名] の隣にある [...] をクリックします。以下の項目を入力/選択し、[OK] をクリックします。

    • ローカル デバイスのメディア タイプ: その他
    • ファイル名を入力します。 /storage/emulated/0/Download/datawedge.db
      (プロファイルを展開する場合は、「datawedge.db」 をプロファイルファイル名に置き換えてください。デバイスのストレージ場所 /storage/emulated/0/Download として確認してください。)

    画像

  10. [続行] をクリックします。 画像

  11. [プロファイルの完了] をクリックします。 画像

  12. 展開中はデバイスをネットワークに接続しておく必要があります。DataWedge 構成ファイルをデバイスに配置するには、目的のツールに基づき、以下の方法のいずれかを使用します。

    • StageNow: StageNow プロファイルからバーコードを生成します。デバイス上の StageNow クライアントを開き、バーコードをスキャンします。
    • EMM: StageNow インストールから StageNow XML ファイルをエクスポートします。OEMConfig または MX を使用して XML を送信します。

アプリケーション経由での展開

DataWedge プロファイルまたは設定ファイルをアプリケーションに安全に配置するには、以下の手順に従います。

  1. AndroidManifest.xml ファイルに以下の権限を追加します。

    <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.WRITE" />
    <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.READ" />
    
  2. AndroidManifest.xml ファイルに、アプリケーションで SSM を操作できるようにする次のクエリを追加します。

    <queries>
        <package android:name="com.zebra.securestoragemanager" />
        <provider android:authorities="com.zebra.securestoragemanager.securecontentprovider"/>
    </queries>
    
  3. AndroidManifest.xml ファイルで、次のコードを追加して、アプリケーションでファイルに読み取り権限を付与できる FileProvider を定義します。「com.your.package.name」 をアプリケーションのパッケージ名に置き換えてください。

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.your.package.name.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
    
  4. アプリケーションプロジェクト内の 「res」 親フォルダにある 「xml」 サブフォルダに、「provider_paths.xml」という名前のファイルを次の内容で追加します。

    <?xml version="1.0" encoding="utf-8"?>
        <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <root-path path="/data/tmp/public" name="public"/>
        <root-path path="/enterprise/usr"  name="user"/>
        <external-path path="." name="external_files"/>
        <files-path path="." name="template"/>
    </paths>
    
  5. アプリケーションプロジェクト内で、「assets」 フォルダ内にディレクトリ (ConfigDBs など) を作成し、このフォルダ内に DataWedge プロファイルまたは構成ファイルをコピーします。画像

  6. アプリケーションで、uploadTemplates() という関数を追加します。この関数は、「assets」 ディレクトリからファイルをコピーし、copy 関数 copyFileViaSSM() を使用してファイルをアップロードします。

    public void uploadConfigDB(boolean isFullDB) {
    
    AssetManager assetManager = getAssets();
    String[] files = null;
    
    try {
        files = assetManager.list(ASSET_DB_DIR);
    } 
    catch (IOException e) {
        Log.e(TAG, "Failed to get asset file list: " + e.getMessage());
    }
    
    if (files != null) {
    
        for (String filename : files) {
    
            if (isFullDB &amp;&amp; filename.equals("datawedge.db"))
            {
                integrateFile(assetManager, filename);
            } 
            else if (!isFullDB &amp;&amp; filename.startsWith("dwprofile_"))
            {
                integrateFile(assetManager, filename);
            }
        }
    } 
    else {
        Log.d(TAG, "asset file list is null");
    }
    
    
    }
    
    private void integrateFile(AssetManager assetManager, String filename) {
        InputStream in = null;
        OutputStream out = null;
    
    try {
        in = assetManager.open(ASSET_DB_DIR + "/" + filename);
    
        String outDir = getFilesDir().getAbsolutePath() + "/";
        File outFile = new File(outDir, filename);
    
        out = new FileOutputStream(outFile);
    
        copyFile(in, out);
        in.close();
        out.flush();
        out.close();
    
        copyFileViaSSM(outFile.getAbsolutePath(), "config");
    
    } 
    catch (IOException e) {
        Log.e("tag", "Failed to copy asset file: " + filename, e);
    }
    
    
    }
    
    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
    }
    
    public void copyFileViaSSM(String sourcePath, String type) {
    
    File file = new File(sourcePath);
    
    Uri contentUri = FileProvider.getUriForFile(this, this.getPackageName() + ".provider", file);
    
    this.getApplicationContext().grantUriPermission("com.zebra.securestoragemanager", contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); // Needed to grant permission for SSM to read the uri
    
    Uri cpUriQuery = Uri.parse(AUTHORITY_FILE + this.getPackageName());
    
    try {
        ContentValues values = new ContentValues();
        values.put("target_app_package", String.format("{\"pkgs_sigs\": [{\"pkg\":\"%s\",\"sig\":\"%s\"}]}", "com.symbol.datawedge", signature));
        values.put("data_name", String.valueOf(contentUri)); // Passes the content uri as a input source
        values.put("data_type", "3");
        values.put("data_value", "com.symbol.datawedge/" + type + "/" + file.getName()); // Replace “targetPath” with the package name of the target app that is accessing the deployed file (or retrieve the app package using context.getPackageName()) followed by "/" and the full path of the file, e.g. "context.getPackageName()/A.txt"
    
        values.put("data_persist_required", false);
        Uri createdRow = this.getContentResolver().insert(cpUriQuery, values);
        Log.i(TAG, "SSM Insert File: " + createdRow.toString());
    
    } 
    catch (Exception e) {
        Log.e(TAG, "SSM Insert File - error: " + e.getMessage() + "\n\n");
    }
    
    
    }
    
  7. uploadConfigDB (boolean isFullDB) メソッドを呼び出して、アセット フォルダから DataWedge に構成 DB ファイルをアップロードします。

    • フル構成 DB をアップロードする場合は、isFullDB パラメータに 「true」 を渡します。
    • プロファイル DB をアップロードする場合は、isFullDB パラメータに 「false」 を渡します。

関連ガイド: