/* * Copyright (C) 2010 The MobileSecurePay Project * All right reserved. * author: shiqun.shi@alipay.com */ package com.mzeat.alipay; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.json.JSONException; import org.json.JSONObject; import com.mzeat.R; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Handler; import android.os.Message; /** * 检测安全支付服务是否正确安装,如果没有安装进行本地安装,或者下载安装, 检测安全支付服务版本,有新版本时进行下载。 * */ public class MobileSecurePayHelper { static final String TAG = "MobileSecurePayHelper"; private ProgressDialog mProgress = null; Context mContext = null; public MobileSecurePayHelper(Context context) { this.mContext = context; } /** * 检测安全支付服务是否安装 * * @return */ public boolean detectMobile_sp() { boolean isMobile_spExist = isMobile_spExist(); if (!isMobile_spExist) { // // get the cacheDir. // 获取系统缓冲绝对路径 获取/data/data//cache目录 File cacheDir = mContext.getCacheDir(); final String cachePath = cacheDir.getAbsolutePath() + "/temp.apk"; // // 捆绑安装 retrieveApkFromAssets(mContext, PartnerConfig.ALIPAY_PLUGIN_NAME, cachePath); mProgress = BaseHelper.showProgress(mContext, null, "正在检测安全支付服务版本", false, true); // 实例新线程检测是否有新版本进行下载 new Thread(new Runnable() { public void run() { // // 检测是否有新的版本。 PackageInfo apkInfo = getApkInfo(mContext, cachePath); String newApkdlUrl = checkNewUpdate(apkInfo); // // 动态下载 if (newApkdlUrl != null) retrieveApkFromNet(mContext, newApkdlUrl, cachePath); // send the result back to caller. // 发送结果 Message msg = new Message(); msg.what = AlixId.RQF_INSTALL_CHECK; msg.obj = cachePath; mHandler.sendMessage(msg); } }).start(); } // else ok. return isMobile_spExist; } /** * 显示确认安装的提示 * * @param context * 上下文环境 * @param cachePath * 安装文件路径 */ public void showInstallConfirmDialog(final Context context, final String cachePath) { AlertDialog.Builder tDialog = new AlertDialog.Builder(context); tDialog.setIcon(R.drawable.info); tDialog.setTitle(context.getResources().getString( R.string.confirm_install_hint)); tDialog.setMessage(context.getResources().getString( R.string.confirm_install)); tDialog.setPositiveButton(R.string.Ensure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // // 修改apk权限 BaseHelper.chmod("777", cachePath); // // install the apk. // 安装安全支付服务APK Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("file://" + cachePath), "application/vnd.android.package-archive"); context.startActivity(intent); } }); tDialog.setNegativeButton( context.getResources().getString(R.string.Cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); tDialog.show(); } /** * 遍历程序列表,判断是否安装安全支付服务 * * @return */ public boolean isMobile_spExist() { PackageManager manager = mContext.getPackageManager(); List<PackageInfo> pkgList = manager.getInstalledPackages(0); for (int i = 0; i < pkgList.size(); i++) { PackageInfo pI = pkgList.get(i); if (pI.packageName.equalsIgnoreCase("com.alipay.android.app")) return true; } return false; } /** * 安装安全支付服务,安装assets文件夹下的apk * * @param context * 上下文环境 * @param fileName * apk名称 * @param path * 安装路径 * @return */ public boolean retrieveApkFromAssets(Context context, String fileName, String path) { boolean bRet = false; try { InputStream is = context.getAssets().open(fileName); File file = new File(path); file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); byte[] temp = new byte[1024]; int i = 0; while ((i = is.read(temp)) > 0) { fos.write(temp, 0, i); } fos.close(); is.close(); bRet = true; } catch (IOException e) { e.printStackTrace(); } return bRet; } /** * 获取未安装的APK信息 * * @param context * @param archiveFilePath * APK文件的路径。如:/sdcard/download/XX.apk */ public static PackageInfo getApkInfo(Context context, String archiveFilePath) { PackageManager pm = context.getPackageManager(); PackageInfo apkInfo = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_META_DATA); return apkInfo; } /** * 检查是否有新版本,如果有,返回apk下载地址 * * @param packageInfo * {@link PackageInfo} * @return */ public String checkNewUpdate(PackageInfo packageInfo) { String url = null; try { JSONObject resp = sendCheckNewUpdate(packageInfo.versionName); // JSONObject resp = sendCheckNewUpdate("1.0.0"); if (resp.getString("needUpdate").equalsIgnoreCase("true")) { url = resp.getString("updateUrl"); } // else ok. } catch (Exception e) { e.printStackTrace(); } return url; } /** * 发送当前版本信息,返回是否需要升级 如果需要升级返回更新apk地址 * * @param versionName * 当前版本号 * @return */ public JSONObject sendCheckNewUpdate(String versionName) { JSONObject objResp = null; try { JSONObject req = new JSONObject(); req.put(AlixDefine.action, AlixDefine.actionUpdate); JSONObject data = new JSONObject(); data.put(AlixDefine.platform, "android"); data.put(AlixDefine.VERSION, versionName); data.put(AlixDefine.partner, ""); req.put(AlixDefine.data, data); objResp = sendRequest(req.toString()); } catch (JSONException e) { e.printStackTrace(); } return objResp; } /** * 发送json数据 * * @param content * @return */ public JSONObject sendRequest(final String content) { NetworkManager nM = new NetworkManager(this.mContext); // JSONObject jsonResponse = null; try { String response = null; synchronized (nM) { // response = nM.SendAndWaitResponse(content, Constant.server_url); } jsonResponse = new JSONObject(response); } catch (Exception e) { e.printStackTrace(); } // if (jsonResponse != null) BaseHelper.log(TAG, jsonResponse.toString()); return jsonResponse; } /** * 动态下载apk * * @param context * 上下文环境 * @param strurl * 下载地址 * @param filename * 文件名称 * @return */ public boolean retrieveApkFromNet(Context context, String strurl, String filename) { boolean bRet = false; try { NetworkManager nM = new NetworkManager(this.mContext); bRet = nM.urlDownloadToFile(context, strurl, filename); } catch (Exception e) { e.printStackTrace(); } return bRet; } // // close the progress bar void closeProgress() { try { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } } catch (Exception e) { e.printStackTrace(); } } // // the handler use to receive the install check result. // 此处接收安装检测结果 private Handler mHandler = new Handler() { public void handleMessage(Message msg) { try { switch (msg.what) { case AlixId.RQF_INSTALL_CHECK: { // closeProgress(); String cachePath = (String) msg.obj; showInstallConfirmDialog(mContext, cachePath); } break; } super.handleMessage(msg); } catch (Exception e) { e.printStackTrace(); } } }; }