Pro Key erstellen

  • 9 Antworten
  • Letztes Antwortdatum
ui_3k1

ui_3k1

Gesperrt
197
Hey Leute, ich versuche gerade einen Pro-Key für eine App zu erstellen. Ihr kennt ja sicher das Prinzip: Wer den Schlüssel hat, hat zB Zugriff auf mehr Einstellungen etc.

Und darum gehts mir auch. Ich möchte anhand von den installieren Paketdateien herausfinden, ob der "Pro-Schlüssel" hinterlegt ist -> es tut sich dabei rein gar nichts...
Ich kann sogar meine Aufrufe ineinander vertauschen und es gibt keine Veränderung in der App - nicht mal einen Fehler Oo

Habe es schon mit Neuinstallationen und verschiedensten Kombinationen (zB Key zu erst installiert) versucht -> nichts!

Ist schon mega ärgerlich, wenn man vorher wochenlang an einem Projekt sitzt und dann so ein Mist einen noch aufhält.

Wie löst ihr das Ganze? Die Methode mit den In-App-Billings stellt für mich derzeit auch keine Alternative da, da ich die Hälfte der Google Doku durchgearbeitet hab und da schon mehrfach das komplette Projekt abgeschmiert ist.

Meine Code für den Pro-Schlüssel sieht so aus (in der onCreate der Preference Activity):

Code:
    if (isProInstalled(this)) {
            addPreferencesFromResource(R.xml.settingsactivity);
            PreferenceManager.setDefaultValues(SettingsActivity.this,
                    R.xml.settingsactivity, false);
            for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
                initSummary(getPreferenceScreen().getPreference(i));
            }
        } else {
            addPreferencesFromResource(R.xml.settingsactivity_pro);
            PreferenceManager.setDefaultValues(SettingsActivity.this,
                    R.xml.settingsactivity_pro, false);
            for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
                initSummary(getPreferenceScreen().getPreference(i));
            }
        }
    }

Besten Dank vor ab und wie immer
 
Ich würde es mit in App käufen machen.
Share preference sind viel zu leicht mit root zu bearbeiten denke ich.

LG. Dagobert

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: ui_3k1
Wieso SharedPreferences?
Was passiert denn in der isProInstalled(this)?

Wenn du nach einem Package suchst, dieses installiert ist und dann entsprechend die Pro-Version einstle, sehe ich da eher weniger ein problem.
Außer natürlich, dass man das Pro-Package einfach selbst erstellen kann (also beliebige app mit dem üpackage namen die rein gar nichts macht) und installieren -> Pro are welcome ;)

Deshalb, wenn du es so machen willst, würde ich machen, dass die Pro-Version einmal aufgerufen werden muss und über ein Intent nochmal eine "Registrierung" an deine Haupt-App schickt... Keine Ahnung, da kann ne Kombination aus Uhrzeit + Geräte-Typ + Unixtimestep/5*12 sein... :)

Gruß
 
  • Danke
Reaktionen: ui_3k1
Okay,
ja das stimmt. Allerdings komme ich ehrlich gesagt nicht großartig weiter bei den In-App Käufen... Habe zwei Abende mehr oder weniger beherzt versucht die zu implementieren und letzten Endes doch wieder zwei apks ("normal" und "pro") erstellt.. Ich komme mit der Google Dokumentation gar nicht klar :-/

Wenn du eine gute Anleitung kennst, gerne her damit :)

btw: ich bin mal den Communities aus deiner Signatur beigetreten.


Code:
protected boolean isProInstalled(Context context) {
  // the packagename of the 'key' app
  String proPackage = "org.yoki.android.pkgname";

  // get the package manager
  final PackageManager pm = context.getPackageManager();

  // get a list of installed packages
  List<PackageInfo> list = pm.getInstalledPackages(PackageManager.GET_DISABLED_COMPONENTS);

  // let's iterate through the list
  Iterator<PackageInfo> i = list.iterator();
  while(i.hasNext()) {
    PackageInfo p = i.next();
    // check if proPackage is in the list AND whether that package is signed
    //  with the same signature as THIS package
    if((p.packageName.equals(proPackage)) &&
       (pm.checkSignatures(context.getPackageName(), p.packageName) == PackageManager.SIGNATURE_MATCH))
      return true;
  }
  return false;
}

So in der Form wollte ich es implementieren... (wobei ich meinen originalen Code nicht mehr habe). Auch wenn ich es aktuell nicht mehr brauche, interessiert es mich immer noch brennend wie es funktioniert bzw. das mit den in-app-käufen auch. :rolleyes2:
 
Zuletzt bearbeitet:
Also ich habe jetzt gerde mal das inapp billing der v3 angefangen durchzuarbeiten...

Wo genau hackt es denn bei dir?

lg. Dagobert
 
DagobertDokate schrieb:
Also ich habe jetzt gerde mal das inapp billing der v3 angefangen durchzuarbeiten...

Wo genau hackt es denn bei dir?

lg. Dagobert


Hehe, vielleicht sollte ich das auch erstmal unabhängig von der Implementierung durcharbeiten..

In der Google Doc. "Implementing In-app Billing" ab der Stelle wo das Array für die Items angelegt wird, komme ich nur noch schwer mit. Generell fehlt mir glaube ich so der Überblick, wie eine "funktionstüchtige Lösung" aussehen soll.. also wo welche Funktion aufgerufen werden soll..
 
