Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

...

...

...

...

...

Introduction

This document explains how to add the Appoxee code to your application code (step 3 of the Appoxee Android SDK integration process).

Info
titleUsing Google Play Services

If you choose to use Google Play Services, you need to know the following :

  1. To test your app when using the Google Play services SDK, you must use either:

    • A compatible Android device that runs Android 2.3 or higher and includes Google Play Store.
    • The Android emulator with an AVD that runs the Google APIs platform based on Android 4.2.2 or higher.
  2. To make the Google Play services APIs available to your app:

    1. Copy the library project at <android-sdk>/extras/google/google_play_services/libproject/google-play-services_lib/ to the location where you maintain your Android app projects.
    2. Import the library project into your Eclipse workspace (if you use Eclipse) : Click File > Import, select Android > Existing Android Code into Workspace, and browse to the copy of the library project to import it.
    3. In your app project, reference Google Play services library project.

      Note: You should be referencing a copy of the library that you copied to your development workspace—you should not reference the library directly from the Android SDK directory.

    4. Use the AndroidManifest.xml written below for GooglePlayServices integration
  3. To prevent ProGuard from stripping away required classes, add the following lines in the<project_directory>/proguard-project.txt file:

     

    Code Block
    languagetext
    titleProGuard
    -keep class * extends java.util.ListResourceBundle {
        protected Object[][] getContents();
    }
    
    -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
        public static final *** NULL;
    }
    
    -keepnames @com.google.android.gms.common.annotation.KeepName class *
    -keepclassmembernames class * {
        @com.google.android.gms.common.annotation.KeepName *;
    }
    
    -keepnames class * implements android.os.Parcelable {
        public static final ** CREATOR;
    }



 

...

  • Regular text - existing code: You should already have this code in your project by default. No changes are required.
  • Bold text - new code: Make sure you add this Appoxee code to your app code.
  • Green text - comments: A comment describes the code that follows it and notes special issues you should pay attention to. Please read the comments carefully.
  • Blue text - AndroidManifest.xml updatesThe changes you should make in the app's AndroidManifest.xml file.

Integration Instructions

The integration has two parts:

...

Note

Eclipse Users : When compiling a production APK file with ProGuard and Appoxee , enter the following lines into the file "proguard-project.txt"

Code Block
languagetext
titleProGuard in Eclipse
linenumberstrue
-dontwarn
# OrmLite uses reflection
-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }
-keepattributes Signature
-keepattributes *Annotation*
-keepclassmembers class * { public <init>(android.content.Context); }

 

In order to avoid these additions in each activity, you can simply extend AppoxeeBaseActivity instead of Activity. (AppoxeeBaseActivity extends Android’s FragmentActivity and contains the onStart() & onStop() calls)


 

Source code integration

Option A: Explicit Integration (with Observer) : 

  1. Your MainActivity needs to extend AppoxeeBaseActivity and implement AppoxeeObserver
  2. Your MainActivity onCreate() method should contain this code : 

     

    Code Block
    languagejava
    titleonCreate()
    linenumberstrue
    ...
    new initAsync(getApplicationContext(),"APP_KEY",
                         "SECRET_KEY", "com.package.MainActivity" , true, this).execute();
    AppoxeeManager.setDebug(true);
    Appoxee.parseExtraFields(getIntent().getExtras());
    setContentView(R.layout.main);
    ...
    
    

     

     

  3. Make sure that the following methods are implemented and contain Appoxee's method calls :

    Code Block
    languagejava
    linenumberstrue
        @Override
        protected void onResume()
        {
         super.onResume();
         // If Inbox implemented and you have a method for updating your inbox's 
         // Badge
         updateMsgBadge();
        }
    
    
     @Override
     public void onRegistrationCompleted() {
      // TODO Auto-generated method stub
         Utils.Debug("Can perform all API Calls");
     }
    
    
     @Override
     public void onMessagesUpdateCompleted() 
     {
     // If Inbox implemented and you have a method for updating your inbox's 
     // Badge
        Utils.Debug("Can update Badge");
        updateMsgBadge();
     }
    
    
    

     

     

    Note

    To fully use Appoxee’s Analytics , all of your activities should implement onStart() & onStop in the actvities code :

    Code Block
    languagejava
    linenumberstrue
    @Override 
    protected void onStart()
    {
       super.onStart();
       Appoxee.onStart();
    }
        
    @Override
    protected void onStop()
    {
       super.onStop();
       Appoxee.onStop();
    }
    
    
    

     

     

    In order to avoid these additions in each activity, you can simply extend AppoxeeBaseActivity instead of Activity. (AppoxeeBaseActivity extends Android’s FragmentActivity and contains the onStart() & onStop() calls)

    Option B: Implicit Integration (without using Observer)

    1. In your main activity class onCreate() method enter the following code :

      Code Block
      languagejava
      linenumberstrue
      ...
      new initAsync(getApplicationContext(),"APP_KEY",
                           "SECRET_KEY", true, "com.package.MainActivity").execute();
      AppoxeeManager.setDebug(true);
      Appoxee.parseExtraFields(getIntent().getExtras());
      setContentView(R.layout.main);
      ...
      
      

       

       

    2. Make sure that the following methods are implemented and contain Appoxee's method calls :

       

      Code Block
      languagejava
      linenumberstrue
      @Override  
      protected void onStart() 
      {
         super.onStart();
         Appoxee.onStart();
      }
      
      @Override
      protected void onStop()
      {
         super.onStop();
         Appoxee.onStop();
      }
      
      @Override       
      protected void onNewIntent(Intent intent) 
      {
         super.onNewIntent(intent);
         Bundle bundle = intent.getExtras();
         Appoxee.parseExtraFields(bundle);
      }
      
      @Override 
      protected void onResume()
      {
        super.onResume();
        // If Inbox implemented and you have a method for updating your inbox's 
        // Badge
        updateMsgBadge();
      }
      
      

       

       

      Note

      When Integrating Appoxee and choosing not to use an Observer, All Appoxee API Calls will fail unless implementing a thread that will sample the flag

      Appoxee.isReady()==true. Only then will the API Calls will execute (Tags,Alias... )


      Note

      To fully use Appoxee’s Analytics , all of your activities should implement onStart() & onStop in the actvities code :

      Code Block
      languagejava
      linenumberstrue
      @Override 
      protected void onStart()
        {
         super.onStart();
         Appoxee.onStart();
        }
          
      @Override
      protected void onStop()
        {
         super.onStop();
         Appoxee.onStop();
        }
      
      

      In order to avoid these additions in each activity, you can simply extend AppoxeeBaseActivity instead of Activity. (AppoxeeBaseActivity extends Android’s FragmentActivity and contains the onStart() & onStop() calls)

     

