Приложение для лицензирования Android не работает?

Я реализовал средство проверки лицензий Google, прочитав официальные инструкции.

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings.Secure;
import android.widget.Toast;

import com.google.android.vending.licensing.AESObfuscator;
import com.google.android.vending.licensing.LicenseChecker;
import com.google.android.vending.licensing.LicenseCheckerCallback;
import com.google.android.vending.licensing.ServerManagedPolicy;

public class Splash extends Activity {
    MyLicenseCheckerCallback mLicenseCheckerCallback;
    LicenseChecker mChecker;
    byte[] SALT = new byte[] { -73, 95, 70, -126, -103, -57, 14, -46, 51, 88, -5,
        -60, 77, -88, -63, -13, -1, 82, -4, 9 };
    //Handler mHandler;
    String BASE64_PUBLIC_KEY="My base key";
    Context mContext;
    IBinder serviceBinder;
    String deviceId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        mLicenseCheckerCallback = new MyLicenseCheckerCallback();
        deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
        // Construct the LicenseChecker with a policy.
        mChecker = new LicenseChecker(this,
            new ServerManagedPolicy(Splash.this, new AESObfuscator(SALT,
                getPackageName(), deviceId)), BASE64_PUBLIC_KEY);
        doCheck();
    }

    private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
        @Override
        public void allow(int reason) {
            // TODO Auto-generated method stub
            if (isFinishing())
                return; // Don't update UI if Activity is finishing.
            // Toast.makeText(Splash.this, "Success", Toast.LENGTH_LONG).show();
            Intent intent=new Intent(Splash.this,Main.class);
            startActivity(intent);
            finish();

            // Should allow user access.
            // so do nothing
        }

        @Override
        public void dontAllow(int reason) {
            // TODO Auto-generated method stub
            if (isFinishing())
                return; // Don't update UI if Activity is finishing.
            // Toast.makeText(Splash.this, "Fail", Toast.LENGTH_LONG).show();
            createDialog();
        }

        @Override
        public void applicationError(int errorCode) {
            // TODO Auto-generated method stub
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mChecker.onDestroy();
    }

    private void doCheck() {
        // mCheckLicenseButton.setEnabled(false);
        setProgressBarIndeterminateVisibility(true);
        ///  mStatusText.setText(R.string.checking_license);
        mChecker.checkAccess(mLicenseCheckerCallback);
    }

    public void createDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("PIRACY WARNING");
        builder.setMessage("A valid purchase for My App has not been detected.  Your IP"
            + " has been logged and all offenders will be reported to the authorities."
            + " If you received this message in error, please contact Support.");
        builder.setPositiveButton("Buy Now", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
                    "http://market.android.com/details?id=" + getPackageName()));
                startActivity(marketIntent);
            }
        });
        builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }
}

и вот разрешение манифеста, которое я дал

<supports-screens android:normalScreens="true" android:largeScreens="true" android:smallScreens="true" android:anyDensity="true" android:xlargeScreens="true" android:resizeable="true"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

после реализации этого я запускаю приложение и подписываю его с помощью ключа выпуска и загружаю apk как черновик в консоль разработчика Google Play, а также я добавил 3 тестовых аккаунта в настройки консоли разработчика.

Насколько я понимаю, это должно быть запущено на устройстве, имеющем тестовую учетную запись в качестве основной учетной записи на устройстве, а остальная часть устройства должна отображать диалоговое окно.

Но в моем случае на всех устройствах он будет работать нормально, и эта вещь может случиться в какой-то странной ситуации, если интернет отключен, тогда появится диалоговое окно о пиратстве, а если он подключен, то он будет работать на всех устройствах, несмотря на устройства с тестовой учетной записью.


person Khan    schedule 23.04.2013    source источник


Ответы (3)


Наконец-то я нашел правильный способ тестирования программы проверки лицензий Google.

