标签分类
当前位置:首页 > 移动开发电子书 > Android电子书网盘下载
从零开始学Android编程 从零开始学Android编程
niehanmin

niehanmin 提供上传

资源
17
粉丝
7
喜欢
104
评论
13

    从零开始学Android编程 PDF 高清版

    Android电子书
    • 发布时间:

    给大家带来的一篇关于Android相关的电子书资源,介绍了关于Android编程方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小134 MB,曾宏远, 崔荔蒙编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.4,更多相关的学习资源可以参阅 移动开发电子书android视频、等栏目。

  • 从零开始学Android编程 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1DwSbwbXUjgIe1nrU-AZADA
  • 分享码:khv8
  • 从零开始学Android编程 PDF

    内容介绍

    从零开始学Android编程共分为4篇包括17章,主要内容有:初识Android系统、第一个Android程序、Android常见界面布局、Android基本界面控件、Android高级控件、Android菜单与对话框、Android数据存储、Android电话和短信、Android组件内部通信——Intent、Android服务Service、Android中多媒体开发、Android网络编程、Android多线程介绍、Android图形图像的应用、Android特色应用、GPS在Android中的应用、乐分享等非常基础且重要的知识。通过对本书的学习,相信读者能够在较短的时间内理解Android系统的框架及在开发过程中用到的知识等,为进一步学习打好基础。

    读书笔记

    Android接入微信支付的方法

    1、先在微信开放平台申请开发应用,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。

    2、注册APPID (这个可以放在项目的application里)

    商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:

    final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
    // 将该app注册到微信
    msgApi.registerApp("wxd930ea5d5a258f4f");
    

    3、调用统一下单api生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。
    例:

    下面代码中的订单号是需要后台生成的

            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            WXPrePost post = new WXPrePost();
            post.appid = "你的appId";
            post.mch_id = "你的商户号";
            post.nonce_str = StringUtils.genNonceStr();//随机字符串 **1
            post.body = "商品名称";
            post.detail = "商品的描述";
            post.out_trade_no = out_trade_no; //商户订单号 **2
            post.total_fee = "商品价格";//单位是分
            post.spbill_create_ip = getLocalIpAddress();//ip地址 **3
            post.notify_url = "";//这里是后台接受支付结果通知的url地址
            post.trade_type = "APP";
            post.sign = genPackageSign(post);//签名 **4
    
            List<NameValuePair> firstSignParams = getFirstSignParams(post);
            String xml = toXml(firstSignParams);
            String entity = null;
            try {
              entity = new String(xml.getBytes(), "ISO8859-1");
              byte[] buf = Util.httpPost(url, entity);
              if (buf != null) {
                String content = new String(buf);
                Map<String, String> map = decodeXml(content);
    
                if (map != null) {
                  //再次签名(参与签名的字段有 :Appid partnerId prepayId nonceStr TimeStamp package)
                  String appId = "";
                  String prepayId = "";
                  String nonceStr = "";
                  for (Map.Entry<String, String> entry : map.entrySet()) {
                    if ("appid".equals(entry.getKey())) {
                      appId = entry.getValue();
                    } else if ("prepay_id".equals(entry.getKey())) {
                      prepayId = entry.getValue();
                    } else if ("nonce_str".equals(entry.getKey())) {
                      nonceStr = entry.getValue();
                    }
                  }
                  Log.d(TAG, "run: :" + appId + "/" + prepayId + "/" + nonceStr + "/");
                  String TimeStamp = String.valueOf(genTimeStamp());
    
                  //ok 获取二次签名
                  String secondPackageSign = genSecondPackageSign(getSecondSignParams(appId, prepayId, nonceStr, TimeStamp));
                  PayReq req = new PayReq();
                  req.appId = appId;
                  req.partnerId = "商户号";
                  req.prepayId = prepayId;
                  req.nonceStr = nonceStr;
                  req.timeStamp = TimeStamp;
                  req.packageValue = "Sign=WXPay";
                  req.sign = secondPackageSign;
                  req.extData = "app data"; // optional
                  //      System.out.println("genPackageSign3:"+post.getSign()+"/"+secondPackageSign);
                  // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
                  mApi.sendReq(req);
                  Log.d(TAG, "run: " + appId + "/" + prepayId + "/" + nonceStr + "/" + TimeStamp + "/" + secondPackageSign);
                }
              }
            } catch (Exception e) {
    
            }
    
    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;
        }
      }
    
       //获取随机字符串的方法
      public static String genNonceStr() {
        Random random = new Random();
        return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
      }
    
     private String toXml(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        for (int i = 0; i < params.size(); i++) {
          sb.append("<" + params.get(i).getName() + ">");
          sb.append(params.get(i).getValue());
          sb.append("</" + params.get(i).getName() + ">");
        }
        sb.append("</xml>");
        return sb.toString();
      }
    
     public Map<String, String> decodeXml(String content) {
        try {
          Map<String, String> 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)) {
                  xml.put(nodeName, parser.nextText());
                }
                break;
              case XmlPullParser.END_TAG:
                break;
            }
            event = parser.next();
          }
          return xml;
        } catch (Exception e) {
        }
        return null;
      }
     @NonNull
      private List<NameValuePair> getFirstSignParams(WXPrePost params) {
        List<NameValuePair> packageParams = new LinkedList<>();
        packageParams.add(new BasicNameValuePair("appid", "appId"));
        packageParams.add(new BasicNameValuePair("body", params.body));
        packageParams.add(new BasicNameValuePair("detail", params.detail));
        packageParams.add(new BasicNameValuePair("mch_id", "商户号"));
        packageParams.add(new BasicNameValuePair("nonce_str", params.nonce_str));
        packageParams.add(new BasicNameValuePair("notify_url", params.notify_url));
        packageParams.add(new BasicNameValuePair("out_trade_no", params.out_trade_no));
        packageParams.add(new BasicNameValuePair("spbill_create_ip", params.spbill_create_ip));
        packageParams.add(new BasicNameValuePair("total_fee", params.total_fee + ""));
        packageParams.add(new BasicNameValuePair("trade_type", params.trade_type));
        packageParams.add(new BasicNameValuePair("sign", params.sign));
        return packageParams;
      }
    
    public class WXPrePost {
    
      //必须带的参数
      public String appid;
      //微信开放平台审核通过的应用APPID
    
      public String mch_id;
      //微信支付分配的商户号
    
      public String nonce_str;
      //随机字符串,不长于32位。推荐随机数生成算法
    
      public String sign;
      //签名,详见签名生成算法
    
      public String body;
      // 商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
    
      public String out_trade_no;
      // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
    
      public int total_fee;
      // 订单总金额,单位为分,详见支付金额
    
      public String spbill_create_ip;
      // 用户端实际ip
    
      public String notify_url;
      // 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。(后台提供的)
    
      public String trade_type;
      // 支付类型
    
      // 非必须携带的参数
    
      public String device_info;
      // 终端设备号(门店号或收银设备ID),默认请传"WEB"
    
      public String detail;
      // 商品名称明细列表
    
      public String attach;
      // 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
    
      public String fee_type;
      // 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
      //
      public String time_start;
      // 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
      //
      public String time_expire;
      // 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则 注意:最短失效时间间隔必须大于5分钟
      public String goods_tag;
      // 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
      //
      public String limit_pay;
      //no_credit--指定不能使用信用卡支付
    
      public String getAppid() {
        return appid;
      }
    
      public void setAppid(String appid) {
        this.appid = appid;
      }
    
      public String getMch_id() {
        return mch_id;
      }
    
      public void setMch_id(String mch_id) {
        this.mch_id = mch_id;
      }
    
      public String getNonce_str() {
        return nonce_str;
      }
    
      public void setNonce_str(String nonce_str) {
        this.nonce_str = nonce_str;
      }
    
      public String getSign() {
        return sign;
      }
    
      public void setSign(String sign) {
        this.sign = sign;
      }
    
      public String getBody() {
        return body;
      }
    
      public void setBody(String body) {
        this.body = body;
      }
    
      public String getOut_trade_no() {
        return out_trade_no;
      }
    
      public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
      }
    
      public int getTotal_fee() {
        return total_fee;
      }
    
      public void setTotal_fee(int total_fee) {
        this.total_fee = total_fee;
      }
    
      public String getSpbill_create_ip() {
        return spbill_create_ip;
      }
    
      public void setSpbill_create_ip(String spbill_create_ip) {
        this.spbill_create_ip = spbill_create_ip;
      }
    
      public String getNotify_url() {
        return notify_url;
      }
    
      public void setNotify_url(String notify_url) {
        this.notify_url = notify_url;
      }
    
      public String getTrade_type() {
        return trade_type;
      }
    
      public void setTrade_type(String trade_type) {
        this.trade_type = trade_type;
      }
    
      public String getDevice_info() {
        return device_info;
      }
    
      public void setDevice_info(String device_info) {
        this.device_info = device_info;
      }
    
      public String getDetail() {
        return detail;
      }
    
      public void setDetail(String detail) {
        this.detail = detail;
      }
    
      public String getAttach() {
        return attach;
      }
    
      public void setAttach(String attach) {
        this.attach = attach;
      }
    
      public String getFee_type() {
        return fee_type;
      }
    
      public void setFee_type(String fee_type) {
        this.fee_type = fee_type;
      }
    
      public String getTime_start() {
        return time_start;
      }
    
      public void setTime_start(String time_start) {
        this.time_start = time_start;
      }
    
      public String getTime_expire() {
        return time_expire;
      }
    
      public void setTime_expire(String time_expire) {
        this.time_expire = time_expire;
      }
    
      public String getGoods_tag() {
        return goods_tag;
      }
    
      public void setGoods_tag(String goods_tag) {
        this.goods_tag = goods_tag;
      }
    
      public String getLimit_pay() {
        return limit_pay;
      }
    
      public void setLimit_pay(String limit_pay) {
        this.limit_pay = limit_pay;
      }
    }
    
    

    这里给出的参数都是可以移动端自己获取到的,当然,最好是后台提供给我们,出于安全性考虑

    支付完成,微信会回调WXPayEntryActivity,这里就不详细说了,微信文档说的很清晰
    在WXPayEntryActivity的onResp()里面返回的微信支付的结果(注:这个结果不能作为我们购买商品成功与否的结果,要以微信回调给回台,然后回台告诉我们的支付结果为准)

    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
    
          int code = resp.errCode;
          switch (code) {
            case 0:
              Log.d(TAG, "onPayFinish, errCode = " + "支付成功");
              //微信支付成功后去调后台,以后台返回的支付结果为准
              //这里是微信支付完成后的回调,在这里请求后台,让他来告诉我们到底支付成功没。
              break;
            case -1:
              Toast.makeText(this, "支付失败1", Toast.LENGTH_SHORT).show();
              Log.d(TAG, "onPayFinish, errCode = " + "支付失败1");
              finish();
              break;
            case -2:
              Toast.makeText(this, "支付取消", Toast.LENGTH_SHORT).show();
              Log.d(TAG, "onPayFinish, errCode = " + "支付取消");
              finish();
              break;
            default:
    //          Toast.makeText(this, "支付失败2", Toast.LENGTH_SHORT).show();
              Log.d(TAG, "onPayFinish, errCode = " + "支付失败2");
              setResult(RESULT_OK);
              finish();
              break;
          }
        }
    
    

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

    上一篇:Node.js硬实战:115个核心技巧  下一篇:Java经典实例

    展开 +

    收起 -

    码小辫二维码
     ←点击下载即可登录

    Android相关电子书
    学习笔记
    网友NO.330850

    React-native桥接Android原生开发详解

    在开发RN的漫漫长河中,早晚有那么一天要接触到安卓的原生开发,笔者来介绍一下其中的酸甜苦辣.对于一个不懂android的小白来说,刚开始有点难,不过都是万事开头难.语言是想通的,原理也是大径若一. 开发过程中是要集成高德的导航功能,没有找到好的轮子的,只要写原生代码,然后在用JS去调用原生的导航模块. 首先注册模块 其意义在与将类注册到RN中,才能用JS去调用 public class AnExampleReactPackage implements ReactPackage { @Override public ListViewManager createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public ListNativeModule createNativeModules(ReactApplicationContext reactContext) { ListNativeModule modules = new ArrayList(); modules.add(new NaviActivity(reactContext)); return modules; }} 其中modules.add(new NaviActivity(reactContext));意义就是添加一个安卓原生的activity模块 这个模块可以定义方案,RN可以直接调用(方法上必须声明了@ReactMethod才可以) @ReactMethod public void showFengMap(String mapID){ Activity currentActivity = getCurrentActivity(); Intent intent = new Intent(currentActivity, 页面名.class); currentActivity.startActivity(intent); } 笔者其中的到吗是跳转到其他页面,这里也可以做一些其他的操作.例如直接去分享 声明 在安卓程序的app内的MainApplication内, @Override protected ListReactPackage getPackages() { return ……

    网友NO.496221

    react-native android状态栏的实现

    react-native 开发App的时候难免会遇到状态栏的,背景颜色和字体颜色与App内容页面,色调适配,间言之就是将状态栏颜色与App颜色一致,使用户界面更加整体。 1.android设备系统元素 导航栏:就是设备顶部的网络、时间、电量等信息栏 ActionBar: 返回按钮以及系统默认的header区域,RN开发中一般不会用到,RN中在navigation中进行定制 导航栏: 设备下方的物理返回、回桌面、选择应用程序等系统导航栏 2.状态栏的呈现形式 默认展示,一直显示手机系统的状态栏 透明状态栏,状态栏背景颜色透明,状态栏颜色与App颜色一致,用户界面更加整体。 隐藏状态栏(沉浸式),状态栏完全隐藏,类似于全屏游戏、视频播放器的效果 2.1 默认展示 系统默认状态栏样式,无法改变 2.2 透明状态栏 透明状态栏很常见,大多数的App都是使用这种模式,使得状态栏颜色与App颜色一致,使用户界面更加整体,整个应用看起来更加美观。 实现透明的状态栏的方式很多: 一、使用App的主题进行配置,在app/main/res/values/styles.xml中设置主题 resources !-- Base application theme. -- style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar" item name="android:windowTranslucentStatus"true/item // 设置状态栏不占据空间 // item name="android:windowLightStatusBar"true/item // 设置状态栏字体颜色 /style/resources 这种……

    网友NO.777746

    Eclipse运行android项目报错Unable to build: the file dx.jar was not loaded from the SDK folder的解决办法

    由于最近通过 SDK-Manager 更新了 build-tools ,当要用到 dx.jar 这个包时,自动调用最新 build-tools 中 dx.jar ,但是运行 Android 项目时 Console 却提示: Failed to load C:\Program Files (x86)\android\android-sdk\build-tools\26.0.0-preview\lib\dx.jar Unable to build: the file dx.jar was not loaded from the SDK folder 解决步骤: (1)找到你 Android 的 SDK 安装目录C:\Program Files (x86)\Android\android-sdk,进入 build-tools 文件夹 (2)发现还有很多其他版本的 build-tools ,而且版本都是顺序排列的,我们就任意选择一个(只要不是最新版的就行),打开进入 lib 文件夹 (3)发现里面有 dx.jar 包,复制粘贴到最新版 build-tools 存放 dx.jar 包的目录下,替换掉原来的 dx.jar 包(C:\Program Files (x86)\Android\android-sdk\build-tools\26.0.0-preview\lib\dx.jar) (4)完成,再次启动 Android 项目,问题解决! 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接 ……

    网友NO.388363

    jquery判断iPhone、Android设备类型

    最近做了一版微信宣传页,通过JQ来判断设备,并进行下载 微信内置浏览器对下载链接进行了屏蔽,所以先进行判断,如果是微信内置浏览器,则跳转应用宝链接,如果不是,则判断是iPhone/Adroid/PC 并进行跳转 代码如下: function downloadApp(){ var u = navigator.userAgent; var ua = navigator.userAgent.toLowerCase(); var isAndroid = u.indexOf('Android') -1 || u.indexOf('Adr') -1; //android终端 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 if(ua.match(/MicroMessenger/i)=="micromessenger") { //微信内置浏览器 $(".download a").click(function(){ window.location.href='http://a.app.qq.com/o/simple.jsp?pkgname=应用名 ' }); }else{ if(isiOS){ $(".download a").click(function(){ window.location.href='https://itunes.apple.com/cn/app/应用名' }); }else if(isAndroid){ $(".download a").click(function(){ window.location.href='http://a.app.qq.com/o/simple.jsp?pkgname=应用名' }); }else{ $(".download a").click(function(){ window.location.href='应用链接' }); } } } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。 ……

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明