2012-06-22 14 views
9

Moja aplikacja jest już gotowa do złożenia, ale ostatnio dowiedziałem się o licencjonowaniu.Samouczek dotyczący licencjonowania Androida - ostatni krok

Znalazłem krok po kroku przez poradnik: http://twistbyte.com/tutorial/using-the-android-licensing-service-step-by-step

Mam importowanej biblioteki Licensing do Eclipse i stworzył klasę LicenseCheckActivity opisane w poradniku.

Jestem na ostatnim etapie samouczka, punkt numer 7. Samouczek mówi, że moja klasa powinna przedłużyć LicenseCheckActivity. Jednak klasa, w której chciałbym sprawdzić licencjonowanie, już rozszerza działanie.

Jak mogę użyć metody checkLicense() z mojej klasy LicenseCheckActivity?

Oto mój kod:

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(); 

To daje mi następujący błąd:

Cannot instantiate the type LicenseCheckActivity

Oto moja LicenseCheckActivity klasa

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" wydaje się być "statyczne". Może spróbuj z 'LicenseCheckActivity.checkLicense();'. – Mualig

+0

@Mualig Próbowałem Twojego kodu i pojawia się następujący błąd: Nie można utworzyć statycznego odwołania do niestatycznej metody checkLicense() z typu LicenseCheckActivity. Eclipse oferuje szybką naprawę: Zmień modyfikator CheckLicense() na "static".Ale AESOffator używany w licencji checklicense nie przyjmuje statycznych odwołań. – tiptopjat

Odpowiedz

5

Otrzymujesz ten błąd, ponieważ jesteś próbując uzyskać

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

Wprowadź działanie. Nigdy tego nie robisz! Zawsze używaj ActivityManager i Intents do uruchamiania działań i przekazywania informacji między nimi.

Rozwiązanie:

Ponieważ chcesz klasa początkową, aby kontynuować rozszerzenie działalności oraz nie może mieć go przedłużyć LicenseCheckActivity jedyna inna sugestia byłoby przenieść kod w swojej klasie startowej.

Ex:

Take cały kod z LicenseCheckActivity i przenieść go do swojej klasy MainActivity a następnie można nazwać checkLicense() w metodzie onCreate swoich MainActivity

3

państw samouczka rozszerzyć Activity z LicenseCheckActivity .

Przykład:

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(); 
    } 
} 

Ponieważ LicenseCheckActivity rozciąga Activity, klasa ExampleActivity nadal będą dziedziczyć swoje metody Activity jeśli przedłużyć go z LicenseCheckActivity.

Jeśli potrzebujesz klasę ExampleActivity przedłużenia ListActivity, wtedy można mieć LicenseCheckActivity przedłużyć ListActivity zamiast aktywności.

+0

Próbuję tego samego kodu, ale za każdym razem, gdy uruchamia się aplikacja, wyświetla mi tylko wiadomość tostową "Weryfikacja sprawdzania licencji" i rozpoczyna normalnie. nie pokazuje mi dialogu zakupu przedmiotu, ponieważ nie przesłałem go w Google Play. – user2592807

Powiązane problemy