精华内容
下载资源
问答
  • Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机程序设计入门Java 手机...
  • Android 手机程序设计实用教程 Android 手机程序设计实用教程
  • J2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏程序设计.isoJ2ME MIDP 手机游戏...
  • Android手机程序设计入门、应用到精通,完整扫描版

    千次下载 热门讨论 2013-12-07 13:42:28
    《android手机程序设计入门、应用到精通》把android的功能按照特性进行分类,根据由浅入深的原则,以教学单元搭配步骤讲解,并穿插搭配了许多包含精心设计和讲解的应用程序开发案例,如“婚姻建议程序”、“电脑猜拳...
  • java手机PDA程序设计入门 java手机PDA程序设计入门 java手机PDA程序设计入门
  • 主要为大家详细介绍了小程序根据手机机型设置自定义底部导航距离,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 智能手机程序设计 该题目要求作品运行于主流3G智能手机操作系统平台,即所提交的作品应该能够在主流平台的模拟器或手机上演示。软件平台应选用两大主流手机操作系统Android或IOS。可以在如下三个方向选择应用:  ...

    智能手机程序设计

    该题目要求作品运行于主流3G智能手机操作系统平台,即所提交的作品应该能够在主流平台的模拟器或手机上演示。软件平台选用两大主流手机操作系统AndroidIOS。可以在如下个方向选择应用:
      选题方向一  《移动应用在物流行业的应用》
      1. 设计目的:设计一个3G网络环境下,通过智能手机实现物流行业的专业应用程序。
      2. 设计思路提示:可以针对物流行业的任何应用,例如,基于GPS的仓储配货系统、基于二维码的物流识别系统,物流生产、运输监控系统等。
      选题方向二  《基于Open API的移动互联网应用》
      1. 设计目的:要求设计基于互联网上Open API的有创意或实用价值的手机应用程序。
      2. 设计思路提示:基于互联网上的Open API或自建后台,例如,天气信息、微博客户端、手机淘宝、电视节目查询、基于LBS的应用等等,但要求有良好的创意或实用性。

     选题方向  效率办公应用
      1. 设计目的:要求设计基于移动互联网上效率办公方面具有实用价值的手机应用程序。
      2. 设计思路提示:建议自建后台,也可使用现有网站提供的API实现个人日程安排、待办事项等效率方面软件,可以实现手机数据和网络存储的同步

    个人博客:http://blog.amtemai.com


    展开全文
  • 简单管理Android手机程序的小程序

    万次阅读 2016-11-29 12:07:01
    最近突发奇想,基于launcher开发做个管理手机程序,让想要显示的程序显示就可以了。无聊玩一玩当是练练手。妈妈再也不用担心小孩乱玩手机了,男生再也不用担心女朋友乱翻手机了。演示图如下:功能如下:1、在本...

    最近突发奇想,基于launcher开发做个管理手机小程序,让想要显示的程序显示就可以了。无聊玩一玩当是练练手。

    妈妈再也不用担心小孩乱玩手机了,男生再也不用担心女朋友乱翻手机了。

    演示图如下:

    这里写图片描述

    功能如下:

    • 1、在本程序界面屏蔽返回键,将手机桌面替换成自己的桌面。效果:按下home就是回到本程序。

      2、右上角提供操作功能:管理者输入密码,显示手机所有程序,选择自己想要显示的程序。

      3、显示的程序可以直接启动,退出,Home键会到本程序,多任务键可回到启动程序。

      4、屏蔽设置应用,从下拉菜单,多任务键,显示应用进入无效。

      5、提供设置功能:管理者输入密码,跳设置界面,可选择切换桌面。

      6、因为是桌面应用,开机无延时自启动。缓存应用信息,开机自动显示保存的应用。

    所需技术:

    • 1、在清单文件中设置Activity的IntentFilter,将应用变为桌面应用,第一个次启动会自动提示是否切换,并不需要到设置里面设置。

      2、通过PackageManager获取手机所有应用信息

      3、通过Intent显示启动应用。

      4、屏蔽设置功能:启动一个service,并且启动一个定时器:固定一个时间内,监听应用栈顶的信息。如果为设置应用,则跳转到该程序。难点:5.0以下和5.0以上获取栈顶应用方式不一样,并且5.0还需要在手机打开应用的权限,这里可以使用Intent显示打开,减少用户操作难度。

      5、缓存用SharedPreference,保存管理者要显示的应用的包名即可。

      6、设置的功能,直接关闭服务,不过关闭服务有延时。所以新启动个线程,阻塞一下,一定时间内再关闭进度条,再跳到设置。

    主要讲了一下大概,其余都是小细节,不过在做的时候还是有很多坑,比如添加权限等等。

    其次,有些手机厂商本身的系统会自己去屏蔽掉原生系统桌面应用这个功能,这个有点烦。

    还有什么好玩的功能,欢迎评论提出,有能力有时间就慢慢添加。

    Gitthub地址:https://github.com/Abrazen/AppManagerDemo
    Csdn下载地址: http://download.csdn.net/detail/abrazen_zz/9696595

    展开全文
  • 微信小程序 获取手机号 JS

    万次阅读 多人点赞 2020-03-31 09:17:14
    当我们在开发微信小程序中,有一个常用的功能,就是获取用户的手机号,然后一键登入小程序,那么手机号如何获取呢?请认真看完本文,保证可以获取到用户的手机号。

    本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/105214094 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。 


    目录

    第一步:使用wx.login接口获取code(临时数据)

    第二步:使用第一步的code,获取session_key和openid(确认用户唯一的数据)

    第三步:使用getPhoneNumber接口,获取iv和encryptedData(获取加密的数据)

    第四步:解密返回数据,获取手机号码(解密后的数据)


    说明:笔者重新规划了博客方向,想更详细的讲解微信小程序的所有技术内容,本文于2020年5月25日已做修改。

    本文首发CSDN,纯笔者原创手打,欢迎社会各界朋友来转载我的文章,希望先来私信我,转载后文章加上原文地址!

    同时笔者也欢迎一起合作共赢,愿意写杂志,写书,贡献自己的一份微薄之力!

    当我们在开发微信小程序中,有一个常用的功能,就是获取用户的手机号,然后一键登入小程序,那么手机号如何获取呢?请认真看完本文,保证可以获取到用户的手机号。

    如果您想系统的学习微信小程序,欢迎关注我的CSDN微信小程序专栏,我将不定期更新所学技术,谢谢!

     

    刚开始开发微信小程序的时候,想着实现手机验证码登入,后来查阅资料得知,发给用户的短信是要自己付费的。后来想想,微信获取用户的手机号一样可以保证手机号码的真实性,因为手机号既然可以绑定微信,那么肯定是被严格核验过的,然后就开始了获取手机号之旅,网上教程有很多,但不知什么原因,都是会少一些内容,有的只有前端代码,没有后端;有的后端代码是PHP,不是我们想要的 Java 或者JavaScript。我抱着开源的思想,给大家分享我获取手机号的办法,希望能帮到大家。


    首先我们可以去看一看官方文档,获取手机号大致分为以下四步:

    • 第1步:使用wx.login接口获取code(临时数据)
    • 第2步:使用第一步的code,获取session_key和openid(确认用户唯一的数据)
    • 第3步:使用getPhoneNumber接口,获取iv和encryptedData(获取加密的数据)
    • 第4步:解密返回数据,获取手机号码(解密后的数据)

    下面详细讲解:

     

    第一步:使用wx.login接口获取code(临时数据)

     

    官方文档是这么写的:

    获取微信用户绑定的手机号,需先调用wx.login接口。
    因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。

    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。

    我们可以提炼出下面几条关键信息:

    • 只能由非个人的小程序才能获取用户手机号。
    • 获取手机号必须由button按钮组件触发,而不能写在onLoad()内自动获取。
    • 需在必要的情况下使用。

    第一步获取code的代码和运行截图和第二步一起给,因为这两步必须写在一个方法内,不能单独两个方法,然后在onLoad()调用,因为小程序执行onLoad()内的方法,并不是按照代码先后顺序的(经验之谈)

     

    第二步:使用第一步的code,获取session_key和openid(确认用户唯一的数据)

     

    sessionkey和openid是用户的身份证明,一位用户在使用某一个小程序的时候,sessionkey是唯一的。当然一位用户在使用不同的小程序的时候,sessionkey是不一样的。

    官网文档是这样写的:

    需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

    我们需要拿来第一步获取到的code,来向服务器换取sessionkey和openid。

    具体代码如下:

    getLogin: function () {
      var that = this;
      wx.login({
        success: function (res) {
          console.log(res);
          that.setData({
            code: res.code,
          })
          wx.request({
            url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wx846bd21xxxxxxxxx&secret=45135d68ebe49de6fe313xxxxxxxxxxx&js_code=' + that.data.code + '&grant_type=authorization_code',
            method: 'POST',
            header: {
              'content-type': 'application/json'
            },
            success: function (res) {
              console.log(res);
              that.setData({
                sessionkey: res.data.session_key,
                openid: res.data.openid,
              })
            }
          })
        }
      })
    },

    我们只需要在onLoad()这个生命周期函数内调用这个方法就可以了。

    该方法首先调用wx.login()接口,获取到code,保存在页面变量code中,也就是第一步的操作代码。

    接着调用wx.request()接口向服务器请求换取sessionkey和openid,再copy本代码的时候,你要替换掉appid和secret,这些可以在微信公众平台获取。

    正常情况下,你就可以获取到sessionkey和openid了,当然如果你是个人认证的小程序,那恐怕就报错了。如果还有其他错误,欢迎在文章下方留言。

    但是这只是在测试的时候可以获取,在实际运维的时候不能这样写,我们看微信官方文档的说明:

    在微信开发者工具中,可以临时开启 开发环境不校验请求域名、TLS版本及HTTPS证书 选项,跳过服务器域名的校验。此时,在微信开发者工具中及手机开启调试模式时,不会进行服务器域名的校验。

    在服务器域名配置成功后,建议开发者关闭此选项进行开发,并在各平台下进行测试,以确认服务器域名配置正确。

    也就是说,https://api.weixin.qq.com/sns/jscode2session这个接口,我们不能直接去调用,这个时候,我们就要自己写一个jsp文件,放在Tomcat的webapp目录下,然后微信小程序通过这个jsp文件,来向微信服务器请求sessionkey和openid。

    appid和secret需要自己替换。

    <%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
    <%@ page language="java" import="java.net.*,java.io.*"%>
    <%!
    public static String GetURLstr(String strUrl)
    {
     InputStream in = null;
     OutputStream out = null;
     String strdata = "";
     try
     {
      URL url = new URL(strUrl);
      in = url.openStream();
      out = System.out;
      byte[] buffer = new byte[4096];
      int bytes_read;
      while ((bytes_read = in.read(buffer)) != -1)
      {
       String reads = new String(buffer, 0, bytes_read, "UTF-8");
       strdata = strdata + reads;
      }
      in.close();
      out.close();
      return strdata;
     }
     catch (Exception e)
     {
      System.err.println(e);
      System.err.println("Usage: java GetURL <URL> [<filename>]");
      return strdata;
     }
    }
    %>
    <%
    request.setCharacterEncoding("UTF-8"); 
    String str_code = "";
    str_code = request.getParameter("code");
    
    String str_token = "";
    str_token = str_token + "https://api.weixin.qq.com/sns/jscode2session";
    str_token = str_token + "?appid=wx846bd21xxxxxxxxx&secret=45135d68ebe49de6fe313xxxxxxxxxxx";
    str_token = str_token + "&js_code=" + str_code ;
    str_token = str_token + "&grant_type=authorization_code";
    
    String neirong_token = "";
    neirong_token = GetURLstr(str_token);
    out.print(neirong_token);
    %>

    这个jsp文件需要放在Tomcat安装目录的webapp,用来被微信小程序前台来请求数据。

    同时,我们微信小程序前台代码也要稍加修改。改为向jsp文件获取,传上去一个参数code。

    getLogin: function () {
      var that = this;
      wx.login({
        success: function (res) {
          console.log(res);
          that.setData({
            code: res.code,
          })
          wx.request({
            url: 'https://127.0.0.1:8080/test/getOpenId.jsp?code=' + that.data.code,
            method: 'POST',
            header: {
              'content-type': 'application/json'
            },
            success: function (res) {
              console.log(res);
              that.setData({
                sessionkey: res.data.session_key,
                openid: res.data.openid,
              })
            }
          })
        }
      })
    },

     效果同下图所示:

     

    第三步:使用getPhoneNumber接口,获取iv和encryptedData(获取加密的数据)

     

    我们还是先来看官网文档怎么写的:

    需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。

    然后就是官网文档的demo:

    //WXML
    <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
    
    //JS
    Page({
      getPhoneNumber (e) {
        console.log(e.detail.errMsg)
        console.log(e.detail.iv)
        console.log(e.detail.encryptedData)
      }
    })

    我们可以从中看出:获取手机号必须由button按钮组件触发,而不能写在onLoad()内自动获取。

    也就是说,这一步不需要我们进行什么操作,只要在WXML定义一个按钮,加上open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"属性,然后在JS文件中写一个getPhoneNumber方法,该方法有一个参数e,我们可以从这个e中获取iv和encryptedData,这个encryptedData就是加密的数据,其中包括我们需要的电话号码。

    那么,接下来就需要我们解密了。

     

    第四步:解密返回数据,获取手机号码(解密后的数据)

    我们还是先来看官方文档:

    微信会对这些开放数据做签名和加密处理。开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。

    接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

    对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
    对称解密的目标密文为 Base64_Decode(encryptedData)。
    对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
    对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
    微信官方提供了多种编程语言的示例代码。每种语言类型的接口名字均一致。调用方式可以参照示例。

    我们可以看出什么内容?关键的信息如下:

    • 我们获取到了sessionkey和openid,要把sessionkey和openid用来解密第三步的加密数据。
    • 我们需要用到某个高深的算法。
    • 官方提供的解密算法没有Java和JavaScript版。

    我使用了JavaScript版,改解密数据的模板结构如下,我会在下面把所有的代码提供给大家。

    这个解密算法,会把第二步获取的sessionkey和openid,第三步获取的 iv和encryptedData,解密成真正的手机号码。

    我们先来看获取手机号的页面的代码:

    var WXBizDataCrypt = require('../../utils/RdWXBizDataCrypt.js');
    var AppId = 'wx846bd21xxxxxxxxx'
    var AppSecret = '45135d68ebe49de6fe313xxxxxxxxxxx'
    getPhoneNumber(e) {
      var that = this;
      console.log(e.detail.errMsg)
      console.log(e.detail.iv)
      console.log(e.detail.encryptedData)
      var pc = new WXBizDataCrypt(AppId, this.data.sessionkey)
      wx.getUserInfo({
        success: function (res) {
          var data = pc.decryptData(e.detail.encryptedData, e.detail.iv)
          console.log('解密后 data: ', data)
          console.log('手机号码: ', data.phoneNumber)
          that.setData({
            tel: data.phoneNumber,
          })
        }
      })
    },

    appid和secret需要自己替换。

    我们先来看运行效果:

    点击允许之后,开发工具的调试区域会打印如下信息:

    这样就成功获取到了手机号码。


    接下来是该JavaScript解密算法的部分代码,因为代码太长了,放文章里面不太合适,我会单独上传到CSDN下载模块,拿来即用即可,大家也可以在下面评论区找我要文件,笔者每天都登CSDN,谢谢大家的理解和配合。


    SHA1.js

    (function(){
    
    var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
    
    // Shortcuts
    var util = C.util,
        charenc = C.charenc,
        UTF8 = charenc.UTF8,
        Binary = charenc.Binary;
    
    // Public API
    var SHA1 = C.SHA1 = function (message, options) {
    	var digestbytes = util.wordsToBytes(SHA1._sha1(message));
    	return options && options.asBytes ? digestbytes :
    	       options && options.asString ? Binary.bytesToString(digestbytes) :
    	       util.bytesToHex(digestbytes);
    };
    
    // The core
    SHA1._sha1 = function (message) {
    
    	// Convert to byte array
    	if (message.constructor == String) message = UTF8.stringToBytes(message);
    	/* else, assume byte array already */
    
    	var m  = util.bytesToWords(message),
    	    l  = message.length * 8,
    	    w  =  [],
    	    H0 =  1732584193,
    	    H1 = -271733879,
    	    H2 = -1732584194,
    	    H3 =  271733878,
    	    H4 = -1009589776;
    
    	// Padding
    	m[l >> 5] |= 0x80 << (24 - l % 32);
    	m[((l + 64 >>> 9) << 4) + 15] = l;
    
    	for (var i = 0; i < m.length; i += 16) {
    
    		var a = H0,
    		    b = H1,
    		    c = H2,
    		    d = H3,
    		    e = H4;
    
    		for (var j = 0; j < 80; j++) {
    
    			if (j < 16) w[j] = m[i + j];
    			else {
    				var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
    				w[j] = (n << 1) | (n >>> 31);
    			}
    
    			var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
    			         j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
    			         j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
    			         j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
    			                  (H1 ^ H2 ^ H3) - 899497514);
    
    			H4 =  H3;
    			H3 =  H2;
    			H2 = (H1 << 30) | (H1 >>> 2);
    			H1 =  H0;
    			H0 =  t;
    
    		}
    
    		H0 += a;
    		H1 += b;
    		H2 += c;
    		H3 += d;
    		H4 += e;
    
    	}
    
    	return [H0, H1, H2, H3, H4];
    
    };
    
    // Package private blocksize
    SHA1._blocksize = 16;
    
    SHA1._digestsize = 20;
    
    })();
    

    Crypto.js

    if (typeof Crypto == "undefined" || ! Crypto.util)
    {
    (function(){
    
    var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    
    // Global Crypto object
    // with browser window or with node module
    var Crypto = (typeof window === 'undefined') ? exports.Crypto = {} : window.Crypto = {}; 
    
    // Crypto utilities
    var util = Crypto.util = {
    
    	// Bit-wise rotate left
    	rotl: function (n, b) {
    		return (n << b) | (n >>> (32 - b));
    	},
    
    	// Bit-wise rotate right
    	rotr: function (n, b) {
    		return (n << (32 - b)) | (n >>> b);
    	},
    
    	// Swap big-endian to little-endian and vice versa
    	endian: function (n) {
    
    		// If number given, swap endian
    		if (n.constructor == Number) {
    			return util.rotl(n,  8) & 0x00FF00FF |
    			       util.rotl(n, 24) & 0xFF00FF00;
    		}
    
    		// Else, assume array and swap all items
    		for (var i = 0; i < n.length; i++)
    			n[i] = util.endian(n[i]);
    		return n;
    
    	},
    
    	// Generate an array of any length of random bytes
    	randomBytes: function (n) {
    		for (var bytes = []; n > 0; n--)
    			bytes.push(Math.floor(Math.random() * 256));
    		return bytes;
    	},
    
    	// Convert a byte array to big-endian 32-bit words
    	bytesToWords: function (bytes) {
    		for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
    			words[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);
    		return words;
    	},
    
    	// Convert big-endian 32-bit words to a byte array
    	wordsToBytes: function (words) {
    		for (var bytes = [], b = 0; b < words.length * 32; b += 8)
    			bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
    		return bytes;
    	},
    
    	// Convert a byte array to a hex string
    	bytesToHex: function (bytes) {
    		for (var hex = [], i = 0; i < bytes.length; i++) {
    			hex.push((bytes[i] >>> 4).toString(16));
    			hex.push((bytes[i] & 0xF).toString(16));
    		}
    		return hex.join("");
    	},
    
    	// Convert a hex string to a byte array
    	hexToBytes: function (hex) {
    		for (var bytes = [], c = 0; c < hex.length; c += 2)
    			bytes.push(parseInt(hex.substr(c, 2), 16));
    		return bytes;
    	},
    
    	// Convert a byte array to a base-64 string
    	bytesToBase64: function (bytes) {
    
    		// Use browser-native function if it exists
    		if (typeof btoa == "function") return btoa(Binary.bytesToString(bytes));
    
    		for(var base64 = [], i = 0; i < bytes.length; i += 3) {
    			var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
    			for (var j = 0; j < 4; j++) {
    				if (i * 8 + j * 6 <= bytes.length * 8)
    					base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
    				else base64.push("=");
    			}
    		}
    
    		return base64.join("");
    
    	},
    
    	// Convert a base-64 string to a byte array
    	base64ToBytes: function (base64) {
    
    		// Use browser-native function if it exists
    		if (typeof atob == "function") return Binary.stringToBytes(atob(base64));
    
    		// Remove non-base-64 characters
    		base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
    
    		for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
    			if (imod4 == 0) continue;
    			bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
    			           (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
    		}
    
    		return bytes;
    
    	}
    
    };
    
    // Crypto character encodings
    var charenc = Crypto.charenc = {};
    
    // UTF-8 encoding
    var UTF8 = charenc.UTF8 = {
    
    	// Convert a string to a byte array
    	stringToBytes: function (str) {
    		return Binary.stringToBytes(unescape(encodeURIComponent(str)));
    	},
    
    	// Convert a byte array to a string
    	bytesToString: function (bytes) {
    		return decodeURIComponent(escape(Binary.bytesToString(bytes)));
    	}
    
    };
    
    // Binary encoding
    var Binary = charenc.Binary = {
    
    	// Convert a string to a byte array
    	stringToBytes: function (str) {
    		for (var bytes = [], i = 0; i < str.length; i++)
    			bytes.push(str.charCodeAt(i) & 0xFF);
    		return bytes;
    	},
    
    	// Convert a byte array to a string
    	bytesToString: function (bytes) {
    		for (var str = [], i = 0; i < bytes.length; i++)
    			str.push(String.fromCharCode(bytes[i]));
    		return str.join("");
    	}
    
    };
    
    })();
    }
    

    CryptoMath.js

    (function(){
    
    var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
    
    // Shortcut
    var util = C.util;
    
    // Convert n to unsigned 32-bit integer
    util.u32 = function (n) {
    	return n >>> 0;
    };
    
    // Unsigned 32-bit addition
    util.add = function () {
    	var result = this.u32(arguments[0]);
    	for (var i = 1; i < arguments.length; i++)
    		result = this.u32(result + this.u32(arguments[i]));
    	return result;
    };
    
    // Unsigned 32-bit multiplication
    util.mult = function (m, n) {
    	return this.add((n & 0xFFFF0000) * m,
    			(n & 0x0000FFFF) * m);
    };
    
    // Unsigned 32-bit greater than (>) comparison
    util.gt = function (m, n) {
    	return this.u32(m) > this.u32(n);
    };
    
    // Unsigned 32-bit less than (<) comparison
    util.lt = function (m, n) {
    	return this.u32(m) < this.u32(n);
    };
    
    })();
    

     

    展开全文
  • 使用fiddle抓包,手机已安装fiddle证书,在手机wifi的高级设置设置了手动代理后,微信小程序就连不上网了,但是网页,微信聊天以及其他应用都正常。
  • 各大厂商手机设置程序后台运行

    千次阅读 2019-05-28 11:03:16
    android手机由于操作系统版本和厂商的问题,设置位置不一样。 首先先设置wifi长连接的状态,在设置=>wlan=>高级设置=>设置在休眠状态下保持WLAN网络连接为“始终” 接下来我们就根据不同手机的情况设置 ...

    android手机由于操作系统版本和厂商的问题,设置位置不一样。

    首先先设置wifi长连接的状态,在设置=>wlan=>高级设置=>设置在休眠状态下保持WLAN网络连接为“始终”

    接下来我们就根据不同手机的情况设置

    1、华为手机:

    找到“手机管家”APP打开,找到“应用启动管理”,找到相应的应用APP,通过右侧滑动开关滑动为手动管理,把“允许自启动”,“允许管理启动”,“允许后台活动”全部开启。

    2、小米手机:

    (1)找到“安全中心”APP打开,找到“应用管理”,找到或者搜索你的应用,点击,找到“省电策略”,选择“无限制”。这就完成设置。

    (2)打开“安全中心”APP,选择“优化加速”,点击“一键加速”,加速完成后找到“自启动管理”,点击“立即查看”,找到相关应用后,点击右侧的滑动开关为开启状态,让该应用拥有自启动权限。

    3、三星手机:

    找到“智能管理器”’APP打开,找到“应用程序管理”,找到自动运行应用管理程序,点击“管理自动运行”,找到应用APP把开关打开即可。

    4、vivo手机:

    (1)打开“i管家”APP,点击“电池管理”,点击“后台高耗电”,找到你的应用程序,选择右侧的滑动开关打开。

    (2)打开“i管家”APP,点击“应用管理” =》“权限管理”=》“应用”,找到你的应用程序=》“单项权限设置”=》滑动打开“自启动”,“悬浮窗”,“锁屏显示”,“后台弹出界面”这些选项。

    展开全文
  • 1、安装usb驱动 手机要能与电脑相连,当然要安驱动了。效果就是你插入手机,电脑显示驱动已识别。驱动安装的官方教程 不同的Android手机有对应不同的驱动,对于Nexus One, and Nexus S,见官方教程“Downloading ...
  • 《Android 手机程序设计实用教程》 内容简介: 《Android程序设计实用教程》由向守超和姚骏屏主编,面向所有对Android SDK在Android移动手机平台上创建应用程序感兴趣的读者。不管是有丰富Java开发经验的...
  • 安卓手机蓝牙控制智能小车 android程序设计

    万次阅读 热门讨论 2016-06-10 19:21:11
    项目名称: 安卓手机控制智能小车本文主要介绍手机程序设计源码托管在地址:github.com/cyang812/Bluetooth_Car 开发平台 :win10; 开发软件:Android Studio 2.1 在开发的过程中,软件版本有过几次更新,本文...
  • font-family:Monospaced Number,Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif...微信小程序使用系统...
  • 在线课程和代码 请购买套餐,套餐包含 1、安装和演示课程 2、后台权限管理系统讲解和源代码 3、商城网站前后台开发讲解和源代码 4、小程序商城界面设计课程讲解和源代码 5、小程序开发课程讲解和源代码 6、小程序...
  • 手机测试Android程序

    千次阅读 2012-10-17 11:48:17
    由于模拟器启动的太慢,测试android程序时相对较不顺畅,故笔者为大家...1、用usb数据线将手机与电脑连接(手机2.3.5: 设置-->应用程序-->开发-->usb调试) 2、打开eclipse-->window-->show view-->other-->Devic
  • 讲解如何发布小程序商城的后台、如何设置、如何发布小程序设置程序、功能演示 包含界面和开发讲解;主要讲解移动商城首页、商城分类、商城购物车、产品分类、产品列表、评论、地址管理、下单、会员注册、会员...
  • 写在前面的话:按照以下方法可以...说明:微信小程序获取手机号码只能通过button触发,且不可通过获取用户设置authSetting来提前获取用户的授权,获取到的是加密后的手机号码! 业务逻辑js代码 let WXBizDataCrypt =...
  • (5)在手机通用-关于手机-证书信任设置,启用完全信任 [img=https://img-bbs.csdn.net/upload/202011/25/1606270284_557969.png][/img] (6)在fiddler中启用过滤,就可以只显示host为small-api.wowdsgn.com的包...
  • 包含界面和开发讲解; 主要讲解移动商城首页、商城分类、商城购物车、产品分类、产品列表、评论、地址管理、下单、会员注册、会员登录、密码修改、订单列表、收藏、信息列表和...小程序的发布和设置、功能演示  
  • 而且,这个解决方式是用小程序来解决,完全不需用下APP,真正地在一款小程序上处理多个小程序客服消息!   一、在没有账号之前,支持抢先体验!选择小程序测试账号登入   二、主界面消息分类,消息测试 ①...
  • 微信小程序背景图设置
  • 支付宝小程序获取手机号码跟微信小程序的不一样,所以获取的流程也有很多的不同,所以第一步并不是直接写代码。 流程如下: 一、登录支付宝小程序开发管理平台 ->开发中心->小程序应用->选择你的小程序...
  • 如题,对单卡手机的我知道。 就是不知道双卡手机有没有什么不一样的地方。
  • 我们在做小程序页面时常常会需要设置背景,而不同手机的屏幕宽高度并不一样,虽然设置宽度为750rpx来解决宽度自适应的问题,但高度却没有这种方法,下面来简单介绍一下设置高度自适应的方法: 一、750rpx自适应宽度 ...
  • 请购买套餐,套餐包含 1、H5商城界面设计课程讲解和源代码 2、后台权限管理系统讲解和源代码 3、商城网站前后台开发讲解和源代码 4、小程序商城界面设计课程讲解和源代码 5、小程序开发课程讲解和源代码 6、小程序...
  • 使用AlarmManager设置闹钟,但是在华为手机上一旦程序被清除,闹钟就失效了。在中兴和魅族的手机上却一直有效。华为,你在EMUI里搞了什么鬼?
  • 今天给大家分享一下如何去设置我们的一个手机后台允许使用的程序,如果后台太多的话,就会导致我们的电量损耗非常快,而且还会卡顿,下面我们来操作一下吧。 因为我们手机有很多种型号,每种设置都不一样,下面先以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431,523
精华内容 172,609
关键字:

怎么设计手机程序