Autore Topic: Controllo Licenza  (Letto 394 volte)

Offline DHD

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    m7
  • Sistema operativo:
    Win 8.1
Controllo Licenza
« il: 27 Dicembre 2014, 18:20:23 CET »
0
Salve a tutti.
Ho creato la mia app e poi aggiunto un paio di donation in cui dovrei eseguire il controllo della licenza...
Ho usato la guida (in sezione tutorial) ma non ci riesco, mi da Error: 6...
Il Log:
Codice (Java): [Seleziona]
12-27 18:03:14.128: E/ActivityThread(21599): Activity it.conf.sense.kernelconfigurator.pro.bronze.Main has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41c48c18 that was originally bound here
12-27 18:03:14.128: E/ActivityThread(21599): android.app.ServiceConnectionLeaked: Activity mia.app.pacchetto.Main has leaked ServiceConnection com.google.android.vending.licensing.LicenseChecker@41c48c18 that was originally bound here
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ContextImpl.bindServiceCommon(ContextImpl.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ContextImpl.bindService(ContextImpl.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.content.ContextWrapper.bindService(ContextWrapper.java)
12-27 18:03:14.128: E/ActivityThread(21599): at com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
12-27 18:03:14.128: E/ActivityThread(21599): at it.conf.sense.kernelconfigurator.pro.bronze.Main.doCheck(Main.java:119)
12-27 18:03:14.128: E/ActivityThread(21599): at it.conf.sense.kernelconfigurator.pro.bronze.Main.onCreate(Main.java:114)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.Activity.performCreate(Activity.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ActivityThread.access$800(ActivityThread.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.os.Handler.dispatchMessage(Handler.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.os.Looper.loop(Looper.java)
12-27 18:03:14.128: E/ActivityThread(21599): at android.app.ActivityThread.main(ActivityThread.java)
12-27 18:03:14.128: E/ActivityThread(21599): at java.lang.reflect.Method.invokeNative(Native Method)
12-27 18:03:14.128: E/ActivityThread(21599): at java.lang.reflect.Method.invoke(Method.java)
12-27 18:03:14.128: E/ActivityThread(21599): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
12-27 18:03:14.128: E/ActivityThread(21599): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
12-27 18:03:14.128: E/ActivityThread(21599): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
12-27 18:03:14.128: E/ActivityThread(21599): at dalvik.system.NativeStart.main(Native Method)

Manifest:
Codice (Java): [Seleziona]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="mia.app.pacchetto"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />
    <permission android:label="Check License" android:name="com.android.vending.CHECK_LICENSE"></permission>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
        </activity>
        <activity android:label="@string/app_name" android:name=".Main"
                       android:theme="@android:style/Theme.Translucent.NoTitleBar">
                        <intent-filter>
                                <action android:name="android.intent.action.MAIN" />
                                <category android:name="android.intent.category.LAUNCHER" />
                        </intent-filter>
                </activity>
    </application>

</manifest>

Main.java:
Codice (Java): [Seleziona]
package it.conf.sense.kernelconfigurator.pro.bronze;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.KeyEvent;
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 Main extends Activity {

        private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
               
                /* (non-Javadoc)
                 * @see com.google.android.vending.licensing.LicenseCheckerCallback#allow(int)
                 */

                @Override
                public void allow(int reason) {
                        // TODO Auto-generated method stub
                        Log.i("License", "Allow");

                        if (isFinishing()) {
                                return;
                        }

                        String id = Utils.getId(getApplicationContext());
                        Log.i("MyLicenseCheckerCallback:allow", id);

                        SharedPreferences.Editor editor = PreferenceManager
                                        .getDefaultSharedPreferences(getBaseContext()).edit();
                        editor.putString("deviceId", id);
                        editor.commit();

                        /* Should allow user access */
                        startMainActivity();
                }

                /* (non-Javadoc)
                 * @see com.google.android.vending.licensing.LicenseCheckerCallback#dontAllow(int)
                 */

                @SuppressWarnings("deprecation")
                @Override
                public void dontAllow(int reason) {
                        // TODO Auto-generated method stub
                        Log.i("License", "DontAllow");

                        if (isFinishing()) {
                                return;
                        }

                        showDialog(0);
                }

                /* (non-Javadoc)
                 * @see com.google.android.vending.licensing.LicenseCheckerCallback#applicationError(int)
                 */

                @Override
                public void applicationError(int errorCode) {
                        // TODO Auto-generated method stub
                        Log.i("License", "Error: " + errorCode);

                        if (isFinishing()) {
                                return;
                        }
                        startMainActivity();
                }
        }

        private LicenseChecker mChecker;
        private LicenseCheckerCallback mLicenseCheckerCallback;

        private static final String BASE64_PUBLIC_KEY = "mia chiave...";

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

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                SharedPreferences preferences = PreferenceManager
                                .getDefaultSharedPreferences(getBaseContext());

                String deviceId = Utils.getId(getApplicationContext());
                Log.i("Main:onCreate", deviceId);

                if (deviceId.equals(preferences.getString("deviceId", ""))) {
                        Log.i("Main:onCreate", "checked license");
                        startMainActivity();
                }

                /* 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);

                doCheck();

        }

        private void doCheck() {
                mChecker.checkAccess(mLicenseCheckerCallback);
        }

        protected Dialog onCreateDialog(int id) {

                return new AlertDialog.Builder(this)
                                .setTitle("unlicensed_dialog_title")
                                .setMessage("unlicensed_dialog_body")
                                .setPositiveButton("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("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", "Destroy Checker");
                        mChecker.onDestroy();
                }

        }

        private void startMainActivity() {
               
                //REPLACE MainActivity.class WITH YOUR APPS ORIGINAL LAUNCH ACTIVITY
                startActivity(new Intent(this, MainActivity.class));
                finish();
        }

        public void toast(String string) {
                Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
        }

}

Utils.java
Codice (Java): [Seleziona]
package it.conf.sense.kernelconfigurator.pro.bronze;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;

public class Utils {

        public static String getId(Context c) {

                StringBuffer b = new StringBuffer();

                b.append(Settings.Secure.getString(c.getContentResolver(),
                                Settings.Secure.ANDROID_ID));
                b.append(Build.BRAND);
                b.append(Build.DEVICE);
                b.append(Build.VERSION.RELEASE);
                b.append(Build.BOARD);
                b.append(Build.ID);

                return md5sum(b.toString());
        }

        public static String md5sum(String s) {

                try {

                        MessageDigest md = java.security.MessageDigest.getInstance("MD5");
                        md.update(s.getBytes());

                        byte resultSum[] = md.digest();

                        StringBuffer hexString = new StringBuffer();

                        for (int i = 0; i < resultSum.length; i++) {
                                String h = Integer.toHexString(0xFF & resultSum[i]);

                                while (h.length() < 2)
                                        h = "0" + h;

                                hexString.append(h);
                        }

                        return hexString.toString();

                } catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                }

                return null;
        }
}

la MainActivity.class è quella che viene creata da Eclipse.

Praticamente non ho importato la libreria com.google.android.vending.lincensing, ma aggiunto tutto nel codice (infatti ho 3 package: com.google.android.vending.lincensing, com.google.android.vending.lincensing.util e quello dell'app.).

Io ora ho un paio di domande: la chiave Base 64 me la da il Play Store, e il SALT ?

Grazie