Huvle SDK 연동 메뉴얼1. Android Studio1-1. Library Module Import1-2. Library Path 설정2. AndroidManifest 설정2-1. Single Instance2-2. usesCleartextTraffic2-3. Permission2-4. Application3. 프로가드 설정4. Huvle SDK 연동4-1. Huvle SDK 연동 API4-2. Huvle SDK 연동 API 호출4-3. Huvle SDK 실행 5. Video Guide
Import Module 메뉴를 통해 [Stealthaddplatformbrowser_lib] 모듈을 추가합니다.
Import한 모듈을 메인 App 과 연동하기 위하여 Project Structure 창을 실행합니다.
Modules
항목에서 app
메뉴를
선택합니다.
app
모듈 선택 후 Project Structure
창의 오른쪽 상단 Dependencies
탭을 선택합니다.
Dependencies 탭 선택 후 오른쪽 상단 +
버튼을 선택하여 앞서 Import한 Module을 추가합니다.
[Stealthaddplatformbrowser_lib] Module을 선택 후 OK
버튼을
선택합니다.
OK
버튼을 선택합니다.
모듈 추가 후 Build 메뉴의 Rebuild Project
메뉴를 선택하여 Project를 Rebuild합니다.
Huvle Library Project를 정상적으로 import한 후 dependencies
영역에 implementation 되었으나
AndroidManifest.xml
및 MainActivity
에서 Huvle Library를 참조할 수 없을
경우build.gradle(Module:app)
파일의 dependencies
영역에 Huvle Library
프로젝트에서 사용중인 jar
파일의 경로를 추가합니다.
Example Library Path 설정[build.gradle(Module:app)/dependencies
]
x...
dependencies {
...
//-- include project path/lib
implementation fileTree(dir: '../Stealthaddplatformbrowser_lib_sw_3.0.17/libs', include: ['*.jar'])
implementation project(path: ':Stealthaddplatformbrowser_lib_sw_3.0.17')
...
}
...
앱사의 폴더 구조 및 Library 버전에 맞게 Library Path를 설정해주셔야합니다.
Huvle 브라우저 실행 후 브라우저가 정상 종료되지 않은 상태에서 귀사의 앱을 실행하였을 경우 귀사의 MainActivity가 아닌 Huvle 브라우저가 실행될 수 있습니다.
EX )
Sigle Instance
및clearTaskOnLaunch
속성 미 적용 시
- Huvle 브라우저 실행
- 홈 버튼 선택
- 귀사의 앱 실행
- 귀사의 앱이 아닌 Huvle 브라우저가 실행됨.
귀사의 앱을 실행하였을 경우 항상 귀사의 앱이 실행될 수 있도록 MainActivity
에 android:launchMode="singleInstance"
및 android:clearTaskOnLaunch="true"
정보를 추가합니다.
Example Code [AndroidManifest.xml
]
android:launchMode="singleInstance"
android:clearTaskOnLaunch="true"
<application
.... >
...
<activity
android:name=".MainActivity"
android:launchMode="singleInstance"
android:clearTaskOnLaunch="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
</application>
<action android:name="android.intent.action.MAIN" />
으로 실행되는 Activity에 추가하셔야합니다.
귀사의 Application이 Target SDK Version
26 이상일 경우 Huvle 브라우저 실행 시 https
가 아닌 http
웹 페이지를 로드할 수 없는 문제점이 발생합니다. 이러한 문제점을 해결하기 위해서는 AndroidManifest.xml
파일의
application
속성 정보에 android:userCleartextTraffic
속성을
true
로 설정해주어야합니다.
Example Code [AndroidManifest.xml
]
...
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
...
* target이 Android Q(29)인경우 아래 코드를 <application>에 추가로 추가해 주세요.(차후 대응버전 출시예정)
Huvle 브라우저에서 사용되는 Permission은 아래와 같으며, 아래의 Permission 정보를 모두 추가해주셔야 합니다.
Example Code [AndroidManifest.xml
]
x
...
<!-- Start Huvle Permission -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- Target SDK Version 28 이상일 경우에만 아래의 Permission 추가하세요.
(Target SDK 28이하는 아래의 Permission이 필요하지 않습니다.) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- End Huvle Permission -->
...
Huvle SDK 내부에서 사용중인 Component
정보는 아래와 같습니다.
귀사의 AndroidManifest.xml
의 <application>
영역에 모든
Component
정보를 추가해주셔야합니다.
3.0.17
버전을 기준으로 application 영역의 내용이 일부 변경되었습니다.앱 업데이트 시 변경된 사항을 꼭 확인 바랍니다.
Example Code [AndroidManifest.xml
]
...
<!-- Start Huvle Library -->
<activity android:name="com.byappsoft.sap.browser.Sap_MainActivity" android:clearTaskOnLaunch="true" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" android:finishOnTaskLaunch="true" android:label="@string/app_name" android:launchMode="singleTask" android:theme="@style/SapLightTheme" android:exported="false"><intent-filter><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="android.intent.category.BROWSABLE" /><category android:name="android.intent.category.APP_BROWSER" /></intent-filter></activity>
<activity android:name="com.byappsoft.sap.browser.utils.Sap_IncognitoActivity" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" android:label="@string/app_name" android:launchMode="singleTask" android:theme="@style/SapDarkTheme" android:windowSoftInputMode="stateHidden" android:exported="false"><intent-filter><action android:name="android.intent.action.INCOGNITO" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
<activity android:name="com.byappsoft.sap.browser.Sap_BrowserSearchActivity" android:theme="@android:style/Theme.NoTitleBar" />
<activity android:name="com.byappsoft.sap.launcher.Sap_act_middle" android:theme="@android:style/Theme.Dialog" android:launchMode="singleTask"/>
<activity android:name="com.byappsoft.sap.browser.Sap_SettingsActivity" android:clearTaskOnLaunch="true" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" android:launchMode="singleTask" android:label="@string/cmn_setting" android:theme="@android:style/Theme.NoTitleBar" ><intent-filter><action android:name="android.intent.action.SETTINGS" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
<activity android:name="com.byappsoft.sap.browser.Sap_AdvancedSettingsActivity" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" android:label="@string/advanced" android:theme="@android:style/Theme.NoTitleBar" ><intent-filter><action android:name="android.intent.action.ADVANCED_SETTINGS" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
<activity android:name="com.byappsoft.sap.browser.download.Sap_DownloadActivity" android:theme="@android:style/Theme.NoTitleBar" />
<activity android:name="com.byappsoft.sap.browser.Sap_HistoryBookmarksActivity" android:theme="@android:style/Theme.NoTitleBar" />
<activity android:name="com.byappsoft.sap.browser.Sap_SettingDownActivity" android:theme="@android:style/Theme.NoTitleBar" />
<activity android:name="com.byappsoft.sap.browser.pageinfo.Sap_PageInfoActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar" />
<activity android:name="com.byappsoft.sap.browser.Sap_QRCodeListActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar"/>
<activity android:name="com.byappsoft.sap.zxing.client.android.CaptureActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysHidden" ><intent-filter><action android:name="com.byappsoft.sap.zxing.client.android.SCAN" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
<activity android:name="com.byappsoft.sap.browser.Sap_BrowserUtils" android:excludeFromRecents="true" android:theme="@style/browser_util_style" android:exported="false" />
<service android:name="com.byappsoft.sap.service.HuvleNotiBarService" />
<service android:name="com.byappsoft.sap.utils.Sap_act_noti_background" />
<service android:name="com.byappsoft.sap.service.BaseRequestService" />
<service android:name="com.byappsoft.sap.cApp.CAppService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" />
<receiver android:name="com.byappsoft.sap.utils.Sap_act_noti_receiver" android:exported="true" />
<receiver android:name="com.byappsoft.sap.utils.Sap_act_receiver" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" ><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><action android:name="com.byappsoft.Stealthaddplatform.noti" /><action android:name="android.intent.action.MY_PACKAGE_REPLACED" /></intent-filter></receiver>
<!-- END Huvle Library -->
...
귀사의 앱 프로젝트에서 프로가드를 사용하고 있다면 아래와 같이 proguard-rules.pro
파일에 Huvle SDK를 예외처리합니다.
Example Code [proguard-rules.pro
]
...
-keep class com.byappsoft.sap.**{*;}
...
Sap_act_main_launcher.class
Type | Definition |
---|---|
Context | this Context 정보는 getApplicationContext( )가 아닌 MainActivity의 this로 명시해주셔여합니다. |
String | Agent Key 에이전트 키 정보는 네트워크사에게 문의해주시거나 단독 앱사의 경우 agent.huvle.com에서 회원 가입 시 사용하셨던 아이디와 동일하게 입력하시면됩니다. |
Boolean | Notibar Status 알람 영역에 노출되는 허블 노티바 사용 여부에 관한 설정 값입니다. (Default : true) |
Boolean | Searchbar Status 허블 브라우저 검색 창 사용 여부에 관한 설정 값입니다. (Default :true) |
Huvle SDK 연동 API를 호출하기 위해서는 파일 읽고/쓰기 권한을 필수 권한으로 받아야합니다.
MainActivity
의 onCreate(
)
메서드 내에서 파일 읽고/쓰기 권한이 있는지 확인 후 권한이 없을 경우 권한을 요청해야합니다.
MainActivity
의 onResume()
메서드 내에서
파일 읽고/쓰기 권한이 있을 경우 Huvle 연동 API를 호출해야 합니다.
Example Code[MainActivity.java
]
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//- 필수 권한 확인
if(checkPermission()==false) {
requestSapPermissions();
}
}
protected void onResume() {
super.onResume();
//-- 필수 권한 확인
if(checkPermission()) {
//-- Change your Agent Code
Sap_act_main_launcher.initsapStart(this, "bynetwork", true, true);
}
}
private boolean checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{
return false;
}
}
return true;
}
private void requestSapPermissions() {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
}
} catch (Exception e) {
}
}
...
파일 읽고/쓰기 권한이 필수인 이유
파일 읽고/쓰기 권한 정보가 필수 권한인 이유는 한 디바이스에 Huvle SDK가 연동된 앱이 다수 설치될 경우 Huvle Noti-bar 중복 노출 방지를 위하여 연동된 Package 정보를 파일 형태로 관리하고 있습니다.
또한, 유저가 Huvle 브라우저 내의 설정 정보를 변경했을 경우 연동된 앱과 무관하게 Huvle 브라우저 내에서 항상 동일한 설정 정보를 갖을 수 있도록 브라우저의 설정 정보를 파일 형태로 관리하고 있습니다.
Huvle Library 연동 후 귀사의 Application 실행 시 아래와 같은 시나리오로 Huvle SDK의 Noti-bar가 생성됩니다.
4-3-1. 권한 획득 프로세스[MainActivity:onCreate( )
]
4-3-2. 권한 획득 후 이용자 동의창 출력[MainActivity:onResume( )
]
만약 이용 동의창이 정상적으로 출력되지 않을 경우 오류 해결 페이지의 Huvle 이용 동의창 오류 페이지를 참조하십시오.
4-3-3. Huvle Noti-bar 출력
이용 동의 창이 정상적으로 출력되었고, 이용 동의를 하였으나 Huvle Noti-bar가 정상적으로 출력되지 않았다면 아래의 사항을 점검하세요.
앱 설정 메뉴 중 알람
기능이 On
되어있는지 확인.
알람(Huvle Noti-bar)
을 받을 수 없습니다.
스마트 디바이스 케어 앱
에 절전 앱으로 등록되어 있는지 확인.
스마트 디바이스 케어 앱
에 절전 앱으로 등록된 앱은 알람(Huvle Noti-bar)
을 받을 수
없습니다.
4-3-4. Huvle 브라우저 실행
Huvle Noti-bar가 정상적으로 출력되었다면 Huvle Noti-bar의 웹 검색
버튼을 선택하요 Huvle 브라우저가
정상 실행되는지 확인해야합니다.
Huvle 브라우저 실행 시 아래의 그림과 같이 웹 페이지 정보를 찾을 수 없을 경우 연동 메뉴얼 3-2 useCleartextTraffic 속성이 정상적으로 설정되었는지 확인하십시오.
OS 28 이상의 디바이스에서 테스트 후 웹 페이지가 정상적으로 로드되는지 확인 해야합니다.