8

公式の説明書を読んで 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 つのテスト アカウントを追加しました。

テストアカウントをデバイスのメインアカウントとして持ち、デバイスの残りの部分でダイアログを表示する必要があるデバイスで実行する必要があることを読んで理解しました。

しかし、私の場合、すべてのデバイスで正常に動作し、インターネットが切断されている場合は著作権侵害に関するダイアログが表示され、接続されている場合はテストアカウントデバイスにもかかわらずすべてのデバイスで動作するよりも奇妙な状況が発生します.

4

3 に答える 3

2

最後に、Google ライセンス チェッカーの適切なテスト方法を見つけました。

Google Play開発者コンソールにapkをドラフトとしてアップロードしたため、そのapkを任意のデバイスにインストールすると、デバイスにテストアカウントでログインしていない場合、応答LICENSEDで実行されます。

そして最後に、この方法でテストを行います。テスト アカウントを追加し、開発者コンソールでライセンス テスト応答を選択し、アプリが実行されるよりもLICENSEDを選択します。また、開発者コンソールでNOT_LICENSEDを使用して設定を変更した後、テスト アカウントを持つデバイスで著作権侵害に関するダイアログが表示されます。メインアカウントとして

重要な注意:そして、応答LICENSEDで実行されるテスト アカウント デバイス以外は、プレイ ストアに APK をドラフトとしてアップロードしたためです。したがって、Google ライセンスのテストでは、Google Play デベロッパー コンソールに追加されたテスト アカウントのみを考慮する必要があります。

于 2013-04-24T07:47:50.490 に答える
1

You already done all these steps but clearly check it once again:

  1. check once your's public key compare with the draft store public key.
  2. Give own salt 20 numbers.
  3. Give properly test accounts in the google play and same account use in the device also.
  4. In google play you have to put licensed mode for application draft.
  5. check after some time because it will take some time to give valid results.
  6. finally verify the alert dialog conditions in application.
  7. clear the google play cache in your mobile may be it will store the results.
于 2013-04-23T13:41:28.420 に答える
0

LVL は、メイン アカウントだけでなく、追加したアカウントを持つすべてのデバイスで機能しています。開発者コンソールに追加していないアカウントを持つ電話では機能しないはずです。さらに、LVL は Google LVL サーバーを使用してアプリを検証しようとするため、インターネット接続が必要です。これは問題ありません。ライセンスを 1 回だけ確認したい場合は、たとえば共有設定に、確認が既に行われているいくつかのデータを保存する必要があります。そのため、次回アプリが起動したときに、アプリが検証されているかどうか、これらの保存された共有設定で確認できます。はいの場合は、もう一度チェックしないでください。いいえの場合は、もう一度試してください。

開発者コンソールでライセンスをチェックする動作を設定することができます. 通常の応答をシミュレートすることができます.

于 2013-04-23T12:50:39.620 に答える