使用 flutter 的 Google Play 许可证验证库

Dee*_*hah 6 java android licensing android-lvl flutter

所以我使用 flutter 进行应用程序开发(显然,标题),这是一个付费应用程序,因此需要验证许可证。我正在使用 MedthodChannel 来实现此目的,因为我无法找到颤振本身的方法。

现在的问题是:所以在Java方面,我正在检查许可证验证,然后将结果发送到flutter。这就是方法通道的工作原理。但问题是,即使在验证完成之前,结果也会发送到 flutter,因此 flutter 部分认为许可证没有经过验证,即使是这样。

我在下面附上java端代码

    包在.navkargems.diamondtools;

    导入 android.os.Bundle;
    导入 android.os.Handler;
    导入 android.provider.Settings;
    导入 android.util.Log;

    导入 com.google.android.vending.licensing.LicenseChecker;
    导入 com.google.android.vending.licensing.LicenseCheckerCallback;
    导入 com.google.android.vending.licensing.StrictPolicy;

    导入 io.flutter.app.FlutterActivity;
    导入 io.flutter.plugin.common.MethodCall;
    导入 io.flutter.plugin.common.MethodChannel;
    导入 io.flutter.plugins.GeneratePluginRegistrant;

    公共类 MainActivity 扩展 FlutterActivity {

      私有静态最终字符串CHANNEL =“in.navkargems.diamondtools/verify”;

      私有静态最终字符串_key_to_verify_base64 =“MIIBIjAN ...”;

      私有处理程序mHandler;
      私有许可证检查器 mChecker;
      私有 LicenseCheckerCallback mLicenseCheckerCallback;
      布尔许可;
      布尔检查许可证;
      布尔值 didCheck;
      int 消息 = 0;

      @覆盖
      protected void onCreate(Bundle savingInstanceState) {
        super.onCreate(savedInstanceState);
        generatedPluginRegistrant.registerWith(this);
        new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
          新的 MethodChannel.MethodCallHandler() {
            @覆盖
            公共无效onMethodCall(MethodCall methodCall,MethodChannel.Result结果){
              if (methodCall.method.equals("verifyLicense")) {

                String deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
                Log.i("设备 ID", deviceId);

                mHandler = new Handler();
                mLicenseCheckerCallback = new MyLicenseCheckerCallback();
                mChecker = new LicenseChecker(getApplicationContext(), new StrictPolicy(), _key_to_verify_base64);
                doCheck();
                Log.i("许可证", "检查:"+didCheck);
                如果(没有检查){
                  结果.成功(已许可);
                }
                别的{
                  结果.成功(假);
                }
              }
            }
          }
        );
      }

      私有无效 doCheck() {

        确实检查=假;
        检查许可证=真;
        设置进度条不确定可见性(真);
        mChecker.checkAccess(mLicenseCheckerCallback);

      }

      私有类 MyLicenseCheckerCallback 实现 LicenseCheckerCallback {

        @覆盖
        公共无效允许(int原因){
          如果(正在完成()){
            Log.i("许可证", ""+isFinishing());
            返回;
          }
          Log.i("许可证","已接受!");
          消息=1;

          许可=真实;
          检查许可证=假;
          确实检查=真;


        }

        @覆盖
        公共无效dontAllow(int原因){
          如果(正在完成()){
            Log.i("许可证", ""+isFinishing());
            返回;
          }
          Log.i("许可证", "原因:"+原因);
          消息=0;
          许可=假;
          检查许可证=假;
          确实检查=真;

        }

        @覆盖
        公共无效应用程序错误(int错误代码){
          Log.i("许可证", "错误:"+errorCode);
          如果(正在完成()){
            Log.i("许可证", ""+isFinishing());
            返回;
          }
          消息=0;
          许可=真实;
          检查许可证=假;
          确实检查=假;

        }

      }


    }

感谢您的时间。