2012-06-22 14 views
9

Uygulamam şimdi gönderime hazır ancak Lisans hakkında bir şeyler öğrendim. Ben Eclipse içine Lisanslama kütüphane ithal ve öğretici açıklandığı gibi LicenseCheckActivity sınıfı oluşturduk http://twistbyte.com/tutorial/using-the-android-licensing-service-step-by-stepAndroid lisansları Eğitmen - Son adım

:

Ben öğretici çevrimiçi tarafından adım adım bulduk.

Öğreticinin son adımı 7 numaralı noktadayım. Öğretici, sınıfımın LicenseCheckActivity'u uzatması gerektiğini söylüyor. Ancak, lisanslamayı kontrol etmek istediğim sınıf zaten Etkinliği genişletiyor.

LicenseCheckActivity sınıfımdan checkLicense() yöntemini nasıl kullanabilirim? İşte

Cannot instantiate the type LicenseCheckActivity

benim LicenseCheckActivity sınıf

public abstract class LicenseCheckActivity extends Activity { 

static boolean licensed = true; 
static boolean didCheck = false; 
static boolean checkingLicense = false; 
static final String BASE64_PUBLIC_KEY = "MY BASE KEY"; 

LicenseCheckerCallback mLicenseCheckerCallback; 
LicenseChecker mChecker; 

Handler mHandler; 

SharedPreferences prefs; 

// REPLACE WITH YOUR OWN SALT , THIS IS FROM EXAMPLE 
private static final byte[] SALT = new byte[] { -46, 65, 30, -128, -103, 
     -57, 74, -64, 51, 88, -95, -45, 77, -117, -36, -113, -11, 32, -64, 
     89 }; 

private void displayResult(final String result) { 
    mHandler.post(new Runnable() { 
     public void run() { 

      setProgressBarIndeterminateVisibility(false); 

     } 
    }); 
} 

protected void doCheck() { 

    didCheck = false; 
    checkingLicense = true; 
    setProgressBarIndeterminateVisibility(true); 

    mChecker.checkAccess(mLicenseCheckerCallback); 
} 

protected void checkLicense() { 

    Log.i("LICENSE", "checkLicense"); 
    mHandler = new Handler(); 

    // Try to use more data here. ANDROID_ID is a single point of attack. 
    String deviceId = Settings.Secure.getString(getContentResolver(), 
      Settings.Secure.ANDROID_ID); 

    // Library calls this when it's done. 
    mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
    // Construct the LicenseChecker with a policy. 
    mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, 
      new AESObfuscator(SALT, getPackageName(), deviceId)), 
      BASE64_PUBLIC_KEY); 

    // mChecker = new LicenseChecker(
    // this, new StrictPolicy(), 
    // BASE64_PUBLIC_KEY); 

    doCheck(); 
} 

protected class MyLicenseCheckerCallback implements LicenseCheckerCallback { 

    public void allow() { 
     Log.i("LICENSE", "allow"); 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     // Should allow user access. 
     displayResult(getString(R.string.allow)); 
     licensed = true; 
     checkingLicense = false; 
     didCheck = true; 

    } 

    public void dontAllow() { 
     Log.i("LICENSE", "dontAllow"); 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     displayResult(getString(R.string.dont_allow)); 
     licensed = false; 
     // Should not allow access. In most cases, the app should assume 
     // the user has access unless it encounters this. If it does, 
     // the app should inform the user of their unlicensed ways 
     // and then either shut down the app or limit the user to a 
     // restricted set of features. 
     // In this example, we show a dialog that takes the user to Market. 
     checkingLicense = false; 
     didCheck = true; 

     showDialog(0); 
    } 

    public void applicationError(int errorCode) { 
     Log.i("LICENSE", "error: " + errorCode); 
     if (isFinishing()) { 
      // Don't update UI if Activity is finishing. 
      return; 
     } 
     licensed = false; 
     // This is a polite way of saying the developer made a mistake 
     // while setting up or calling the license checker library. 
     // Please examine the error code and fix the error. 
     String result = String.format(
       getString(R.string.application_error), errorCode); 
     checkingLicense = false; 
     didCheck = true; 

     displayResult(result); 
     // showDialog(0); 
    } 

