2012-06-22 15 views
9

Mi aplicación está lista para enviarla ahora pero recientemente he aprendido sobre Licenciamiento.Tutorial de licencia de Android - Paso final

he encontrado un paso a paso por el tutorial en línea: http://twistbyte.com/tutorial/using-the-android-licensing-service-step-by-step

He importado la biblioteca de concesión de licencias en Eclipse y ha creado la clase LicenseCheckActivity como se describe en el tutorial.

Estoy en el último paso del tutorial, punto número 7. El tutorial dice que mi clase debe ampliar LicenseCheckActivity. Sin embargo, la clase en la que me gustaría verificar la licencia ya extiende la Actividad.

¿Cómo puedo usar el método checkLicense() de mi clase LicenseCheckActivity?

Aquí está mi código:

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

Esto me da el siguiente error:

Cannot instantiate the type LicenseCheckActivity

Aquí está mi clase LicenseCheckActivity

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' parece ser' static'. Tal vez intente con 'LicenseCheckActivity.checkLicense();'. – Mualig

+0

@Mualig He intentado con su código y aparece el siguiente error: No se puede hacer una referencia estática al método no estático checkLicense() del tipo LicenseCheckActivity. Eclipse ofrece una solución rápida: Cambie el modificador de CheckLicense() a 'estático'.Pero el AESObfuscator utilizado en checklicense no acepta referencias estáticas. – tiptopjat

Respuesta

5

Usted está recibiendo este error, ya que son tratando de

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

Instance an activity. ¡Nunca haces esto! Utilice siempre ActivityManager y Intents para iniciar actividades y pasar información entre ellos.

La solución:

Puesto que usted quiere que su clase de inicio para continuar ofreciendo actividad y no se puede tener extender LicenseCheckActivity la única otra sugerencia sería mover el código en tu clase de inicio.

Ex:

Tome todo el código de su LicenseCheckActivity y moverlo en su clase MainActivity y entonces usted puede llamar checkLicense() en el método onCreate de sus MainActivity

3

Los estados tutoriales para extender su Activity con LicenseCheckActivity .

Ejemplo:

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

Debido ActivityLicenseCheckActivity se extiende, la clase ExampleActivity todavía heredará sus métodos Activity si se amplía con LicenseCheckActivity.

Si necesita que su clase ExampleActivity extender ListActivity, entonces usted podría tener LicenseCheckActivity se extienden ListActivity en lugar de la actividad.

+0

estoy intentando el mismo código pero cada vez que la aplicación se inicia solo me muestra el mensaje de tostado "Verificación de verificación de licencia" y se inicia normalmente. no me muestra el diálogo del artículo de compra ya que no lo subí al google play. – user2592807

Cuestiones relacionadas