我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 支付宝支付功能封装实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 支付宝支付功能封装实现

  在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。封装的代码也很简单,是将官网给的demo提取出一个类来方便使用。      public class Alipay {   // 商户PID   public static final String PARTNER = "123456789";   // 商户收款账号   public static final String SELLER = "qibin0506@gmail.com";   // 商户私钥,pkcs8格式   public static final String RSA_PRIVATE = "rsa_private";   // 支付宝公钥   public static final String RSA_PUBLIC = "rsa_public";   private static final int SDK_PAY_FLAG = 1;   private WeakReference<Activity> mActivity;   private OnAlipayListener mListener;   public Alipay(Activity activity) {   mActivity = new WeakReference<Activity>(activity);   }   @SuppressLint("HandlerLeak")   private Handler mHandler = new Handler() {   public void handleMessage(Message msg) {   if (msg.what == SDK_PAY_FLAG) {   PayResult payResult = new PayResult((String) msg.obj);   // 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签   String resultInfo = payResult.getResult();   String resultStatus = payResult.getResultStatus();   // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档   if (TextUtils.equals(resultStatus, "9000")) {   if (mListener != null) mListener.onSuccess();   } else {   // 判断resultStatus 为非“9000”则代表可能支付失败   // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,   // 终交易是否成功以服务端异步通知为准(小概率状态)   if (TextUtils.equals(resultStatus, "8000")) {   if (mListener != null) mListener.onWait();   } else {   // 其他值可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误   if (mListener != null) mListener.onCancel();   }   }   }   }   };      public void pay(String title, String desc, String price, String sn, String url) {   // 订单   String orderInfo = getOrderInfo(title, desc, price, sn, url);   // 对订单做RSA 签名   String sign = sign(orderInfo);   try {   // 仅需对sign 做URL编码   sign = URLEncoder.encode(sign, "UTF-8");   } catch (UnsupportedEncodingException e) {   e.printStackTrace();   }   // 完整的符合支付宝参数规范的订单信息   final String payInfo = orderInfo + "&sign=/"" + sign + "/"&"   + getSignType();   Runnable payRunnable = new Runnable() {   @Override   public void run() {   Activity activity = mActivity.get();   if(activity == null) return;   // 构造PayTask 对象   PayTask alipay = new PayTask(activity);   // 调用支付接口,获取支付结果   String result = alipay.pay(payInfo);   Message msg = new Message();   msg.what = SDK_PAY_FLAG;   msg.obj = result;   mHandler.sendMessage(msg);   }   };   // 必须异步调用   Thread payThread = new Thread(payRunnable);   payThread.start();   }      public String getOrderInfo(String subject, String body, String price,   String sn, String url) {   // 签约合作者身份ID   String orderInfo = "partner=" + "/"" + PARTNER + "/"";   // 签约卖家支付宝账号   orderInfo += "&seller_id=" + "/"" + SELLER + "/"";   // 商户网站订单号   orderInfo += "&out_trade_no=" + "/"" + sn + "/"";   // 商品名称   orderInfo += "&subject=" + "/"" + subject + "/"";   // 商品详情   orderInfo += "&body=" + "/"" + body + "/"";   // 商品金额   orderInfo += "&total_fee=" + "/"" + price + "/"";   // 服务器异步通知页面路径   orderInfo += "?ify_url=" + "/"" + url + "/"";   // 服务接口名称, 固定值   orderInfo += "&service=/"mobile.securitypay.pay/"";   // 支付类型, 固定值   orderInfo += "&payment_type=/"1/"";   // 参数编码, 固定值   orderInfo += "&_input_charset=/"utf-8/"";   // 设置未付款交易的超时时间   // 默认30分钟,一旦超时,该笔交易会自动被关闭。   // 取值范围:1m~15d。   // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。   // 该参数数值不接受小数点,如1.5h,可转换为90m。   orderInfo += "&it_b_pay=/"30m/"";   // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付   // orderInfo += "&extern_token=" + "/"" + extern_token + "/"";   // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空   orderInfo += "&return_url=/"m.alipay.com/"";   // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)   // orderInfo += "&paymethod=/"expressGateway/"";   return orderInfo;   }      public String sign(String content) {   return SignUtils.sign(content, RSA_PRIVATE);   }      public String getSignType() {   return "sign_type=/"RSA/"";   }   public void setListener(OnAlipayListener l) {   mListener = l;   }      public static class OnAlipayListener {      public void onSuccess() {}      public void onCancel() {}      public void onWait() {}   }   }   final class Base64 {   private static final int BASELENGTH = 128;   private static final int LOOKUPLENGTH = 64;   private static final int TWENTYFOURBITGROUP = 24;   private static final int EIGHTBIT = 8;   private static final int SIXTEENBIT = 16;   private static final int FOURBYTE = 4;   private static final int SIGN = -128;   private static char PAD = '=';   private static byte[] base64Alphabet = new byte[BASELENGTH];   private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];   static {   for (int i = 0; i < BASELENGTH; ++i) {   base64Alphabet[i] = -1;   }   for (int i = 'Z'; i >= 'A'; i--) {   base64Alphabet[i] = (byte) (i - 'A');   }   for (int i = 'z'; i >= 'a'; i--) {   base64Alphabet[i] = (byte) (i - 'a' + 26);   }   for (int i = '9'; i >= '0'; i--) {   base64Alphabet[i] = (byte) (i - '0' + 52);   }   base64Alphabet['+'] = 62;   base64Alphabet['/'] = 63;   for (int i = 0; i <= 25; i++) {   lookUpBase64Alphabet[i] = (char) ('A' + i);   }   for (int i = 26, j = 0; i <= 51; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('a' + j);   }   for (int i = 52, j = 0; i <= 61; i++, j++) {   lookUpBase64Alphabet[i] = (char) ('0' + j);   }   lookUpBase64Alphabet[62] = (char) '+';   lookUpBase64Alphabet[63] = (char) '/';   }   private static boolean isWhiteSpace(char octect) {   return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);   }   private static boolean isPad(char octect) {   return (octect == PAD);   }   private static boolean isData(char octect) {   return (octect < BASELENGTH && base64Alphabet[octect] != -1);   }      public static String encode(byte[] binaryData) {   if (binaryData == null) {   return null;   }   int lengthDataBits = binaryData.length * EIGHTBIT;   if (lengthDataBits == 0) {   return "";   }   int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;   int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;   int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1   : numberTriplets;   char encodedData[] = null;   encodedData = new char[numberQuartet * 4];   byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;   int encodedIndex = 0;   int dataIndex = 0;   for (int i = 0; i < numberTriplets; i++) {   b1 = binaryData[dataIndex++];   b2 = binaryData[dataIndex++];   b3 = binaryData[dataIndex++];   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)   : (byte) ((b2) >> 4 ^ 0xf0);   byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6)   : (byte) ((b3) >> 6 ^ 0xfc);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];   encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];   }   // form integral number of 6-bit groups   if (fewerThan24bits == EIGHTBIT) {   b1 = binaryData[dataIndex];   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];   encodedData[encodedIndex++] = PAD;   encodedData[encodedIndex++] = PAD;   } else if (fewerThan24bits == SIXTEENBIT) {   b1 = binaryData[dataIndex];   b2 = binaryData[dataIndex + 1];   l = (byte) (b2 & 0x0f);   k = (byte) (b1 & 0x03);   byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)   : (byte) ((b1) >> 2 ^ 0xc0);   byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)   : (byte) ((b2) >> 4 ^ 0xf0);   encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];   encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];   encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];   encodedData[encodedIndex++] = PAD;   }   return new String(encodedData);   }      public static byte[] decode(String encoded) {   if (encoded == null) {   return null;   }   char[] base64Data = encoded.toCharArray();   // remove white spaces   int len = removeWhiteSpace(base64Data);   if (len % FOURBYTE != 0) {   return null;// should be divisible by four   }   int numberQuadruple = (len / FOURBYTE);   if (numberQuadruple == 0) {   return new byte[0];   }   byte decodedData[] = null;   byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;   char d1 = 0, d2 = 0, d3 = 0, d4 = 0;   int i = 0;   int encodedIndex = 0;   int dataIndex = 0;   decodedData = new byte[(numberQuadruple) * 3];   for (; i < numberQuadruple - 1; i++) {   if (!isData((d1 = base64Data[dataIndex++]))   || !isData((d2 = base64Data[dataIndex++]))   || !isData((d3 = base64Data[dataIndex++]))   || !isData((d4 = base64Data[dataIndex++]))) {   return null;   }// if found "no data" just return null   b1 = base64Alphabet[d1];   b2 = base64Alphabet[d2];   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);   }   if (!isData((d1 = base64Data[dataIndex++]))   || !isData((d2 = base64Data[dataIndex++]))) {   return null;// if found "no data" just return null   }   b1 = base64Alphabet[d1];   b2 = base64Alphabet[d2];   d3 = base64Data[dataIndex++];   d4 = base64Data[dataIndex++];   if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters   if (isPad(d3) && isPad(d4)) {   if ((b2 & 0xf) != 0)// last 4 bits should be zero   {   return null;   }   byte[] tmp = new byte[i * 3 + 1];   System.arraycopy(decodedData, 0, tmp, 0, i * 3);   tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);   return tmp;   } else if (!isPad(d3) && isPad(d4)) {   b3 = base64Alphabet[d3];   if ((b3 & 0x3) != 0)// last 2 bits should be zero   {   return null;   }   byte[] tmp = new byte[i * 3 + 2];   System.arraycopy(decodedData, 0, tmp, 0, i * 3);   tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   return tmp;   } else {   return null;   }   } else { // No PAD e.g 3cQl   b3 = base64Alphabet[d3];   b4 = base64Alphabet[d4];   decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);   decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));   decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);   }   return decodedData;   }      private static int removeWhiteSpace(char[] data) {   if (data == null) {   return 0;   }   // count characters that's not whitespace   int newSize = 0;   int len = data.length;   for (int i = 0; i < len; i++) {   if (!isWhiteSpace(data[i])) {   data[newSize++] = data[i];   }   }   return newSize;   }   }   class PayResult {   private String resultStatus;   private String result;   private String memo;   public PayResult(String rawResult) {   if (TextUtils.isEmpty(rawResult))   return;   String[] resultParams = rawResult.split(";");   for (String resultParam : resultParams) {   if (resultParam.startsWith("resultStatus")) {   resultStatus = gatValue(resultParam, "resultStatus");   }   if (resultParam.startsWith("result")) {   result = gatValue(resultParam, "result");   }   if (resultParam.startsWith("memo")) {   memo = gatValue(resultParam, "memo");   }   }   }   @Override   public String toString() {   return "resultStatus={" + resultStatus + "};memo={" + memo   + "};result={" + result + "}";   }   private String gatValue(String content, String key) {   String prefix = key + "={";   return content.substring(content.indexOf(prefix) + prefix.length(),   content.lastIndexOf("}"));   }      public String getResultStatus() {   return resultStatus;   }      public String getMemo() {   return memo;   }      public String getResult() {   return result;   }   }   class SignUtils {   private static final String ALGORITHM = "RSA";   private static final String SIGN_ALGORITHMS = "SHA1WithRSA";   private static final String DEFAULT_CHARSET = "UTF-8";   public static String sign(String content, String privateKey) {   try {   PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(   Base64.decode(privateKey));   KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);   PrivateKey priKey = keyf.generatePrivate(priPKCS8);   java.security.Signature signature = java.security.Signature   .getInstance(SIGN_ALGORITHMS);   signature.initSign(priKey);   signature.update(content.getBytes(DEFAULT_CHARSET));   byte[] signed = signature.sign();   return Base64.encode(signed);   } catch (Exception e) {   e.printStackTrace();   }   return null;   }   }   前面的几个常量是需要去支付宝官网获取的,获取后直接替换ok,其他的代码基本都是从demo中copy出来的, 现在我们将支付功能封装到了一个类中,那么如何使用呢?   Alipay alipay = new Alipay(OrderConfirmActivity.this);   alipay.setListener(mAlipayListener);   alipay.pay(desc, mOrder.getShopName(), String.valueOf(orderAmount), orderSn, url);      private Alipay.OnAlipayListener mAlipayListener = new Alipay.OnAlipayListener() {   @Override   public void onSuccess() {   onOrderSubmitSuccess();   }   @Override   public void onCancel() {   onUserOrderCanceled();   Toast.makeText(OrderConfirmActivity.this, R.string.pay_failed,   Toast.LENGTH_SHORT).show();   }   @Override   public void onWait() {   }   };   new出对象来,只需要调用pay方法ok啦, 不过支付的回调我们还是必须的,当然这个也不麻烦。这里说一下pay方法的几个参数,   title 支付的标题   desc 支付的描述   price 支付的金额   sn 商品的货号   url 服务器的回调url   这几个参数在做支付的时候服务器都会给到,但是要注意一下,这几个参数都不能为空或者空字符串,否则会支付失败。


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 支付宝支付功能封装实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 支付宝支付功能封装实现

在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。封装的代码也很简单,是将官网给的demo提取出一个类来方便使用。
2022-06-06

Android支付宝支付封装代码

在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装。 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用。public class Alipay {// 商户
2022-06-06

Android中怎么接入支付宝实现支付功能

本篇文章为大家展示了Android中怎么接入支付宝实现支付功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.登录官网他的官网就是蚂蚁金服的开放平台了,我们可以访问 蚂蚁金服开放平台 ,并且注册账
2023-05-31

Android集成支付宝支付功能示例

公司项目中需要支付功能,现在支付宝、微信支付很方便,也很多人使用,因此,他们是首选。在此记录一下支付宝集成过程,下期为微信支付,敬请期待首先去支付宝官网下载其最新的Android的SDK集成Dmeo支付宝 选择SDK&Dmeo进行下载 将支
2023-05-30

uniapp如何实现支付宝支付的功能

随着移动互联网的飞速发展,人们越来越依赖于手机支付。而支付宝是其中使用最广泛的支付方式之一。在移动应用中,如果要进行支付宝支付的功能开发,那么使用uniapp框架就是一个非常好的选择。本文将介绍uniapp如何实现支付宝支付的功能。一、准备工作在开始实现支付宝支付之前,我们需要完成一些准备工作:1.获取支付宝开放平台账号首先需要注册支付宝开放平台的账号,具体可以前往支付宝开放平
2023-05-14

iOS实现H5支付(微信、支付宝)原生封装

前言支付分APP支付、H5支付、扫码支付等。app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页。如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用H5支付。本文主要讲述如何将H5支付封装成一个
2022-06-05

Android支付宝支付开发实例

在移动应用满天飞的时代,随着移动支付的盛行,很多应用中都集成了支付功能。之前的支付一直不是我负责,近期这个项目我负责订单模块少不了要做支付,每每提起支付就觉得怕怕,觉得很难,但当真正做的时候却远远没有想象中的那么难。支付宝的SDK提供了de
2022-06-06

如何进行vue项目中的支付功能实现(微信支付和支付宝支付)

如何进行vue项目中的支付功能实现(微信支付和支付宝支付),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。项目中常见的支付方式 支付宝支付 微信支付 余额支付(
2023-06-22

Android实现支付宝手势密码功能

今天就给大家分享android实现支付宝手势密码,很常见,像现在用微信支付,支付宝支付的时候都要自己设置的4位PIN码,然后输入PIN码后立即调用支付接口去支付,毫无疑问的安全问题,不会觉得手机被人拿了后却不知道自己网银的钱的去向,这也是正
2022-06-06

Android仿支付宝微信支付密码界面弹窗封装dialog

一,功能效果二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外
2022-06-06

怎么用php实现支付宝支付

用php实现支付宝支付的方法:1、扫码登录支付宝开放平台注册;2、找到开发信息,并开启RSA2密钥模式;3、查看支付宝私钥公钥等信息;4、下载支付宝支付的sdk;5、通过创建demo来实现支付宝支付即可。
2021-05-21

如何用php实现支付宝支付

这篇文章主要讲解了“如何用php实现支付宝支付”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用php实现支付宝支付”吧!用php实现支付宝支付的方法:1、扫码登录支付宝开放平台注册;2、
2023-06-21

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录