Мое приложение для Android реализует LVL и проверяет наличие действительной лицензии при запуске. Я использую ServerManagedPolicy. Всякий раз, когда я использую тестовую учетную запись или когда приложение покупается в магазине Play, дается нелицензионный ответ, и мои пользователи очень раздражаются.
Соответствующий код:
final Random r = new SecureRandom();
byte[] SALT = new byte[20];
r.nextBytes(SALT);
lkey = "MyGooglePlayKey(hidden)";
android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
mChecker = new LicenseChecker(
this, new ServerManagedPolicy(this,
new AESObfuscator(SALT, getPackageName(), android_id)), lkey);
Это проблема с Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID)
? Естественно, лицензионная документация Android не дает никакой информации о том, как получить идентификатор устройства, а для использования другого метода требуется другое разрешение. Мой метод заставляет Android Studio сказать: «Использование getString для получения идентификаторов устройств не рекомендуется».
Из-за очень старой ошибки Lollipop мой класс LicenseChecker пришлось изменить, чтобы использовать явное намерение:
if (mService == null) {
Log.i(TAG, "Binding to licensing service.");
try {
Intent serviceIntent = new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
.setPackage("com.android.vending");
boolean bindResult = mContext.bindService(serviceIntent,
this, // ServiceConnection.
Context.BIND_AUTO_CREATE);
Моя библиотека LVL использует тот же targetSDK/compile/minSDK, что и мое приложение:
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
useLibrary 'org.apache.http.legacy'
defaultConfig {
minSdkVersion 17
targetSdkVersion 26
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
dependencies {
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}
Из-за того, что методы NamePairValue
и URLEncodedUtils
устарели, мне пришлось использовать эти заменители Apache.