package com.hellodev.lightme.util; import java.util.Calendar; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.res.Resources; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import com.hellodev.lightme.FlashApp; import com.hellodev.lightme.R; import com.meizu.mstore.license.ILicensingService; import com.meizu.mstore.license.LicenseCheckHelper; import com.meizu.mstore.license.LicenseResult; public class MLisenseMangaer { private final static String TAG = "MLisenseMangaer"; public final static int STATE_UNKNOWN = 0; public final static int STATE_PURCHASED = 1; public final static int STATE_TRYING = 2; public final static int STATE_EXPIRED = 3; public final static int EXPIRE_DAYS = 3; public final static String APK_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCB4xYVRA7w13J6dBWA+oERVDRnefb8J5N7zeD3e6JfExk76F59YRDbmDVPL+ztwwboy+R3RSQKIHM/DYymqAHnbq4m/tKXCS6BcL9MeH6Cc2xas2dNNfzOjDrb/5oqvzHI+0TPX3gU2ZML3Udsw4Q+QT+jYOgLbMYfbps3OZne5QIDAQAB/wJQnyPGfR72CNv5zR+qA4qjxSMBUSQh55awBgR4Jrwd3G+6/yH540pB/oP+GsTp0Sof/dEFaR85968aEhBGRcnpEl9OITISZRwMp654/LD6kzdsjMBjfPXiYRSLjygcbG//gOVxZbnmU2Nz5pnuFvav8wIDAQAB"; private Context mContext; // 服务的实例对象 private ILicensingService mLicensingService = null; private OnLisenseStateChangeListener mListener; public MLisenseMangaer() { // for local check this(null); } public MLisenseMangaer(OnLisenseStateChangeListener listener) { mListener = listener; mContext = FlashApp.getContext(); } // 服务绑定的回调,可用于判断服务是否绑定成功 private ServiceConnection mLicenseConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { if (mListener != null) mListener.onRemoteServiceDisconnected(); mLicensingService = null; } public void onServiceConnected(ComponentName name, IBinder service) { Log.v(TAG, "服务绑定成功,获取服务实例"); mLicensingService = ILicensingService.Stub.asInterface(service); if (mListener != null) mListener.onRemoteServiceConnected(); } }; public void bindRemoteService() { if (mLicensingService == null) { // 绑定服务 Intent serviceIntent = new Intent(); serviceIntent.setAction(ILicensingService.class.getName()); mContext.bindService(serviceIntent, mLicenseConnection, Context.BIND_AUTO_CREATE); } else { if (mListener != null) mListener.onRemoteServiceConnected(); } } public void unbindRemoteService() { // 如果服务已经绑定,在退出时需要反绑服务 if (mLicensingService != null) { mContext.unbindService(mLicenseConnection); } } // doCheck()方法演示了如何使用license服务来验证授权是否合法 public int doRemoteCheck() { // 该第三方应用的包名,可使用getApplication().getPackageName()获取本应用包名 final String packageName = mContext.getPackageName(); // 保存服务验证的结果值 LicenseResult result = null; int lisenseState = STATE_UNKNOWN; if (mLicensingService != null) { try { // 调用服务接口进行验证,获取返回的结果值 // FIXME 为什么有的时候为空 result = mLicensingService.checkLicense(packageName); } catch (RemoteException e) { Log.e(TAG, "获取证书失败"); // 作为UNKNOWN来处理,这种异常不需要显示错误 lisenseState = STATE_TRYING; } if (result != null && result.getResponseCode() == LicenseResult.RESPONSE_CODE_SUCCESS) { // license验证服务验证通过,需要接着对服务返回的结果再次进行校验(使用自己的公钥进行验证) boolean bSuccess = LicenseCheckHelper.checkResult( APK_PUBLIC_KEY, result); if (bSuccess && result.getPurchaseType() == LicenseResult.PURCHASE_TYPE_NORMAL) { // 验证成功,并且为正式版本 lisenseState = STATE_PURCHASED; // FIXME 获取子产品 } else if (result.getPurchaseType() == LicenseResult.PURCHASE_TYPE_TRIAL) { // 验证成功,是试用版本 // 该方法返回license文件的生成日期(注:该日期的值只精确到天,即时分秒为随机值) Calendar beginCal = result.getStartDate(); // Log.v("", "试用开始的日期为: " + beginCal.get(Calendar.YEAR) + // "年" // + (beginCal.get(Calendar.MONTH) + 1) + "月" // + beginCal.get(Calendar.DAY_OF_MONTH) + "日"); /** * 以下是可供参考的过期判断 */ // 你自己定义的过期天数 final int expireDays = 3; // 获取当前日期 Calendar nowCal = Calendar.getInstance(); // 求剩余的天数 long dif = nowCal.getTimeInMillis() - beginCal.getTimeInMillis(); int passDay = (int) (dif / (24 * 60 * 60 * 1000)); int left = expireDays - passDay; if (left > 0) { // 未过期 Log.v(TAG, "未过期"); lisenseState = STATE_TRYING; } else { // 过期 Log.e(TAG, "过期"); lisenseState = STATE_EXPIRED; } // FIXME 获取子产品 } else { // 验证不成功或者版本类型不对,可按试用版处理 // FIXME 状态一定要对,作为UNKNOWN来处理 lisenseState = STATE_TRYING; Log.e(TAG, "license验证不通过"); } } else { // license验证服务验证不通过 lisenseState = STATE_UNKNOWN;// 用友盟来统计? if (result!= null && result.getResponseCode() == LicenseResult.RESPONSE_CODE_NO_LICENSE_FILE) { // 不存在与应用对应的license文件 Log.e(TAG, "无对应的license文件"); } else { // license文件无效 Log.e(TAG, "license文件无效"); } } } MPreferenceManager.getInstance().setLocalLisenseState(lisenseState); return lisenseState; } public static String getLisenseInfo(int lisenseState) { Resources resource = FlashApp.getContext().getResources(); String lisenseInfo; switch (lisenseState) { case STATE_TRYING: lisenseInfo = resource.getString(R.string.lisense_state_trying); break; case STATE_EXPIRED: lisenseInfo = resource.getString(R.string.lisense_state_expired); break; case STATE_UNKNOWN: lisenseInfo = resource.getString(R.string.lisense_state_unknown); break; default: lisenseInfo = null; break; } return lisenseInfo; } public interface OnLisenseStateChangeListener { public void onRemoteServiceConnected(); public void onRemoteServiceDisconnected(); } }