編輯:關於Android編程
package com.noti.xoxo.wxapi; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import com.noti.xoxo.activity.PayActivity; import com.noti.xoxo.utils.WXConstants; import com.tencent.mm.sdk.modelbase.BaseReq; import com.tencent.mm.sdk.modelbase.BaseResp; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; import com.tencent.mm.sdk.openapi.WXAPIFactory; public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api;//得到api id private String orderId;//訂單號 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, WXConstants.APP_ID); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) { } /** * 得到支付結果回調 */ @Override public void onResp(BaseResp resp) { int errCode = resp.errCode; switch (errCode) { case 0: Toast.makeText(this,"支付成功",Toast.LENGTH_LONG).show(); break; case -1: Toast.makeText(this,"支付錯誤",Toast.LENGTH_LONG).show(); break; case -2: Toast.makeText(this,"支付取消",Toast.LENGTH_LONG).show(); break; } Intent intent = new Intent(PayActivity.PAY_RESULT);//返回App界面 intent.putExtra("err_code",errCode+""); sendBroadcast(intent); Log.e("TAG", "errCodes" + errCode); finish();//這裡重要,如果沒有 finish();將留在微信支付後的界面. } }
package com.noti.xoxo.utils; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.util.Log; import android.util.Xml; import android.widget.Toast; import com.tencent.mm.sdk.modelpay.PayReq; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.xmlpull.v1.XmlPullParser; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; /** * Created by love on 2015/10/9. */ public class WXPayUtils { private Activity context; PayReq req; IWXAPI msgApi; StringBuffer sb; Mapresultunifiedorder; // private String notify_url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; private String notify_url = "https://pay.weixin.qq.com/index.php/core/info"; private String orderTitle = "";//ceshi private String orderPrice = "";//總金額 private String outTradeNo = "";//商戶訂單號 private String describe = "";// public String shopName;//店鋪名稱 public String title;//商品名稱 public String price;//商品價格 public WXPayUtils(Activity context, String notify_url) { this.context = context; this.notify_url = notify_url; req = new PayReq(); sb = new StringBuffer(); registerAPP(); } public void registerAPP() { msgApi = WXAPIFactory.createWXAPI(context, WXConstants.APP_ID, true); msgApi.registerApp(WXConstants.APP_ID); } public void pay(String orderTitle, String orderPrice, String describe, String orderNum) { this.orderTitle = orderTitle; this.orderPrice = orderPrice; this.outTradeNo = orderNum; this.describe = describe; GetPrepayIdTask getPrepayId = new GetPrepayIdTask(); getPrepayId.execute(); } private long genTimeStamp() { return System.currentTimeMillis() / 1000; } private void genPayReq() { String returnCode = resultunifiedorder.get("return_code"); if ("FAIL".equals(returnCode)) { Toast.makeText(context, resultunifiedorder.get("return_msg"), Toast.LENGTH_SHORT).show(); } req.appId = WXConstants.APP_ID; req.partnerId = WXConstants.WECHAT_MCH_ID; req.prepayId = resultunifiedorder.get("prepay_id"); req.packageValue = "Sign=WXPay"; req.nonceStr = genNonceStr(); req.timeStamp = String.valueOf(genTimeStamp()); List signParams = new LinkedList (); signParams.add(new BasicNameValuePair("appid", req.appId));//api_id signParams.add(new BasicNameValuePair("noncestr", req.nonceStr)); signParams.add(new BasicNameValuePair("package", req.packageValue)); signParams.add(new BasicNameValuePair("partnerid", req.partnerId)); signParams.add(new BasicNameValuePair("prepayid", req.prepayId)); signParams.add(new BasicNameValuePair("timestamp", req.timeStamp)); req.sign = genAppSign(signParams); sb.append("sign\n" + req.sign + "\n\n"); } private String genAppSign(List params) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { sb.append(params.get(i).getName()); sb.append('='); sb.append(params.get(i).getValue()); sb.append('&'); } sb.append("key="); sb.append(WXConstants.WECHAT_API_KEY); this.sb.append("sign str\n" + sb.toString() + "\n\n"); String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase(); Log.e("TAG", appSign); return appSign; } private void sendPayReq() { msgApi.registerApp(WXConstants.APP_ID); msgApi.sendReq(req); Log.e("TAG", "sendPayReq111: " + msgApi.sendReq(req)); } /** * 生成簽名 */ private String genPackageSign(List params) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { sb.append(params.get(i).getName()); sb.append('='); sb.append(params.get(i).getValue()); sb.append('&'); } sb.append("key="); sb.append(WXConstants.WECHAT_API_KEY); String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase(); return packageSign; } private class GetPrepayIdTask extends AsyncTask > { private ProgressDialog dialog; @Override protected void onPreExecute() { dialog = ProgressDialog.show(context, "提示", "正在獲取預支付訂單..."); } @Override protected void onPostExecute(Map result) { if (dialog != null) { dialog.dismiss(); } sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n"); // if (result.get("err_code") != null && "OUT_TRADE_NO_USED".equals(result.get("err_code").toString())) { //// Toast.makeText(context,result.get("err_code_des").toString(),"0").show(); // } resultunifiedorder = result; // Log.e(getClass().getName(), resultunifiedorder.toString()); Log.e("TAG", resultunifiedorder.toString()); genPayReq(); sendPayReq(); } @Override protected void onCancelled() { super.onCancelled(); } @Override protected Map doInBackground(Void... params) { String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder"); String entity = genProductArgs(); byte[] buf = Util.httpPost(url, entity); String content = new String(buf); Map xml = decodeXml(content); Log.e("TAG", "doInBackground: " + xml.toString()); Log.e("TAG", "doInBackground: " + content); return xml; } } public Map decodeXml(String content) { try { Map xml = new HashMap (); XmlPullParser parser = Xml.newPullParser(); parser.setInput(new StringReader(content)); int event = parser.getEventType(); while (event != XmlPullParser.END_DOCUMENT) { String nodeName = parser.getName(); switch (event) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: if ("xml".equals(nodeName) == false) { //實例化student對象 xml.put(nodeName, parser.nextText()); } break; case XmlPullParser.END_TAG: break; } event = parser.next(); } return xml; } catch (Exception e) { } return null; } private String genProductArgs() { StringBuffer xml = new StringBuffer(); try { String nonceStr = genNonceStr(); xml.append(""); List packageParams = new LinkedList (); packageParams.add(new BasicNameValuePair("appid", WXConstants.APP_ID));//api_id packageParams.add(new BasicNameValuePair("bank_type", "WX")); // 固定為“WX” // packageParams.add(new BasicNameValuePair("appkey", WXConstants.WECHAT_API_KEY)); packageParams.add(new BasicNameValuePair("body", orderTitle));//orderTitle沒有數據 為空 測試 + "¥" + orderPrice // packageParams.add(new BasicNameValuePair("body", orderTitle));//orderTitle沒有數據 為空 測試 + "¥" + orderPrice // packageParams.add(new BasicNameValuePair("fee_type", "1"));// 傳入參數字符編碼:默認GBK packageParams.add(new BasicNameValuePair("detail", describe));//商品介紹 packageParams.add(new BasicNameValuePair("input_charset", "UTF-8"));// 通知URL,支付完成後,接收微信通知結果的URL,需要絕對路徑, packageParams.add(new BasicNameValuePair("mch_id", WXConstants.WECHAT_MCH_ID)); packageParams.add(new BasicNameValuePair("nonce_str", nonceStr)); packageParams.add(new BasicNameValuePair("notify_url", notify_url)); packageParams.add(new BasicNameValuePair("out_trade_no", outTradeNo));//商戶訂單號 packageParams.add(new BasicNameValuePair("spbill_create_ip", getLocalIpAddress(context)));//獲取手機的ip地址 packageParams.add(new BasicNameValuePair("total_fee", String.valueOf((int) (Float.parseFloat(orderPrice) * 100))));// 訂單總金額,單位是分 packageParams.add(new BasicNameValuePair("trade_type", "APP")); String sign = genPackageSign(packageParams); packageParams.add(new BasicNameValuePair("sign", sign)); String xmlstring = toXml(packageParams); Log.e("TAG", "genProductArgs: " + xmlstring); return xmlstring; } catch (Exception e) { return null; } } /** * 解析為xml格式 * * @param * @return */ private String toXml(List params) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); sb.append(" "); for (int i = 0; i < params.size(); i++) { sb.append("<" + params.get(i).getName() + ">"); sb.append(params.get(i).getValue()); sb.append("{C}{C}"); } sb.append(" "); //return sb.toString(); return new String(sb.toString().getBytes(), "ISO8859-1"); } private String genNonceStr() { Random random = new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } /** * @param @param ipInt * @param @return * @return 返回類型 String * @throws * @Title: int2ip * @Description: TODO(將ip的整數形式轉換成ip形式) */ public static String int2ip(int ipInt) { StringBuilder sb = new StringBuilder(); sb.append(ipInt & 0xFF).append("."); sb.append((ipInt >> 8) & 0xFF).append("."); sb.append((ipInt >> 16) & 0xFF).append("."); sb.append((ipInt >> 24) & 0xFF); return sb.toString(); } /** * 獲取手機的IP * * @param @param context * @param @return * @return 返回類型 String * @throws * @Title: getLocalIpAddress * @Description: TODO(獲取當前ip地址) */ public static String getLocalIpAddress(Context context) { try { WifiManager wifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int i = wifiInfo.getIpAddress(); return int2ip(i); } catch (Exception ex) { return " 獲取IP出錯鳥!!!!請保證是WIFI,或者請重新打開網絡!\n" + ex.getMessage(); } // return null; } }
package com.noti.xoxo.utils; public class WXConstants { //應用id public static final String APP_ID = "*****************************";//平台Id(自己換一下) public static final String APP_SECRET = "*****************************"; //用code換access_token public static String GET_REQUEST_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="; //獲取微信用戶資料 public static String GET_REQUEST_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?access_token="; //微信支付商戶號 public static final String WECHAT_MCH_ID = "*****************************"; //API密鑰:AppSecret是APPID對應的接口密碼,用於獲取接口調用憑證access_token時使用 public static final String WECHAT_API_KEY = "*****************************"; }
package com.noti.xoxo.utils; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import com.noti.xoxo.common.AppContext; /** * Created by tiansj on 15/7/29. */ public class Utils { private static final String TAG = "Utils"; // 獲取ApiKey public static String getMetaValue(Context context, String metaKey) { Bundle metaData = null; String apiKey = null; if (context == null || metaKey == null) { return null; } try { ApplicationInfo ai = context.getPackageManager() .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); if (null != ai) { metaData = ai.metaData; } if (null != metaData) { apiKey = metaData.getString(metaKey); } } catch (PackageManager.NameNotFoundException e) { } return apiKey; } /** * 設置手機網絡類型,wifi,cmwap,ctwap,用於聯網參數選擇 * @return */ static String getNetworkType() { String networkType = "wifi"; ConnectivityManager manager = (ConnectivityManager) AppContext.getInstance() .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netWrokInfo = manager.getActiveNetworkInfo(); if (netWrokInfo == null || !netWrokInfo.isAvailable()) { return ""; // 當前網絡不可用 } String info = netWrokInfo.getExtraInfo(); if ((info != null) && ((info.trim().toLowerCase().equals("cmwap")) || (info.trim().toLowerCase().equals("uniwap")) || (info.trim().toLowerCase().equals("3gwap")) || (info .trim().toLowerCase().equals("ctwap")))) { // 上網方式為wap if (info.trim().toLowerCase().equals("ctwap")) { // 電信 networkType = "ctwap"; } else { networkType = "cmwap"; } } return networkType; } /** * 檢測網絡是否可用 * * @param context * @return */ public static boolean isNetWorkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null) { return mNetworkInfo.isAvailable(); } } return false; } /** * 檢測Sdcard是否存在 * * @return */ public static boolean isExitsSdcard() { if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) return true; else return false; } static String getString(Context context, int resId){ return context.getResources().getString(resId); } }
package com.noti.xoxo.utils; import java.security.MessageDigest; public class MD5 { private MD5() { } public final static String getMessageDigest(byte[] buffer) { char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(buffer); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } }
package com.noti.xoxo.utils; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.util.Log; import junit.framework.Assert; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class Util { private static final String TAG = "SDK_Sample.Util"; public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) { ByteArrayOutputStream output = new ByteArrayOutputStream(); bmp.compress(CompressFormat.PNG, 100, output); if (needRecycle) { bmp.recycle(); } byte[] result = output.toByteArray(); try { output.close(); } catch (Exception e) { e.printStackTrace(); } return result; } public static byte[] httpGet(final String url) { if (url == null || url.length() == 0) { Log.e(TAG, "httpGet, url is null"); return null; } HttpClient httpClient = getNewHttpClient(); HttpGet httpGet = new HttpGet(url); try { HttpResponse resp = httpClient.execute(httpGet); if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode()); return null; } return EntityUtils.toByteArray(resp.getEntity()); } catch (Exception e) { Log.e(TAG, "httpGet exception, e = " + e.getMessage()); e.printStackTrace(); return null; } } public static byte[] httpPost(String url, String entity) { if (url == null || url.length() == 0) { Log.e(TAG, "httpPost, url is null"); return null; } HttpClient httpClient = getNewHttpClient(); HttpPost httpPost = new HttpPost(url); try { httpPost.setEntity(new StringEntity(entity)); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); HttpResponse resp = httpClient.execute(httpPost); if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode()); return null; } return EntityUtils.toByteArray(resp.getEntity()); } catch (Exception e) { Log.e(TAG, "httpPost exception, e = " + e.getMessage()); e.printStackTrace(); return null; } } private static class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } }; sslContext.init(null, new TrustManager[]{tm}, null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } } private static HttpClient getNewHttpClient() { try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); return new DefaultHttpClient(ccm, params); } catch (Exception e) { return new DefaultHttpClient(); } } public static byte[] readFromFile(String fileName, int offset, int len) { if (fileName == null) { return null; } File file = new File(fileName); if (!file.exists()) { Log.i(TAG, "readFromFile: file not found"); return null; } if (len == -1) { len = (int) file.length(); } Log.d(TAG, "readFromFile : offset = " + offset + " len = " + len + " offset + len = " + (offset + len)); if (offset < 0) { Log.e(TAG, "readFromFile invalid offset:" + offset); return null; } if (len <= 0) { Log.e(TAG, "readFromFile invalid len:" + len); return null; } if (offset + len > (int) file.length()) { Log.e(TAG, "readFromFile invalid file len:" + file.length()); return null; } byte[] b = null; try { RandomAccessFile in = new RandomAccessFile(fileName, "r"); b = new byte[len]; in.seek(offset); in.readFully(b); in.close(); } catch (Exception e) { Log.e(TAG, "readFromFile : errMsg = " + e.getMessage()); e.printStackTrace(); } return b; } private static final int MAX_DECODE_PICTURE_SIZE = 1920 * 1440; public static Bitmap extractThumbNail(final String path, final int height, final int width, final boolean crop) { Assert.assertTrue(path != null && !path.equals("") && height > 0 && width > 0); BitmapFactory.Options options = new BitmapFactory.Options(); try { options.inJustDecodeBounds = true; Bitmap tmp = BitmapFactory.decodeFile(path, options); if (tmp != null) { tmp.recycle(); tmp = null; } Log.d(TAG, "extractThumbNail: round=" + width + "x" + height + ", crop=" + crop); final double beY = options.outHeight * 1.0 / height; final double beX = options.outWidth * 1.0 / width; Log.d(TAG, "extractThumbNail: extract beX = " + beX + ", beY = " + beY); options.inSampleSize = (int) (crop ? (beY > beX ? beX : beY) : (beY < beX ? beX : beY)); if (options.inSampleSize <= 1) { options.inSampleSize = 1; } // NOTE: out of memory error while (options.outHeight * options.outWidth / options.inSampleSize > MAX_DECODE_PICTURE_SIZE) { options.inSampleSize++; } int newHeight = height; int newWidth = width; if (crop) { if (beY > beX) { newHeight = (int) (newWidth * 1.0 * options.outHeight / options.outWidth); } else { newWidth = (int) (newHeight * 1.0 * options.outWidth / options.outHeight); } } else { if (beY < beX) { newHeight = (int) (newWidth * 1.0 * options.outHeight / options.outWidth); } else { newWidth = (int) (newHeight * 1.0 * options.outWidth / options.outHeight); } } options.inJustDecodeBounds = false; Log.i(TAG, "bitmap required size=" + newWidth + "x" + newHeight + ", orig=" + options.outWidth + "x" + options.outHeight + ", sample=" + options.inSampleSize); Bitmap bm = BitmapFactory.decodeFile(path, options); if (bm == null) { Log.e(TAG, "bitmap decode failed"); return null; } Log.i(TAG, "bitmap decoded size=" + bm.getWidth() + "x" + bm.getHeight()); final Bitmap scale = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true); if (scale != null) { bm.recycle(); bm = scale; } if (crop) { final Bitmap cropped = Bitmap.createBitmap(bm, (bm.getWidth() - width) >> 1, (bm.getHeight() - height) >> 1, width, height); if (cropped == null) { return bm; } bm.recycle(); bm = cropped; Log.i(TAG, "bitmap croped size=" + bm.getWidth() + "x" + bm.getHeight()); } return bm; } catch (final OutOfMemoryError e) { Log.e(TAG, "decode bitmap failed: " + e.getMessage()); options = null; } return null; } public static String sha1(String str) { if (str == null || str.length() == 0) { return null; } char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); mdTemp.update(str.getBytes()); byte[] md = mdTemp.digest(); int j = md.length; char buf[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; buf[k++] = hexDigits[byte0 & 0xf]; } return new String(buf); } catch (Exception e) { return null; } } public static ListstringsToList(final String[] src) { if (src == null || src.length == 0) { return null; } final List result = new ArrayList (); for (int i = 0; i < src.length; i++) { result.add(src[i]); } return result; } }
1 Android控件架構1 簡單的總結(1)父View優先攔截當前事件,攔截不成功就讓子View對當前事件進行攔截。(2)如果攔截成功的話,就會沿著子view到父Vie
效果圖如下所示:先給大家說下實現android 跳轉到通訊錄的實現思路:1.點擊跳轉到通訊錄界面2.獲取通訊錄姓名和手機號碼3.回調顯示姓名和手機號碼1首先是跳轉到通訊錄
Intent的匹配過程中有三個步驟,包括Action , category與data 的匹配。如果匹配出了多個結果,系統會顯示一個dialog讓用戶來選
MainActivity.java代碼:package siso.multilistview;import android.os.Build;import android