Autore Topic: [facile] Creare una applicazione donate/pro  (Letto 4776 volte)

Offline mangusto

  • Utente normale
  • ***
  • Post: 152
  • Respect: +5
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    ZTE Blade
  • Play Store ID:
    Leonardo Preti
  • Sistema operativo:
    Windows 7
[facile] Creare una applicazione donate/pro
« il: 02 Novembre 2011, 22:21:17 CET »
+2
Livello di difficoltà: medio
Target SDK: 8
Min SDK: 4
Link al file compresso del progetto eclipse: file in allegato

Questo breve tutorial serve a spiegare come realizzare un app che permette di sbloccare contenuti esclusivi in un'altra app; solitamente si utilizza questo metodo per creare una piccola app da mettere a pagamento che permette l'accesso a sezioni aggiunti in una app principale free oppure per togliere i banner.
Il metodo più semplice sarebbe far verificare all'app principale se esiste la app a pagamento, ma in questo modo chiunque può compilare un pacchetto con lo stesso nome della nostra app pro per eludere il nostro sistema di verifica; ciò che ci può aiutare per evitare i truffaldini è mandare un intent dall'app principale e ottenere un valore di ritorno dall'app a pagamento.

Tutte le spiegazioni sono nei commenti
Sorgenti:
MainActivityFree
Codice (Java): [Seleziona]
package la.mia.applicazione.free;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivityFree extends Activity {

        // Definiamo un booleano per identificare se abbiamo la versione pro o no.
        // E' definito falso perchè di default questa è la versione gratis
        // dell'applicazione
        static boolean IS_PRO = false;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                /*
                 * Cliccando sul bottone andiamo ad attivare la procedura di sblocco
                 * delle funzionalità
                 */

                Button btn_check = (Button) findViewById(R.id.btn_sblocca);
                btn_check.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                /*
                                 * Controllo esistenza app pro: entra nell'if solo se IS_PRO è
                                 * ancora false, quindi non è ancora stata rilevata la app pro
                                 */

                                if (!IS_PRO) {

                                        // Creiamo un intent che attiva il main dell'app pro
                                        Intent pro_app = new Intent("android.intent.action.MAIN");
                                        /*
                                         * unflattenFromString va definito con la struttura
                                         * ("pacchetto/classe")
                                         */

                                        pro_app.setComponent(ComponentName
                                                        .unflattenFromString("la.mia.applicazione.pro/.MainActivityPro"));
                                        pro_app.addCategory("android.intent.category.LAUNCHER");
                                        /*
                                         * Aggiungiamo al nostro intent un codice di controllo; può
                                         * essere qualunque codice, io ne ho creato uno di tipo MD5
                                         * che è a 128 bit e non permette di risalire alla stringa
                                         * che ha originato il codice
                                         */

                                        pro_app.putExtra("la.mia.applicazione.free.codice",
                                                        "f85a78dd6672f014d4a3c57b0a7dc016");

                                        /*
                                         * Facciamo partire uno startActivityForResult, che avvia e
                                         * ottiene un valore di ritorno da un altra activity
                                         */

                                        try {
                                                /*
                                                 * startActivityForResult ha come parametri l'intent da
                                                 * avviare e un requestCode che deve essere >= 0. Per
                                                 * questo esempio impostiamo il valore 0
                                                 */

                                                startActivityForResult(pro_app, 0);
                                                Log.d("ProApp", "startActivityForResult avviato correttamente");
                                        }
                                        /*
                                         * startActivityForResult prevede che l'activity possa non esistere,
                                         * quindi il catch DEVE essere definito
                                         */

                                        catch (ActivityNotFoundException e) {
                                                Log.w("ProApp", "ATTENZIONE! La versione pro non esiste!");
                                        }

                                }

                        }
                });

                /*
                 * Per verificare se la procedura ha avuto successo clicchiamo sul
                 * bottone che cambia il testo nella textview a seconda della situazione
                 */

                final TextView txt_pro = (TextView) findViewById(R.id.txt_sonopro);
               
                Button btn_pro = (Button) findViewById(R.id.btn_sonopro);
                btn_pro.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                               
                                if(IS_PRO)
                                        txt_pro.setText("Sei nella versione pro");
                                else
                                        txt_pro.setText("Sei nella versione free");
                        }
                });

        }

        /*
         * Otteniamo il valore di ritorno dall'app pro ed eventuali dati passati con
         * l'intent di ritorno
         */

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == RESULT_OK && requestCode == 0) {
                        Log.d("ProApp", "Sbloccate le funzionalità pro");
                        IS_PRO = true;
                }
        }
}

main.xml (della app free)
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >


    <Button
       android:id="@+id/btn_sblocca"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:text="Sblocca funzionalità aggiuntive" />

    <RelativeLayout
       android:id="@+id/relativeLayout1"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content" >

        <Button
           android:id="@+id/btn_sonopro"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Sono pro?" />

        <TextView
           android:id="@+id/txt_sonopro"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentRight="true"
           android:layout_centerVertical="true"
           android:layout_marginRight="20dp"
           android:textAppearance="?android:attr/textAppearanceMedium" />

    </RelativeLayout>

</LinearLayout>

MainActivityPro
Codice (Java): [Seleziona]
package la.mia.applicazione.pro;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivityPro extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                // Controllo del codice mandato dalla app principale
                Log.d("ProApp", "Activity MainActivityPro avviata");

                // Recupero delle informazioni inviate
                Bundle bundle = this.getIntent().getExtras();
                String check_Code = new String("");

                if (bundle != null)
                        // Otteniamo il codice di controllo
                        check_Code = bundle.getString("la.mia.applicazione.free.codice");

                if (check_Code.equals("f85a78dd6672f014d4a3c57b0a7dc016")) {
                        // Se il codice è corretto inviamo la risposta RESULT_OK e chiudiamo l'activity
                        Intent retcode = new Intent();
                        setResult(RESULT_OK, retcode);
                        Log.d("ProApp", "Inviato codice di ritorno");
                        finish();
                }
        }
}



Spero sia sufficientemente chiaro, per dubbi e chiarimenti lasciate un commento!
« Ultima modifica: 03 Novembre 2011, 10:04:41 CET da mangusto »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Creare una applicazione donate/pro
« Risposta #1 il: 04 Novembre 2011, 13:43:36 CET »
0
Aggiungerei che a questo punto è necessario offuscare il codice con Proguard altrimenti credo diventi facile crakkarla...

Offline wariat

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc magic
  • Sistema operativo:
    Windows
Re:[facile] Creare una applicazione donate/pro
« Risposta #2 il: 17 Novembre 2011, 23:44:34 CET »
0
Grazie.. era proprio quello che cercavo..  :-)