概要
このガイドでは、Secure Storage Manager (SSM) を使用して、NG SimulScan テンプレートおよび DataWedge 構成ファイル (.DB) を安全に展開する方法について説明します。これらのファイルは、StageNow を経由して展開するか、あるいはアプリケーション内部でプログラムで展開することができます。
NG SimulScan テンプレート
テンプレート ビルダを使用して NG SimulScan テンプレートを生成した後、以下のいずれかの方法を使用してテンプレートを安全に展開します。
- Zebra の StageNow ツール
- アプリケーションからプログラムで
StageNow 経由での展開
StageNowを使用して NG SimulScan テンプレートを安全に展開する方法は以下の通りです。
ホスト コンピュータで StageNow を起動します。
StageNow のホーム画面で、左側のメニューから [新しいプロファイルの作成] をクリックします。
MX バージョン 11.3 以降を選択します (これにより、ファイル マネージャの 「ファイルをアプリに展開」 オプションがサポートされます)。デバイスの MX バージョンは、選択したバージョンと一致している必要があります。バージョンの確認方法については、MX のドキュメンテーション をご覧ください。
リストから [Xpert モード] を選択し、[作成] をクリックします。
プロファイル名を入力します。[スタート] をクリックします
下にスクロールし、[FileMgr] の横のプラス記号 (+) をクリックします。これにより、右側の Config タブに [FileMgr] が追加されます。
[追加] をクリックします。
FileMgr 設定で、次の項目を入力/選択します。
- ファイル アクション: アプリケーションのファイルを展開
- ターゲット アプリケーション フィールドの定義:
com.symbol.datawedge/ngsstemplate/TemplateName.xml
(「TemplateName.xml」をテンプレートの XML ファイル名に置き換えてください。)
下にスクロールし、以下を選択します。
- ソース アクセス方法: デバイス ファイル システム内のファイル
[ソース パスとファイル名] の隣にある [...] をクリックします。以下の項目を入力/選択し、[OK] をクリックします。
- ローカル デバイスのメディア タイプ: その他
- ファイル名を入力します。
/storage/emulated/0/Download/TemplateName.xml
(「TemplateName.xml」をテンプレートXMLファイル名に置き換えてください。デバイスのストレージ場所/storage/emulated/0/Download
として確認してください。)
[続行] をクリックします。
[プロファイルの完了] をクリックします。
展開中はデバイスをネットワークに接続しておく必要があります。NG SimulScan テンプレートをデバイスに展開するためには、目的のツールに基づいて以下のいずれかの方法を使用します。
アプリケーション経由での展開
アプリケーションで NG SimulScan をプログラムで安全に展開するには、以下の手順に従います。
AndroidManifest.xml ファイルに以下の権限を追加します。
<uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.WRITE" /> <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.READ" />
AndroidManifest.xml ファイルに、アプリケーションで SSM を操作できるようにする次のクエリを追加します。
<queries> <package android:name="com.zebra.securestoragemanager" /> <provider android:authorities="com.zebra.securestoragemanager.securecontentprovider"/> </queries>
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>
アプリケーションプロジェクト内の 「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>
アプリケーション プロジェクト内で、「assets」 フォルダ内にディレクトリ (documentCaptureTemplates など) を作成し、このフォルダ内に XML テンプレートをコピーします。
アプリケーションで、uploadTemplates() という関数を追加します。この関数は、「assets」 ディレクトリからファイルをコピーし、copy 関数 copyFileViaSSM() を使用してファイルをアップロードします。
public void uploadTemplates() {
} private void copyFile(InputStream in, OutputStream out) throws IOException {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"); }
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"); }
}
uploadTemplates() メソッドを呼び出して、アセット フォルダから DataWedge にテンプレート ファイルをアップロードします。
DataWedge 構成ファイル
DataWedge プロファイル (dwprofile_profilename.db) および/または構成ファイル (datawedge.db) をエクスポートした後、次のいずれかの方法を使用して、ファイルを安全に展開します。
- Zebra の StageNow ツール
- アプリケーションからプログラムで
StageNow 経由での展開
StageNow を使用して DataWedge プロファイルまたは設定ファイルを安全に展開するには、次の手順を実行します。
ホスト コンピュータで StageNow を起動します。
StageNow のホーム画面で、左側のメニューから [新しいプロファイルの作成] をクリックします。
MX バージョン 11.3 以降を選択します (これにより、ファイル マネージャの 「ファイルをアプリに展開」 オプションがサポートされます)。デバイスの MX バージョンは、選択したバージョンと一致している必要があります。バージョンの確認方法については、MX のドキュメンテーション をご覧ください。
リストから [Xpert モード] を選択し、[作成] をクリックします。
プロファイル名を入力します。[スタート] をクリックします
下にスクロールし、[FileMgr] の横のプラス記号 (+) をクリックします。これにより、右側の Config タブにFileMgr が追加されます。
[追加] をクリックします。
FileMgr 設定で、次の項目を入力/選択します。
- ファイル アクション: アプリケーションのファイルを展開
- ターゲット アプリケーション フィールドの定義:
com.symbol.datawedge/config/datawedge.db
(プロファイルを展開する場合は、「datawedge.db」 をプロファイルファイル名に置き換えてください。) - ソース アクセス方法: デバイス ファイル システム内のファイル
[ソース パスとファイル名] の隣にある [...] をクリックします。以下の項目を入力/選択し、[OK] をクリックします。
- ローカル デバイスのメディア タイプ: その他
- ファイル名を入力します。
/storage/emulated/0/Download/datawedge.db
(プロファイルを展開する場合は、「datawedge.db」 をプロファイルファイル名に置き換えてください。デバイスのストレージ場所/storage/emulated/0/Download
として確認してください。)
[続行] をクリックします。
[プロファイルの完了] をクリックします。
展開中はデバイスをネットワークに接続しておく必要があります。DataWedge 構成ファイルをデバイスに配置するには、目的のツールに基づき、以下の方法のいずれかを使用します。
アプリケーション経由での展開
DataWedge プロファイルまたは設定ファイルをアプリケーションに安全に配置するには、以下の手順に従います。
AndroidManifest.xml ファイルに以下の権限を追加します。
<uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.WRITE" /> <uses-permission android:name="com.zebra.securestoragemanager.securecontentprovider.PERMISSION.READ" />
AndroidManifest.xml ファイルに、アプリケーションで SSM を操作できるようにする次のクエリを追加します。
<queries> <package android:name="com.zebra.securestoragemanager" /> <provider android:authorities="com.zebra.securestoragemanager.securecontentprovider"/> </queries>
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>
アプリケーションプロジェクト内の 「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>
アプリケーションプロジェクト内で、「assets」 フォルダ内にディレクトリ (ConfigDBs など) を作成し、このフォルダ内に DataWedge プロファイルまたは構成ファイルをコピーします。
アプリケーションで、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 && filename.equals("datawedge.db")) { integrateFile(assetManager, filename); } else if (!isFullDB && 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"); }
}
uploadConfigDB (boolean isFullDB) メソッドを呼び出して、アセット フォルダから DataWedge に構成 DB ファイルをアップロードします。
- フル構成 DB をアップロードする場合は、isFullDB パラメータに 「true」 を渡します。
- プロファイル DB をアップロードする場合は、isFullDB パラメータに 「false」 を渡します。
関連ガイド: