Google License checker

當開發者的app是付費軟體時,最令開發者頭痛的應該就是盜版的問題了,使用者可以經由其他的軟體,輕鬆的將apk檔複製出來,並且將apk檔複製給親朋好友,甚至是放上論壇散播,開發者的辛苦就毀於一旦了。

但是Google還是對開發者有所保護的,Google提供了一個解決方法給開發者,開發者可以將Google提供的library加入自己的app中,並且在app運行時,連上Google play確定該使用者是否已購買此app,取得了授權狀態後,開發者可以禁止該使用者開啟app或封鎖某些功能,這個服務Google稱之為App Licensing,Google官方提供了非常詳細的文件,但落落長的英文文件並不是大家都看得下去的,在這將我開發且可以正常運行的經驗分享出來,大家交流交流。

  1. 取得BASE64_PUBLIC_KEY
    首先上傳一個版本的apk到Google play Developer console,即可建立該app的後台,但注意先不要發佈,然後從後台取得該app的BASE64_PUBLIC_KEY,取得的位置如下,紅框框那一大串複製到你的code裡面就對了app licensing get public key
  2. 下載License Verification Library (LVL)
    要使用Google大神的東西當然要先下載,只要使用Android SDK Manager就可以下載到
    app licensing download lvl
  3. Import LVL
    LVL下載下來後會放在<sdk>/extras/google/market_licensing/library/,先把他import到你工作的workspace,並設為app的library

    app licensing import library 1
    app licensing import library 2
  4. 在App裡加入Licensing
    • AndroidManifest.xml加入uses-permission
      <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
      
    • 在Activity中加入一個inner class,實現LVL的LicenseCheckerCallback
      由於此函示不在Main Thread,所以Google回傳認證的狀態後需要發送Message到Handler

      public class GoogleLicenseCheckerCallback
               implements LicenseCheckerCallback {
      
          @Override
          public void allow(int reason) {
              /* License check成功,使用者有購買 */
              if (isFinishing()) {
                  /* 這裡表示Activity正在關閉
                     確保關閉中不要動到UI */
                  return;
              }
              Message msg = new Message();
              msg.what = LICENSE_ALLOWED;
              mHandler.sendMessage(msg);
          }
      
          @Override
          public void dontAllow(int reason) {
              /* License check失敗
                 使用者沒購買或網路狀況錯誤 */
              if (isFinishing()) {
                  /* 這裡表示Activity正在關閉
                     確保關閉中不要動到UI */
                  return;
              }
              Message msg = new Message();
              msg.what = LICENSE_NOT_ALLOWED;
              mHandler.sendMessage(msg);
          }
      }
      
    • Activity中加入Handler
      Handler收到GoogleLicenseCheckerCallback傳來的Message,再做後續的動作

      public static class CheckerHandler extends Handler {
          @Override
          public void handleMessage(Message msg) {
              switch (msg.what) {
              case LICENSE_ALLOWED:
                  /* 這裡做認證成功後的動作 */
                  break;
              case LICENSE_NOT_ALLOWED:
                  /* 這裡做認證失敗後的動作 */
                  break;
          }
          super.handleMessage(msg);
      }
      
    • 最後編輯Activity的onCreate及onDestroy
      public class GoogleAppLicensingActivity extends Activity {
          private final static int LICENSE_ALLOWED = 1;
          private final static int LICENSE_NOT_ALLOWED = 0;
          private String LICENSE_KEY = "DUMMY_BASE_PUBLIC_KEY"; /* app的BASE_PUBLIC_KEY,從app發佈平台取得,詳細請見步驟1. */
          private static LicenseCheckerCallback mLicenseCheckerCallback;
          private static LicenseChecker mChecker;
          public static Handler mHandler;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              mHandler = new CheckerHandler();
              mLicenseCheckerCallback = new GoogleLicenseCheckerCallback();
              StrictPolicy strictPolicy = new StrictPolicy();
              mChecker = new LicenseChecker(this, strictPolicy, LICENSE_KEY);
      
              new Thread() {
                  @Override
                  public void run() {
                      try {
                          /* 在Thread裡呼叫License checker */
                          mChecker.checkAccess(mLicenseCheckerCallback);
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }.start();
          }
      
          @Override
          protected void onDestroy() {
              super.onDestroy();
              mChecker.onDestroy();
          }
      }
      
  5. 測試
    測試前需要先在Google play Developer Console加入測試帳號,如下圖
    “測試用Gmail帳戶"填入測試帳號,多個可用逗號分隔,"授權測試回應"則是測試帳號會收到的回應,LICENSED回傳會是授權成功,NOT_LICENSED則會回傳授權失敗
    app licensing test

這麼一來就大功告成啦!

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s