This product supports Android 5.0(API Level 21) or later
- Update target sdk:
- The targetSdk version has been updated to 34.
- Improves the performance of the open() function of the NcgEpubFile class:
- If there are A1.ncg, A2.ncg, A3.ncg, ... etc. inside the AAA.epub file, it is faster to read the A2 and A3 files because the DRM header is read only when the A1.ncg file is opened for the first time.
What's New in Version 2.16.0
Added
Added Builder class.
- Users can now use the Builder class to create Ncg2Agent objects when they create them.
Added
Added Ncg2Agent functions.
- New functions using LicenseConfig have been added, including the ability to request licenses without using AsyncTask.
- void acquireLicense(LicenseConfig, Callback, Callback)
- void removeLicense(LicenseConfig)
- void checkLicenseValid(LicenseConfig)
- void getLicenseInfo(LicenseConfig)
- void updateSecureTime(Callback, Callback)
Changed
Internal library enhancements and performance improvements.
- Fixed a crash in the registerReceiver() function during NCG init().
Changed
Change from DoxyGen documentation to javadoc documentation.
Changed
The library distribution method has been changed to AARs.
What's New in Version 2.15.0
Added
Added LicenseConfig class.
- The LicenseConfig class allows users to set the required parameters when requesting a license.
What's New in Version 2.14.1
Removal
NcgZipArchive related classes have been removed.
- The NcgZipArchive, NcgZipCore, NcgZipEntry, NcgZipException, and NcgZipInputStream classes have been removed due to speed and performance issues.
- Among the library so files, libPocoFoundation.so and libPocoZip.so have been removed.
- For customers using NcgZipArchive related features, please use NcgEpubFile from now on.
What's New in Version 2.14.0
Added
Added the NcgEpubFile class.
- The NcgEpubFile class allows you to quickly consume a series of NCG contents with the same CID.
- Ncg2Agent.createNcgEpub() function to create an object.
- NcgEpubFile
- void release()
- void open(String path)
- void prepare()
- void close()
- long read(byte[] buff, long sizeToRead)
- void seek(long offset, NcgEpubFile.SeekMethod seekMethod)
- long getCurrentFilePointer()
- int getHeaderSize()
- InputStream getInputStream()
- int decreasePlayCount()
What's New in Version 2.13.0
Added
You can register callbacks for Local File
- LocaFileCallback allows you to register callbacks to access and use local files internally in the SDK, allowing for intermediate processing in your app.
- You can register a callback using the setLocalFileCallback(LocalFileCallback callback) function.
- LocalFileCallback
- Boolean fileOpen(String filePath, String openMode, int cloneNum)
- void fileClose(int cloneNum)
- byte[] fileRead(long numBytes, int cloneNum)
- long fileWrite(byte[] data, long numBytes, int cloneNum)
- long getFileSize(int cloneNum)
- long setFilePointer(long distanceToMove, int moveMethod, int cloneNum)
What's New in Version 2.12.2
Added
New parameter for the init function.
- init(Context context, OfflineSupportPolicy policy, String deviceID, String roDbPath, String prefixPreferenceName, boolean isFirstCallAfterBoot)
- From now on, prefixPreferenceName has been added to the init function parameters.
- The prefixPreferenceName parameter allows you to change the SharedPreference name being used inside the SDK.
- However, if you set prefixPreferenceName in init, you need to set prefixPreferenceName when using DeviceManager.
Added
Added Builder pattern when creating DeviceManager
- From now on, you can create it using the Builder pattern, and you can set the prefixName.
- If you set the prefixPreferenceName in init, you need to set the same prefixName when using DeviceManager.
What's New in Version 2.12.1
Added
Ncg2DeviceIdException has been added.
- Occurs when there is a problem with the state of the device when generating the Device ID inside the NCG (reboot the device and restart MediaDrm).
What's New in Version 2.12.0
Added
Now support epub (zip).
- Supports the zip.ncg file, so you can use it without decrypting the zip file.
NcgZipArchive ncgZipArchive = createNcgZipArchive();
ncgZipArchive.open("file path"); // file open
NcgZipEntry zipEntry = ncgZipArchive.findEntry("entry name"); // get NcgZipEntry for entry name in zip file.
InputStream in = zipEntry.getInputStream(); // get InputStream for file in zip.
ncgZipArchive.getZipEntries(); // get all files in zip.
ncgZipArchive.close(); // file close
What's New in Version 2.11.2
Added
An API to set whether to allow emulators during development is added.
Ncg2Agent - enableVirtualMachine()
Ncg2Agent - disableVirtualMachine()
What's New in Version 2.11.1
Update
The download storage location is changed in the sample app (Scoped Storage compatible).
What's New in Version 2.11.0
Fixed
NCG Core
bug fixes and stability improvements.
What's New in Version 2.10.3
Fixed
In case of license issuance error (7003
) and Device ID
is Widevine UUID
, Device ID
and RODB
are initialized.
-
The stored license information is deleted by initialization of
RODB
, andNcg2Agent.init()
function must be called.// Occurs when the license issuance error NCGERR_LICENSE_SERVER_RESPONSE_CERTIFICATE_ERROR and // the Device ID is a Widevine UUID. In this case, Ncg2Agent.Init()must be called again. Ncg2CoreErrorCode.NCGERR_LICENSE_SERVER_RESPONSE_CERTIFICATE_ERROR_AND_DEVICEID_IS_WIDEVINE_UUID
-
Please refer to the example in the
Ncg2SdkWrapperListenerImpl.java
file.@Override public void onServerError(final Ncg2ServerResponseErrorException e, String string, final int serverErrorCode) { mHandler.post(new Runnable() { @Override public void run() { if (serverErrorCode == Ncg2CoreErrorCode.NCGERR_LICENSE_SERVER_RESPONSE_CERTIFICATE_ERROR_AND_DEVICEID_IS_WIDEVINE_UUID) { Ncg2SdkWrapper.getInstance().init(mContext, Ncg2SdkWrapperListenerImpl.this); } ... } }
What's New in Version 2.10.2
Changed
Changed to SqlCipher
library built with Android 11
target and version 4.4.3
.
-
The
SqlCipher
version has changed so you must addandroidx.sqlite:sqlite
dependency to your app modulebuild.gradle
.// Android App build.gradle dependencies { implementation "androidx.sqlite:sqlite:2.1.0" }
Fixed
The buffer size for downloading m3u8
files is changed.
What's New in Version 2.10.1
Fixed
Fixed to release MediaDrm
.
What's New in Version 2.10.0
Improve
Widevine UUID
generation logic is improved.
- The
Widevine UUID
generation logic and the generatedMediaDrm
release timing are improved.
What's New in Version 2.9.0
Added
Http Live Streaming content key file protection logic is added.
- A logic has been added to prevent the leakage of HLS content keys by accessing the local web server.
What's New in Version 2.8.0
Added
The getTokenInfo()
function is added.
- Check the given
Token
information throughgetTokenInfo()
function.
public abstract class Ncg2Agent {
public abstract PallyconTokenInfo getTokenInformation(String token) throws Ncg2Exception;
}
Update
The Sample is updated to acquire a license with Token
What's New in Version 2.7.0
Add
Playback of downloaded NCG HLS content is supported.
- Downloaded NCG-HLS content is played in
Exoplayer
.
// If you set the saved HLS path, it returns the URL (path) to play the encrypted content.
public String addHttpLiveStreamUrlForLocalPlayback(String path) throws Ncg2InvalidLicenseException, Ncg2Exception;
- Sample
//
// advanced sample -> MainActivity.java
//
void startHlsPlayerActivity(String localM3U8Path) {
...
if (isLocalM3U8) {
playbackURL = ncgLocalWebServer.addHttpLiveStreamUrlForLocalPlayback(contentPath);
} else {
if (mGlobal.mIsLive == true) {
playbackURL = ncgLocalWebServer.addHttpLiveStreamUrlForPlayback(contentPath, true);
} else {
playbackURL = ncgLocalWebServer.addHttpLiveStreamUrlForPlayback(contentPath, false);
}
}
...
}
NOTE
If the downloaded NCG HLS content cannot be played through the SDK, please contact us with the content.
SDK does not support
m3u8
file download function.
Update
NCG Core
has been updated to v2.4.0
.
- Supports players to play encrypted NCG HLS content.
What's New in Version 2.6.3
Add
'scoped storage' permission is added to the SDK Sample project.
- When downloading files on Android 10, you need to set
android:requestLegacyExternalStorage
totrue
.
// https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
What's New in Version 2.6.2
Added
APIs that can be licensed with tokens
are added.
- It is an API that can acquire licenses using
token
information.
public void acquireLicenseByToken(String token, String acquisitionURL, boolean isTemporary )
throws Ncg2ServerResponseErrorException, Ncg2HttpException, Ncg2Exception
What's New in Version 2.6.1
Fixed
Sample project errors are fixed.
- Fixed a problem that could not be executed due to an error when executing the sample project.
What's New in Version 2.6.0
Added
Added setRootingCheckLevel()
API, which allows you to specify the strength when checking Android routing.
- It is divided into 1 to 4 levels, and the default is
level 1
.
level = 1 Default Level.
SU EXISTS,SU BINARY,SUPERUSER APK,PERMISSIVE SELINUX,RESETPROP,WRONG PATH PERMITION,
DANGEROUS PROPS,BUSYBOX BINARY,XPOSED,RESETPROP,TEST KEYS,DEV KEYS,NON RELEASE KEYS
level = 2 SU EXISTS,SU BINARY,SUPERUSER APK,PERMISSIVE SELINUX,RESETPROP,WRONG PATH PERMITION,
DANGEROUS PROPS,BUSYBOX BINARY,XPOSED,RESETPROP
level = 3 SU EXISTS,SU BINARY,SUPERUSER APK,PERMISSIVE SELINUX,RESETPROP,WRONG PATH PERMITION
level = 4 SU EXISTS,SU BINARY
What's New in Version 2.5.5
Changed
Changed to Target 28 -> 29.
- Target version is changed to 29 according to Google policy.
Changed
From Android Q(API 29), the'Widevine' UUID is used as the Device ID
.
- As of Android Q (API 29),
TELEPHONY_SERVICE
cannot be used. Widevine
UUID is used when all the following conditions are met.- Device is Android Q (API 29) or higher
Widevine
DRM support- In case of
Widevine
security level (securityLevel
)L1
What's New in Version 2.5.4
Changed
The changed NCG Core
is applied.
- URI extraction function in
EXT-X-MAP
from m3u8 file is added toNCG Core
and applied to NCG SDK.
Changed
The NCG Advanced
Sample changes to call different players depending on whether they are HLS content.
- For HLS content, it is played by calling
MediaPlayer
fromstartHlsPlayerActivity()
. - Played through
Exoplayer
if not HLS content.
What's New in Version 2.5.3
Changed
Android Rooting check is changed.
What's New in Version 2.5.2
Changed
NCG Core
logs are output outside the SDK.
Secure Time
related logs are output toNcgExceptionalEventListener
.NCG Core
All logs are not output.
What's New in Version 2.5.1
Changed
Android Target Sdk Version Change(27 -> 28)
- Android Target Sdk Version changed from 27 to 28.
- AndroidX is applied.
Fixed
Fixed External Display Detection and Rooting Checking.
- Fixed an issue that prevented external output and routing checking on some devices.
What's New in Version 2.5.0
Fixed
Removed crash on local web server.
- The crash on the local web server has been removed.
What's New in Version 2.4.0
Changed
Support for Android 64bit(arm64-v8a, x86_64)
- Google has included Android ABI arm64-v8a, x86_64 in the NCG SDK with the requirement to support Android 64bit since August 2019.
- NCG SDK v2.4.0 must be applied in order to register apps for Google Play since August.
Changed
Change Android API Level minimum support(API 15 -> 16)
- Minimal support in NDK has been changed to Android API Lebel 16 while supporting NCG SDK 64bit.
- Minimum support for Android at 64bit is Android API Lebel 21.
What's New in Version 2.3.3
Added
BlueStacks 4 detection add
- Fixed SDK to detect new BlueStacks 4.
- Limited use of the SDK in BlueStacks4.
- Applying ExoPlayer 2.9.3
- Fixed internal errors when running on Android 9.0
Added
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
- Core patch to disallow emulators provided by Android SDK.
Added
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
- Core patch for HLS playback error.
- added simple sample.
Added
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
- Correct the previous securetime and the current securetime acquisition logic equally.
Added
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
- HLS live
- DefaultPlayer : ExoPlayer
Added
Ncg2LocalWebServer - addHttpLiveStreamUrlForPlayback(String url, boolean isLiveHLS)
Ncg2LocalWebServer - addHttpLiveStreamUrlForPlayback(String url, String cid, String siteID, boolean isLiveHLS)
Changed
Default Activity : MediaPlayerActivity -> ExoPlayerActivity
Removal
Fixed
Added
ExoPlayerActivity.java for hls live
layout_exoplayer.xml for hls live
Changed
Global.java for hls live
MainActivity.java for hls live
Removal
Fixed
- Enhanced security patch has been updated.
Added
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
- Virtual machine detection added.
> Ncg2FatalException has been added.
> Please add the code for the user guide and the app exit in the exception.- The maximum length of OId in license request has increased to 4096 bytes
Added
Changed
Removal
Fixed
Added
Changed
public boolean init(Context context, Ncg2SdkWrapperListener listener) {
mListener = listener;
mContext = context;
mHandler = new Handler();
mHttpRequestCallback = new NcgHttpRequestCallbackImpl(context);
OfflineSupportPolicy policy = OfflineSupportPolicy.OfflineSupport;
policy.setCountOfExecutionLimit(0);
try {
mNcg2Agent.init(context, policy);
mNcg2Agent.setHttpRequestCallback(mHttpRequestCallback );
mNcg2Agent.enableLog();
mNcg2Agent.getLocalWebServer().setWebServerListener(mWebserverListener);
} catch (Ncg2FatalException e) {
e.printStackTrace();
mListener.onAppFinishedError(e);
return false;
} catch (Ncg2ReadPhoneStateException e) {
e.printStackTrace();
mListener.onSecurityError(e);
return false;
} catch (Ncg2Exception e) {
e.printStackTrace();
mListener.onError(e, "init() Exception : " + e.getMessage());
return false;
}
return true;
}
Removal
Fixed
- READ_PHONE_STATE Error
> Ncg2ReadPhoneStateException have been added.
> 1. Please add the code for the app such as user guides and exit on the right in this exception.- NCGERR_MODIFIED_DBFILE_INO Error > Ncg2ModifiedDBFileInoException have been added
> 1. please remove RODBFile in this exception by using new SDK API.
> 2. Please add the user guide and code of the app exit in this exception.
Added
public abstract void removeRODBFile(Context context);
public abstract void removeRODBFile(Context context, String roDbPath);
Changed
public abstract void init(Context context, OfflineSupportPolicy policy) throws Ncg2ReadPhoneStateException, Ncg2ModifiedDBFileInoException, Ncg2Exception;
Removal
Fixed
Added
Changed
public boolean init(Context context, Ncg2SdkWrapperListener listener) {
mListener = listener;
mContext = context;
mHandler = new Handler();
mHttpRequestCallback = new NcgHttpRequestCallbackImpl(context);
OfflineSupportPolicy policy = OfflineSupportPolicy.OfflineSupport;
policy.setCountOfExecutionLimit(0);
try {
mNcg2Agent.init(context, policy);
mNcg2Agent.setHttpRequestCallback(mHttpRequestCallback );
mNcg2Agent.enableLog();
mNcg2Agent.getLocalWebServer().setWebServerListener(mWebserverListener);
} catch (Ncg2ReadPhoneStateException e) {
e.printStackTrace();
mListener.onSecurityError(e);
return false;
} catch (Ncg2ModifiedDBFileInoException e) {
e.printStackTrace();
mNcg2Agent.removeRODBFile(context);
mListener.onModifiedDBFileInoError(e);
return false;
} catch (Ncg2Exception e) {
e.printStackTrace();
mListener.onError(e, "init() Exception : " + e.getMessage());
return false;
}
return true;
}
@Override
public void onModifiedDBFileInoError(Exception e) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle(R.string.error_dialog_title);
builder.setMessage(mActivity.getString(R.string.modified_dbfile_ino_error));
builder.setPositiveButton(mActivity.getString(R.string.confirm), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
mActivity.finish();
}
});
Dialog dialog = builder.create();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
@Override
public void onSecurityError(Exception e) {
// TODO Auto-generated method stub
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle(R.string.error_dialog_title);
builder.setMessage(mActivity.getString(R.string.security_read_phone_state_error));
builder.setPositiveButton(mActivity.getString(R.string.confirm), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
mActivity.finish();
}
});
Dialog dialog = builder.create();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
Removal
Fixed
- After July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL.
> After July 11th 2016, You should use this SDK to update your app.- All so & jar file should be changed.
Added
OpenSSL version is updated to 1.0.2g (libsqlcipher_android.so)
Changed
Removal
Fixed
- After July 11, 2016, Google Play will block publishing of any new apps or updates that use older versions of OpenSSL.
> After July 11th 2016, You should use this SDK to update your app.
Added
OpenSSL version updated to 1.0.1s.
Changed
Removal
Fixed
Added
Your application should use a package name which is authorized by INKA. Media player may not work properly if unauthorized package name is used. In case of changing package name, please contact us for the authorization process.
Changed
Removal
Fixed
Added
Changed
Removal
Fixed
allowable secure time's error range is increased from 24 hour to 1 hours. ( by reverting libNCG2_JNI.so which is created at 20151029)
Added
suspend function is same as pause function functionally.
public abstract void suspend() throws Ncg2Exception;
Changed
allowable secure time's error range is increased from 1 hour to 24 hours
Removal
Fixed
Added
Can set secure setting for preventing media from screencapture (default : true)
public abstract class Ncg2Player {
public abstract void setSecure(boolean isSecureSurfaceView);
}
Changed
Removal
Fixed
Added
Cookie data can be sent when playing DnP(download and play). NCG LocalWebServer can request with the cookie data.
public abstract class Ncg2Player {
public abstract void setDataSource(String path, String remoteUrlForDnp, long fileSize, String customCookie) throws IllegalArgumentException, IllegalStateException, IOException,Ncg2Exception;
}
Changed
Removal
Fixed
Added
S/W speed control(trick play) option is added. Previously the option was configured automatically, but now the H/W and S/W speed control option should be set manually in configuration. Must be added to the SW speed settings feature that allows you to turn on some terminals, because if HW playback is not smooth (default: HW)
public abstract class Ncg2Player {
public abstract void setSwCodecMode(boolean enableSwCodec);
}
You can turn off function of detecting screen recorder app. (default: On)
public abstract class Ncg2Agent {
public abstract void enableScreenRecorderDetecting(boolean isEnabled);
}
Changed
Removal
Fixed
History of previous version is given on the release_note.txt file. Please refer it.