Hehe, vielleicht sollte ich das auch erstmal unabhängig von der Implementierung durcharbeiten..
Jaein, ich würde die Seiten dazu drucharbeiten, gerade die wo das Beispiel erklärt wird, dabei das Beispiel auschecken und ein bisschen durchgucken... dann die Helper Klassen ins eigenen Projekt kopieren... die erste Quick&Dirty Version bis etwas funktioniert sind dann nur noch minuten ;)
Das ist bei mir gestern auf die schnelle raus gekommen:
Code:
/**
 * 
 * @author DagobertDokate
 * @since 10.08.2012
 */
public class MainMenuActivity extends Activity implements OnClickListener {
    private static final String TAG = MainMenuActivity.class.getSimpleName();
    private Sound select;
    private AndroidOption om;

    static final String SKU_PREMIUM = "premium";

    private IabHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_menul_layout);
        AndroidAudio audio = new AndroidAudio(this);
        if (select == null) {
            select = audio.newSound("sound/select.mp3");
        }

        if (om == null) {
            om = new AndroidOption(this);
        }

        TextView starten = (TextView) findViewById(R.id.gameStartButton);
        starten.setOnClickListener(this);

        TextView finish = (TextView) findViewById(R.id.finishButton);
        finish.setOnClickListener(this);

        TextView premium_btn = (TextView) findViewById(R.id.premium_btn);
        premium_btn.setOnClickListener(this);

        String base64PublicKey = "KEY_AUS_CONSOLE";
        Log.i(TAG, "Set up inapp billing");
        helper = new IabHelper(this, base64PublicKey);

        helper.startSetup(onIabSetupFinishedListener);
    }

    private QueryInventoryFinishedListener queryFinishListener = new QueryInventoryFinishedListener() {
        @Override
        public void onQueryInventoryFinished(IabResult result, Inventory inv) {
            Log.i(TAG, "Check items");
            if (result.isFailure()) {
                Log.e(TAG, "Error: " + result.getMessage());
                return;
            }
            if (inv.hasPurchase(SKU_PREMIUM)) {
                Log.i(TAG, "has preium");
                TextView premium_btn = (TextView) findViewById(R.id.premium_btn);
                premium_btn.setVisibility(View.GONE);
            }
        }
    };

    private OnIabSetupFinishedListener onIabSetupFinishedListener = new OnIabSetupFinishedListener() {

        @Override
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                // FIXME Fehlerbehandlung
                Log.e(TAG,
                        "Problem setting up in-app Billing: "
                                + result.getMessage());
                return;
            }
            Log.i(TAG, "Success");
            List<String> skus = new LinkedList<String>();
            skus.add(SKU_PREMIUM);
            helper.queryInventoryAsync(true, skus, queryFinishListener);
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        select.dispose();
        if (helper != null) {
            helper.dispose();
            helper = null;
        }
    }

    @Override
    public void onClick(View v) {
        select.play(om.getEffectVolume());
        Intent intent;
        switch (v.getId()) {
        case R.id.gameStartButton:
            intent = new Intent(this, GameCreateActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            startActivity(intent);
            break;
        case R.id.finishButton:
            finish();
            break;
        case R.id.premium_btn:
            buyPremium();
            break;
        }
    }

    private void buyPremium() {
        Log.i(TAG, "Buy premium");
        helper.flagEndAsync();
        helper.launchPurchaseFlow(this, SKU_PREMIUM, 10001,
                new OnIabPurchaseFinishedListener() {
                    @Override
                    public void onIabPurchaseFinished(IabResult result,
                            Purchase info) {
                        Log.v(TAG, "onIabPurchaseFinished");
                        if (result.isFailure()) {
                            Log.e(TAG, "Error purchase: " + result.getMessage());
                        } else if (info.getSku().equals(SKU_PREMIUM)) {
                            TextView premium_btn = (TextView) findViewById(R.id.premium_btn);
                            premium_btn.setVisibility(View.GONE);
                        }
                    }
                }, "");
    }
 
  • Danke
Reaktionen: ui_3k1
Mal ne dumme Frage:

Code:
if (isProInstalled(this)) {
   addPreferencesFromResource(R.xml.settingsactivity);
...
else {
   addPreferencesFromResource(R.xml.settingsactivity_pro);
}

Wenn pro installiert ist, wird also das NICHT-PRO-Layout benutzt? Absicht? :rolleyes2:
 
Also ich hab jetzt mal die Würfelsiedler-App mit einem Premium Key ausgestattet, und hatte eigentlich keine Probleme, auser das Google endlos lange braucht um Konsolen Änderungen zu überhnemen.

Ich muss das ganze heute abend nochmal "Testen", sprich einmal jemanden finden der es wirklich durchzieht... aber wenn es klapp kann ich den Final Code einfach mal posten...

Ich habe mich einfach an das Google Beispiel gehalten...

lg. Dagobert
https://plus.google.com/u/0/communities/107196196892364289570
 
  • Danke
Reaktionen: ui_3k1
@Tom299: das kam daher, dass ich testen wollte ob überhaupt etwas passiert... ich habe die Funktionen mehrfach umgestellt.
(Logcat hat in der Klasse nichts ausgegeben oO - wobei das ja eigentlich auch nicht sein kann. war irgendwann spät in der Nacht und meine Laune zu der Zeit auch nicht die beste :) )
Ich teste das heute Abend auch nochmal... :)
 

Ähnliche Themen

Jennywise
Antworten
2
Aufrufe
675
Jennywise
Jennywise
Zurück
Oben Unten