Manifest Integration and Advanced Options (Inbox / DeepLink (URLScheme) ) :

  1. If prompted with an error, add this "Import" command to enable Appoxee SDK usage:

    Code Block
    languagejava
    linenumberstrue
    import com.appoxee.Appoxee; 
  2. AndroidManifest.xml Updates - Make the following changes to your app's AndroidManifest.xml file:

    Warning
    titleAndroidManifest.xml versionName & versionCode

    In your AndroidManifest.xml you must enter values for android:versionName , android:versionCode . Since in some cases gradle-based script aren't merging the values into the manifest while building the APK, it has to be done manually. This will allow smooth registration process and the ability to create message segments based on your application's version.


    1. GCM requires Android 2.2 or later. If your app cannot work without GCM, add the following line, where "xx" is the latest target SDK version:

      Code Block
      languagexml
      linenumberstrue
      <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx" />  


      Note
      If your application is intended for android version 4.1 or above (that is, minSdkVersion 16), the next step (2.b.) is not required.
      In this case, please skip the next step and proceed to step 2.c.
    2. Declare and use a custom permission, so only this application can receive GCM messages:

      Code Block
      languagexml
      linenumberstrue
      <permission android:name="com.appoxee.example.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
      <uses-permission android:name="com.appoxee.example.permission.C2D_MESSAGE" />


       

      Note

      You must replace "com.appoxee.example" with your app's package name, as defined by the manifest tag, otherwise it will not work.

    3. To allow your app to use Google's Push Notification Service (GCM), add the following permissions: 

      Code Block
      languagexml
      linenumberstrue
      <!-- This app has permission to register and receive message -->
      <!-- App receives GCM messages. -->
      <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
      <!-- GCM connects to Google Services. -->
      <uses-permission android:name="android.permission.INTERNET" /> 
      <!-- GCM requires a Google account. -->
      <uses-permission android:name="android.permission.GET_ACCOUNTS" />
      <!-- Keeps the processor from sleeping when a message is received. -->
      <uses-permission android:name="android.permission.WAKE_LOCK" />


       

    4. In the manifest file's Application element, make sure your app has the name it has in your class file:

      Code Block
      languagexml
      linenumberstrue
      <application android:label="@string/app_name"
      android:icon="@drawable/ic_launcher"
      android:allowClearUserData="true"
      android:enabled="true" android:name="MyApplication"/> 

       

       

      The class that extends "Application" that is the name that needs to be in the "MyApplication".
      Example:
      If the package name is "com.david.coolapps" and the class that extends Application is named "MyApp"
      then in the Application tag the "name" value is : "com.david.coolapps.MyApp" . 


      <application
      android:name="com.david.coolapps.MyApp"
      ..... >

       

    5.  Add the following child element to your Application element (remember you must replace "com.appoxee.example" with your app's package name, as defined by the manifest tag):

      Code Block
      languagexml
      linenumberstrue
              <!-- REQUIRED for C2DM -->
              <service android:name="com.appoxee.gcm.PlayIntentService" >
              </service>
      
              <receiver android:name="com.appoxee.listeners.OnCoppaReciever" />
              <receiver
                  android:name="com.appoxee.gcm.PlayBroadcastReceiver"
                  android:permission="com.google.android.c2dm.permission.SEND" >
      
                  <!-- Receive the actual message -->
                  <intent-filter>
                      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                      <category android:name="com.appoxee.example" />
                  </intent-filter>
      
                  <!-- Receive the registration id -->
                  <intent-filter>
                      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                      <category android:name="com.appoxee.example" />
                  </intent-filter>
              </receiver>
      		<!-- Must have for Push Support by Appoxee --> 
      		<activity android:name ="com.appoxee.activities.InboxMessage"/>
      Note

      If you are using Appoxee's SDK as a "Push Only" solution (without using the Inbox that enables Rich Messages), this completes the integration procedure within the AndroidManifest.xml file.
      Please continue to step 5 to complete the rest of the integration by adding your java code

       


    6. To enable Appoxee's in-app inbox, and other advanced features, add the following code inside your Application element:

      Code Block
      languagexml
      linenumberstrue
      <activity android:name="com.appoxee.activities.Inbox"/>
      <activity android:name="com.appoxee.activities.MoreApps"/>
      <activity android:name="com.appoxee.activities.Feedback"/> 
      <!-- Add if missing from Push Integration -->
      <activity android:name ="com.appoxee.activities.InboxMessage"/>

       

      Note

      The Inbox feature guarantees your ability to engage the user with rich messages (note that the Inbox cannot be disabled by users, as opposed to Push Notifications) and gives you the option to access features such as Feedback and More Apps . The Inbox must be used in your application's code in order to show it and utilize its features. The InboxMessage activity needs to be added in order to support Push Notifications by Appoxee. Check your Manifest.xml and see that it is added below the Receiver declaration.

       

       

      This is a Sample AndroidManifest.xml Code Block using Google Play Services
      Code Block
      languagexml
      themeEclipse
      titleAndroidManifest - PlayServices Integration
      linenumberstrue
      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      
          package="com.appoxee.example"
          android:versionCode="25"
          android:versionName="2.2" >
      
          <uses-sdk
              android:minSdkVersion="9"
              android:targetSdkVersion="23" />
      
          <!-- REQUIRED -->
          <uses-permission android:name="android.permission.INTERNET" />
          <uses-permission android:name="android.permission.VIBRATE" />
          <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
      
          <!-- REQUIRED for C2DM -->
          <!-- Only this application can receive the messages and registration result -->
          <permission
              android:name="com.appoxee.example.permission.C2D_MESSAGE"
              android:protectionLevel="signature" />
      
          <uses-permission android:name="com.appoxee.example.permission.C2D_MESSAGE" />
      
          <!-- This app has permission to register and receive message -->
          <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
          <uses-permission android:name="android.permission.GET_ACCOUNTS" />
          <uses-permission android:name="android.permission.WAKE_LOCK" />
          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
          
          <application
              android:name="com.appoxee.example.AppoxeeExample"
              android:allowBackup="true"
              android:allowClearUserData="true"
              android:enabled="true"
              android:hardwareAccelerated="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:launchMode="singleTask" >
      
              <!-- This app uses GooglePlayServices.jar -->
              <meta-data android:name="com.google.android.gms.version"   
                 android:value="@integer/google_play_services_version" />
              <activity
                  android:name="com.appoxee.example.AppoxeeExampleActivity"
                  android:label="@string/app_name" >
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
      
              <!-- REQUIRED for C2DM -->
              <service android:name="com.appoxee.gcm.PlayIntentService" >
              </service>
      
              <receiver android:name="com.appoxee.listeners.OnCoppaReciever" />
              <receiver
                  android:name="com.appoxee.gcm.PlayBroadcastReceiver"
                  android:permission="com.google.android.c2dm.permission.SEND" >
      
                  <!-- Receive the actual message -->
                  <intent-filter>
                      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                      <category android:name="com.appoxee.example" />
                  </intent-filter>
      
                  <!-- Receive the registration id -->
                  <intent-filter>
                      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                      <category android:name="com.appoxee.example" />
                  </intent-filter>
              </receiver>
      
              <!-- OPTIONAL, if you want to receive push, push opened and registration completed intents -->
              <activity android:name="com.appoxee.activities.Inbox" >
              </activity>
              <activity android:name="com.appoxee.activities.SplashScreen" >
              </activity>
              <activity android:name="com.appoxee.activities.MoreApps" >
              </activity>
              <activity android:name="com.appoxee.activities.Feedback" >
              </activity>
              <activity android:name="com.appoxee.activities.InboxMessage" >
              </activity>
      
          </application>
      
      </manifest>
       This completes the AndroidManifest.xml file updates. The remaining updates are made in your app code.


  3. Inbox integration - after enabling the Inbox in your Appoxee account (by going to the app's Application Information page and checking Allow Inbox + Rich messages), add the Inbox to your code as follows: 

    1. Add code that opens the Inbox - the Inbox can be opened from any activity. In the example code below, the Inbox is opened from the main activity layout, using the "openInbox():" function:

      Code Block
      languagejava
      linenumberstrue
      public void openInbox(View view)
      { 
       Intent intent = new Intent(this, Inbox.class);
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
       this.startActivity(intent);
      } 

       


       

    2. Add a button that opens the Inbox - it is recommended to add a button to open the Inbox. This button is added in the activity layout as follows:

      Code Block
      languagexml
      linenumberstrue
      <Button 
      android:id="@+id/open_inbox" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="openInbox"
      android:text="Open Appoxee Inbox" /> 

       

       

    3. Show the number of unread messages - to show the user the number of unread messages, fetch this number using the following command:

      Code Block
      languagejava
      linenumberstrue
      Appoxee.getUnreadMessages(); 

       

       

  4. Deep Link / URL Scheme in Appoxee&Android

    1. Add to your AndroidManifest.xml

      Code Block
      languagexml
      linenumberstrue
      <activity android:name="com.appoxee.example.DeepLinkActivity" >
         <!-- Add the Intent Filter for activity needed to be URLScheme compatible -->
         <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.BROWSABLE" />
                 <data android:scheme="example"
      				 android:host="pushnotification" />
          </intent-filter>
      </activity>

       

       

    2. Create DeepLinkActivity.java

      Code Block
      languagejava
      titleDeepLink Activity Sample
      linenumberstrue
      //This sample extends AppoxeeBaseActivity, for onStart() & onStop() integration and analytics
      public class DeepLinkActivity extends AppoxeeBaseActivity {
      
       @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Intent intent = getIntent();
            if (intent == null || intent.getData() == null) {
                    finish();
            }
      
            openDeepLink(intent.getData());
      
            // Finish this activity
            finish();
         }
         
         public void openDeepLink(Uri deepLink) {
          String path = deepLink.getPath();
          Utils.Debug("Base path: " + path);
          //Implement your Code here
          path = path.replace("/", "");
      
      
          Intent intent = new Intent();
          intent.setClassName(this, path);
          this.startActivity(intent);      
         } .....
      
      
      

...