Поскольку я загрузил apk в консоль разработчика Google Play в качестве черновика, и если я установлю этот apk на любом устройстве, он будет работать с ответом LICENSED, если на устройстве нет входа в систему с тестовой учетной записью.

И, наконец, я провожу тестирование таким образом, я добавил тестовую учетную запись и выбираю License Test Response в консоли разработчика как LICENSED, после чего приложение будет работать, и после того, как я также изменю настройку в консоли разработчика с помощью NOT_LICENSED, чем показывает диалоговое окно о пиратстве на устройстве с тестовой учетной записью в качестве основной учетной записи.

ВАЖНОЕ ПРИМЕЧАНИЕ. Кроме устройств с тестовой учетной записью, он запускается с ответом ЛИЦЕНЗИРОВАНО, потому что я загрузил APK в качестве черновика в магазин игр. Поэтому для тестирования лицензирования Google нам необходимо рассмотреть только тестовую учетную запись, добавленную в консоль разработчика Google Play

person Khan    schedule 24.04.2013
comment
это не работает для меня .... пожалуйста, помогите мне. я сделал как вы упомянули, но каждый раз выскакивает диалог пиратства - person user2592807; 28.06.2014
comment
вам необходимо добавить тестовую учетную запись gmail в консоль разработчика google play, а на устройстве вы должны иметь эту учетную запись в качестве основной учетной записи gmail, которая используется для загрузки приложений из игрового магазина. Как я уже упоминал для ответа на проверку лицензии, вам нужно выбрать LICENSED вместо этого НЕЛИЦЕНЗИРОВАНО или любой другой вариант. - person Khan; 30.06.2014
comment
Я продолжаю получать сообщение об ошибке, Ошибка: (48, 0) Описание com.android.vending.CHECK_LICENSE неверно. Есть ли шанс, что кто-то знает, почему? Большое спасибо. - person cjayem13; 25.11.2014

Вы уже сделали все эти шаги, но обязательно проверьте это еще раз:

  1. проверьте, как только ваш открытый ключ сравнится с открытым ключом чернового хранилища.
  2. Дайте собственную соль 20 числа.
  3. Предоставьте правильно тестовые учетные записи в Google Play и используйте ту же учетную запись на устройстве.
  4. В гугл плей надо поставить лицензионный режим для драфта приложения.
  5. проверьте через некоторое время, потому что для получения достоверных результатов потребуется некоторое время.
  6. наконец, проверьте условия диалогового окна предупреждения в приложении.
  7. очистите кеш Google Play на своем мобильном телефоне, возможно, он сохранит результаты.
person SubbaReddy PolamReddy    schedule 23.04.2013

ЛВЛ работает на всех устройствах с добавленными Вами аккаунтами, а не только на основной аккаунт. Он не должен работать на телефонах с учетной записью, которую вы не добавили в консоль разработчика. Даже LVL пытается проверить ваше приложение с помощью Google LVL-Server, поэтому вам нужно подключение к Интернету, это нормально. Если вы просто хотите проверить лицензию один раз, вам нужно сохранить некоторые данные, например, в общих настройках, которые проверка уже сделала. Таким образом, при следующем запуске приложения вы можете проверить эти сохраненные общие настройки, если приложение только что проверено. Если да, не проверяйте снова, если нет, попробуйте еще раз.

Вы можете настроить поведение проверки лицензии в консоли разработчика, вы можете смоделировать нормальный ответ или, например, ответ «не проверено» и так далее....

person Opiatefuchs    schedule 23.04.2013
comment
в моем случае это также работает на устройстве, учетную запись которого я не добавил в консоль разработчика, означает, что приложение работает на всех устройствах. - person Khan; 23.04.2013
comment
Хорошо, тогда я понимаю неправильно. Вы действительно, действительно уверены, что на другом устройстве нет тестового аккаунта. Я имею в виду, что можно иметь более одной учетной записи, может быть, на этих устройствах тоже есть тестовые учетные записи? - person Opiatefuchs; 23.04.2013