    public void allow(int reason) { 
     // TODO Auto-generated method stub 

    } 

    public void dontAllow(int reason) { 
     // TODO Auto-generated method stub 

    } 

} 

protected Dialog onCreateDialog(int id) { 
    // We have only one dialog. 
    return new AlertDialog.Builder(this) 
      .setTitle(R.string.unlicensed_dialog_title) 
      .setMessage(R.string.unlicensed_dialog_body) 
      .setPositiveButton(R.string.buy_button, 
        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); 
          finish(); 
         } 
        }) 
      .setNegativeButton(R.string.quit_button, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
           int which) { 
          finish(); 
         } 
        }) 

      .setCancelable(false) 
      .setOnKeyListener(new DialogInterface.OnKeyListener() { 
       public boolean onKey(DialogInterface dialogInterface, 
         int i, KeyEvent keyEvent) { 
        Log.i("License", "Key Listener"); 
        finish(); 
        return true; 
       } 
      }).create(); 

} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mChecker != null) { 
     Log.i("LIcense", "distroy checker"); 
     mChecker.onDestroy(); 
    } 
} 

} 
+0

LicenceCheckActivity' statik olarak görünüyor. Belki de LicenseCheckActivity.checkLicense(); 'ile deneyin. – Mualig

+0

@Mualig Kodunuzu denedim ve aşağıdaki hatayı alıyorum: StatCheckActivity türünden statik olmayan yöntem checkLicense() yöntemine statik başvuru yapılamıyor. Eclipse hızlı bir düzeltme sunar: CheckLicense() 'ın değiştiricisini' statik 'olarak değiştirin.Ancak checklicense'de kullanılan AESObfuscator, statik referansları kabul etmez. – tiptopjat

cevap

5

çünkü sen O hatayı alıyorsanız geçerli:

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 

    // Check the license 
    LicenseCheckActivity l = new LicenseCheckActivity(); 
    checkLicense(); 

Bu bana aşağıdaki hatayı veriyor: İşte

benim kodudur

için çalışıyor

Bir aktivite örneği. Bunu asla yapmazsın! Aktiviteleri başlatmak ve aralarında bilgi aktarmak için her zaman ActivityManager ve Intents kullanın.

çözüm:

Eğer başlangıç ​​sınıfı Aktivite uzanan devam etmek istiyor ve sadece diğer öneri başlangıç ​​sınıfında kod taşımak olacaktır LicenseCheckActivity uzatmak olamaz yana

.

Ör:

sizin LicenseCheckActivity gelen tüm kodu alın ve MainActivity sınıfa taşımak ve sonra senin ActivityLicenseCheckActivity ile uzatmak için MainActivity

3

öğretici devletlerin onCreate yönteminde checkLicense() çağırabilir .

Örnek: LicenseCheckActivityActivity uzanır

class ExampleActivity extends LicenseCheckActivity{ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 

     Toast.makeText(this, "Checking Application License", Toast.LENGTH_SHORT).show(); 
     // Check the license 
     checkLicense(); 
    } 
} 

Çünkü LicenseCheckActivity ile bunu genişletmek eğer, sınıf ExampleActivity hala Activity yöntemleri devralır.

Eğer ListActivity uzatmak için ExampleActivity sınıf gerekiyorsa, o zaman LicenseCheckActivity aktivitesinin yerine ListActivity uzatmak olabilir.

+0

Aynı kodu çalışıyorum ama her defasında uygulama başlattı sadece bana tost mesajı "Lisans kontrol doğrulaması" göster ve normal olarak başlar. google oyuna yüklemediğim için satın alma maddesinin diyaloğunu göstermiyor. – user2592807

İlgili konular