检查PhoneGap Android应用程序LVL许可证,在异步线程中使用



我想知道如何在Phonegap应用程序开始加载时,在异步线程中启动Android的LVL许可证验证。如果验证结果为"无法访问",我希望该应用程序关闭。与通常的一步一次设置相比,我更喜欢这种逻辑。LVL需要几秒钟的时间,如果一个邪恶的未经许可的用户在应用程序关闭前看到它几秒钟,那就不是问题。

问题是我对Java不太了解。

我的应用我有一个在Google Play上发布的PhoneGap(Cordova)付费应用程序,它使用LVL验证来检查该应用程序是否由用户付费。工作起来很有魅力,只是支票大约需要五秒钟。通常,即使是启动屏幕也会在几秒钟内不显示,似乎就是因为这个原因。

因此,用户在黑屏上停留了五秒钟,然后在加载Java代码时获得启动屏幕,最后他们可以看到默认的灰色主屏幕,直到Java脚本完成。因此,我非常有动力减少这种启动延迟。

我已经阅读了一些建议使用异步方法的评论:立即开始加载URL,并作为asyncTask运行许可证检查。但我不知道如何将网络视图传递给asyncTask,以便在许可证无效的情况下关闭网络视图。

我的第一次尝试由于许可证检查本身是一个异步过程,我尝试先设置启动屏幕并加载URL,然后进行许可证检查。请参阅下面的代码。如果检查返回"不允许",则回调应关闭应用程序。然而,如果我尝试这种设置,LVL服务器总是返回"有效",即使我在Google Play上将强制响应设置为"无效"或"未知"或其他任何内容。

我在找A或B:A.一种让LVL正确响应的方法。B.实现异步许可证检查的另一种方法。

下面的代码是对当前代码的抽象。DroidGap是网络视图。基本上,onCreate启动许可证检查,许可证检查回调要么加载应用程序的HTML,要么关闭web视图。

public class App extends DroidGap {
    public void onCreate(Bundle icicle) {
        super.setIntegerProperty("splashscreen", R.drawable.splash);
        super.loadUrl("file:///android_asset/www/index.html");
        mCheckerCallback = new LicenseCheckerCallback();
        checkAccess(mCheckerCallback);
    }
private class MyCheckerCallback implements LicenseCheckerCallback() {
    public void Allow() {
         //Do nothing
    }
    public void DontAllow(){
         finish();
    }
}

Scott问我是否找到了解决方案。太久了,我想不起我是怎么做的,但下面的设置似乎对我有效。希望能有所帮助!

package com.phonegap.mappingtheforest.helloworld;
import org.apache.cordova.DroidGap;
//import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.util.Log;
import android.widget.Toast;
import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;
//import com.phonegap.afforditfull.R;

public class App extends DroidGap { 
    private LicenseChecker mChecker;
    private LicenseCheckerCallback mLicenseCheckerCallback;
    private static final String BASE64_PUBLIC_KEY = "MyBase64PublicKey";
 // Generate 20 random bytes, and put them here.
    private static final byte[] SALT = new byte[] {
     //[my bunch of integers]
     };
    private AESObfuscator mObsfuscator;
    private String android_id;
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
         super.onCreate(icicle); 
         //setContentView(R.layout.main);
         super.loadUrl("file:///android_asset/www/index.html",1);
         //super.setStringProperty("loadingDialog", "Starting Afford-It...");
         super.setIntegerProperty("splashscreen", R.drawable.splash);
         android_id = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
         mObsfuscator = new AESObfuscator(SALT, getPackageName(), android_id);
         ServerManagedPolicy serverPolicy = new ServerManagedPolicy(this,mObsfuscator);
         mLicenseCheckerCallback = new MyLicenseCheckerCallback();
         mChecker = new LicenseChecker(
             this, serverPolicy,
             BASE64_PUBLIC_KEY  // Your public licensing key.
             );
         mChecker.checkAccess(mLicenseCheckerCallback);  
    }
private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
        public void allow() {
            if (isFinishing()) {
                // Don't update UI if Activity is finishing.
                return;
            }
            // Should allow user access.
            Log.w("LicenseChecker", "Allow");
            Intent i = new Intent(App.this, DroidGap.class);
            startActivity(i);
            finish();
        }
        public void dontAllow() {
            if (isFinishing()) {
                // Don't update UI if Activity is finishing.
                return;
            }
            Log.w("LicenseChecker", "Don't Allow");
            // Should not allow access. An app can handle as needed,
            // typically by informing the user that the app is not licensed
            // and then shutting down the app or limiting the user to a
            // restricted set of features.
            // In this example, we show a dialog that takes the user to Market.
            showDialog(0);
        }
        @Override
        public void applicationError(ApplicationErrorCode errorCode) {
            if (isFinishing()) {
                // Don't update UI if Activity is finishing.
                return;
            }
            toast("Error: " + errorCode.name());
        }
    }
    @Override
    protected Dialog onCreateDialog(int id) {
        // We have only one dialog.
        return new AlertDialog.Builder(this)
                .setTitle("Application Not Licensed")
                .setCancelable(false)
                .setMessage(
                        "This application is not licensed. Please purchase it from Android Market")
                .setPositiveButton("Buy App",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                Intent marketIntent = new Intent(
                                        Intent.ACTION_VIEW,
                                        Uri.parse("market://details?id=com.phonegap.mappingtheforest.afforditpaid" + getPackageName()));
                                startActivity(marketIntent);
                                finish();
                            }
                        })
                .setNegativeButton("Exit",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                finish();
                            }
                        }).create();
    }   
    public void toast(String string) {
        Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onDestroy() {
    super.onDestroy();
    mChecker.onDestroy();
  }
}

最新更新