5s微信扫不了微信二维码申请

转载自:http://blog.csdn.net/otangba/article/details/8265896
上一篇,介绍了二维码生成的机制,紧接着,我们就要开发手机客户端来识别这个二维码。
二维码,实际上是记录了这个页面的sessionID,目的是为了最后让服务器能通过long polling的机制去通知到这个浏览器。
创建二维码的时候我们采用了nodejs的QRcode库,其实如果换了其他的web服务器,也可以有其他的可选包,例如zxing。
手机上用的比较多的就是zxing库,不过用过的人都知道,zxing库的核心core只是提供二维码的解析,而应用程序本身对摄像头的操作部分必须参考zxing的应用源码。
那个源码比较的复杂,虽然很好理解,但是代码量太大了。如果要分析那部分源码,文章就要写的长篇大论了,所以这一次,我们不用zxing库,而选择一个更为高效实用的android二维码扫描组件:
ZBar不是纯的java代码,而是用了C编译的native library,因此识别的效率上比zxing要高很多。
闲话少说,先看看程序运行的一系列流程吧:
第一步,登录手机软件,我们做测试用,就只需要输入一个用户名,提交到服务器,返回一个token
为什么要做第一步,因为我们实现手机二维码登录的基础原则就是我们的手机客户端必须的登录的,这样才能作为一个凭据
例如微信,假如你不登录是不能扫描的,所以我们的例子模拟一个登录的过程
第二步,登录成功之后,开始扫描,二维码就显示在屏幕上
第三步,扫描完成后,确认是否登录网页
最后,页面提示登录完成
下面开始,由于long polling的过程我已经做好,因此手机软件才能正常运行,而今天我们只说手机客户端,服务器端的内容下一篇再说,所以,我们先假设所有的接口都OK
手机客户端分为三个Activity,分别为登录,扫描,确认
先做第一个activity
eclipse建立项目,为了符合android4的UI规范,我们采用了sherlock actionbar来实现3.x一下版本android系统的actionbar
因此,项目需要引用actionbar lib,sherlock actionbar的库不能直接引用jar包,必须要下载源码并且以lib的方式引用源码
引用完之后,新建一个class,叫做LoginActivity 继承自SherlockActivity
为了要实现在actionbar上的loading进度圈,需要设置窗体的属性
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);&&
&&&&&&&&setContentView(R.layout.login);&&
&&&&&&&&setSupportProgressBarIndeterminateVisibility(false);&&
第一个activity界面很简单,就是几个按钮,但是需要有一次和服务器的通信,也就是登录的过程如果登录成功,则显示下一步扫描的按钮,第一个activity很简单
全部代码:
package&com.zbiti.qrcodelogin.&&
import&java.util.logging.LogR&&
import&android.content.C&&
import&android.content.I&&
import&android.os.B&&
import&android.os.H&&
import&android.os.M&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.EditT&&
import&android.widget.TextV&&
import&android.widget.T&&
import&com.actionbarsherlock.app.SherlockA&&
import&com.actionbarsherlock.view.W&&
import&com.zbiti.qrcodelogin.R;&&
import&com.zbiti.qrcodelogin.util.BaseHttpC&&
public&class&LoginActivity&extends&SherlockActivity&{&&
&&&&private&Context&mC&&
&&&&private&TextView&txtI&&
&&&&private&EditText&txtUserN&&
&&&&private&Button&btnL&&
&&&&private&Button&btnStartS&&
&&&&private&Button&btnR&&
&&&&private&String&token&=&null;&&
&&&&private&final&static&String&LOGIN_URL&=&"http://192.168.111.109:8000/moblogin?";&&
&&&&private&final&static&int&MSG_LOGIN_FAILED&=&0;&&
&&&&private&final&static&int&MSG_LOGIN_OK&=&1;&&
&&&&@Override&&
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&mContext&=&LoginActivity.this;&&
&&&&&&&&requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);&&
&&&&&&&&setContentView(R.layout.login);&&
&&&&&&&&setSupportProgressBarIndeterminateVisibility(false);&&
&&&&&&&&&&
&&&&&&&&txtInfo&=&(TextView)&findViewById(R.id.txt_info);&&
&&&&&&&&txtUserName&=&(EditText)&findViewById(R.id.edit_username);&&
&&&&&&&&btnLogin&=&(Button)&findViewById(R.id.btn_client_login);&&
&&&&&&&&btnStartScan&=&(Button)&findViewById(R.id.btn_startscan);&&
&&&&&&&&btnRelogin&=&(Button)&findViewById(R.id.btn_relogin);&&
&&&&&&&&btnRelogin.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&txtInfo.setText(R.string.login_hint);&&
&&&&&&&&&&&&&&&&findViewById(R.id.cont_login).setVisibility(View.VISIBLE);&&
&&&&&&&&&&&&&&&&findViewById(R.id.cont_loggedin).setVisibility(View.GONE);&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&&btnLogin.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&setSupportProgressBarIndeterminateVisibility(true);&&
&&&&&&&&&&&&&&&&new&Thread(new&Runnable()&{&&
&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&public&void&run()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&getToken();&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}).start();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&&btnStartScan.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent();&&
&&&&&&&&&&&&&&&&intent.putExtra("token",&token);&&
&&&&&&&&&&&&&&&&intent.setClass(mContext,&MainActivity.class);&&
&&&&&&&&&&&&&&&&startActivity(intent);&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&private&void&getToken()&{&&
&&&&&&&&String&userName&=&txtUserName.getText().toString().trim();&&
&&&&&&&&if&(!userName.equals(""))&{&&
&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&token&=&BaseHttpClient.httpGet(LOGIN_URL&+&userName).trim();&&
&&&&&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&System.out.println("&&&"&+&token);&&
&&&&&&&&}&&
&&&&&&&&if&(token&==&null)&&
&&&&&&&&&&&&return;&&
&&&&&&&&if&(token.equals(""))&{&&
&&&&&&&&&&&&handler.sendEmptyMessage(MSG_LOGIN_FAILED);&&
&&&&&&&&}&else&{&&
&&&&&&&&&&&&handler.sendEmptyMessage(MSG_LOGIN_OK);&&
&&&&&&&&}&&
&&&&private&Handler&handler&=&new&Handler()&{&&
&&&&&&&&@Override&&
&&&&&&&&public&void&handleMessage(Message&msg)&{&&
&&&&&&&&&&&&if&(msg.what&==&MSG_LOGIN_OK)&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&setSupportProgressBarIndeterminateVisibility(false);&&
&&&&&&&&&&&&&&&&txtInfo.setText(getString(R.string.token_info,&token));&&
&&&&&&&&&&&&&&&&findViewById(R.id.cont_login).setVisibility(View.GONE);&&
&&&&&&&&&&&&&&&&findViewById(R.id.cont_loggedin).setVisibility(View.VISIBLE);&&
&&&&&&&&&&&&}&else&if&(msg.what&==&MSG_LOGIN_FAILED)&{&&
&&&&&&&&&&&&&&&&setSupportProgressBarIndeterminateVisibility(false);&&
&&&&&&&&&&&&&&&&Toast.makeText(mContext,&R.string.login_failed,&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
布局文件:
&version="1.0"&encoding="utf-8"&&
&xmlns:android="http://schemas.android.com/apk/res/android"&&
&&&&android:layout_width="match_parent"&&
&&&&android:layout_height="match_parent"&&
&&&&android:orientation="vertical"&&&
&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:gravity="center_vertical"&&
&&&&&&&&android:orientation="horizontal"&&&
&&&&&&&&&&
&&&&&&&&&&&&android:id="@+id/txt_info"&&
&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&android:layout_margin="20dp"&&
&&&&&&&&&&&&android:drawableLeft="@drawable/chat"&&
&&&&&&&&&&&&android:drawablePadding="10dp"&&
&&&&&&&&&&&&android:text="@string/login_hint"&&&
&&&&&&&&android:id="@+id/cont_loggedin"&&
&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:orientation="vertical"&&
&&&&&&&&android:visibility="gone"&&&
&&&&&&&&&&
&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&android:orientation="vertical"&&
&&&&&&&&&&&&android:paddingLeft="20dp"&&
&&&&&&&&&&&&android:paddingRight="20dp"&&
&&&&&&&&&&&&android:paddingTop="10dp"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&android:id="@+id/btn_startscan"&&
&&&&&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&&&&android:text="@string/start_scan"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&android:id="@+id/btn_relogin"&&
&&&&&&&&&&&&&&&&android:layout_marginTop="10dp"&&
&&&&&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&&&&android:text="@string/relogin"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&android:id="@+id/cont_login"&&
&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:orientation="vertical"&&&
&&&&&&&&&&
&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&android:orientation="horizontal"&&
&&&&&&&&&&&&android:paddingLeft="20dp"&&
&&&&&&&&&&&&android:paddingRight="20dp"&&
&&&&&&&&&&&&android:paddingTop="10dp"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&android:layout_width="60dp"&&
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&&&&android:text="@string/user_name"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&android:id="@+id/edit_username"&&
&&&&&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&android:orientation="horizontal"&&
&&&&&&&&&&&&android:paddingLeft="20dp"&&
&&&&&&&&&&&&android:paddingRight="20dp"&&
&&&&&&&&&&&&android:paddingTop="10dp"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&android:id="@+id/btn_client_login"&&
&&&&&&&&&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&&&&&&&&&android:text="@string/login"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
代码里的&privatefinalstatic&StringLOGIN_URL&="http://192.168.111.109:8000/moblogin?";
这一行是我本地测试用的模拟验证的服务器地址,和生成二维码的页面一样,都是Nodejs生成的,代码我们下一篇解释,这个接口接收手机填写的用户名,并且通过sha1进行加密,将加密过后的字符串返回给手机,手机将这个字符串作为token变量并且会传递下去。
下面开始第二个activity,就是扫描界面
首先引用zbar的包,将zbar相关的包拷贝进libs目录
包含的so文件就是c编写的native code
新建类MainActivity继承自SherlockActivity
实现扫描的代码可以从zbar的例子里整,这里不重复
需要把上一个activity传递的token获取,并往下传递
@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&getSupportActionBar().setDisplayHomeAsUpEnabled(true);&&
&&&&&&&&autoFocusHandler&=&new&Handler();&&
&&&&&&&&preview&=&(FrameLayout)&findViewById(R.id.cameraPreview);&&
&&&&&&&&&&
&&&&&&&&Intent&intent&=&getIntent();&&
&&&&&&&&token&=&intent.getStringExtra("token");&&
&&&&&&&&if&(token&==&null&||&token.equals(""))&&
&&&&&&&&&&&&finish();&&
在扫描完成的回调里,我们将扫描获得sessionID和token一起往下一个activity传递
PreviewCallback&previewCb&=&new&PreviewCallback()&{&&
&&&&&&&&public&void&onPreviewFrame(byte[]&data,&Camera&camera)&{&&
&&&&&&&&&&&&Camera.Parameters&parameters&=&camera.getParameters();&&
&&&&&&&&&&&&Size&size&=&parameters.getPreviewSize();&&
&&&&&&&&&&&&Image&barcode&=&new&Image(size.width,&size.height,&"Y800");&&
&&&&&&&&&&&&barcode.setData(data);&&
&&&&&&&&&&&&int&result&=&scanner.scanImage(barcode);&&
&&&&&&&&&&&&String&qrcodeString&=&null;&&
&&&&&&&&&&&&if&(result&!=&0)&{&&
&&&&&&&&&&&&&&&&previewing&=&false;&&
&&&&&&&&&&&&&&&&mCamera.setPreviewCallback(null);&&
&&&&&&&&&&&&&&&&mCamera.stopPreview();&&
&&&&&&&&&&&&&&&&SymbolSet&syms&=&scanner.getResults();&&
&&&&&&&&&&&&&&&&for&(Symbol&sym&:&syms)&{&&
&&&&&&&&&&&&&&&&&&&&qrcodeString&=&sym.getData();&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&if&(qrcodeString&!=&null)&{&&
&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent();&&
&&&&&&&&&&&&&&&&intent.setClass(MainActivity.this,&ConfirmActivity.class);&&
&&&&&&&&&&&&&&&&intent.putExtra("qrcodestring",&qrcodeString);&&
&&&&&&&&&&&&&&&&intent.putExtra("token",&token);&&
&&&&&&&&&&&&&&&&startActivity(intent);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
在完成扫描的回调里,我们把qrcodestring和token都提交给下一个activity
接着,我们来写第三个activity
仍然创建一个类集成sherlockactivity,类名ConfirmActivity
这个activity在启动的时候,也就意味着,扫描成功了,那么就先通知服务器端,扫描成功,页面也会即时展示出扫描成功,等待手机确认登录的信息
接下来,如果点确认登录,则通知服务器确认登录。
因此我们有2个接口
private&final&static&StringSCANNED_URL&="http://192.168.111.109:8000/scanned?";
privatefinalstatic&StringCONFIRMLOGIN_URL&="http://192.168.111.109:8000/confirmed?";
一个是通知服务器已经成功扫描的http接口,一个是通知服务器确认登录的接口。参数都是sessionID,也就是二维码带的信息,和用户token。
package&com.zbiti.qrcodelogin.&&
import&android.content.C&&
import&android.content.I&&
import&android.os.B&&
import&android.os.H&&
import&android.os.M&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
import&android.widget.TextV&&
import&com.actionbarsherlock.app.SherlockA&&
import&com.actionbarsherlock.view.MenuI&&
import&com.zbiti.qrcodelogin.R;&&
import&com.zbiti.qrcodelogin.util.BaseHttpC&&
public&class&ConfirmActivity&extends&SherlockActivity&{&&
&&&&private&Context&mC&&
&&&&private&String&sessionID;&&
&&&&private&String&&&
&&&&private&final&static&String&SCANNED_URL&=&"http://192.168.111.109:8000/scanned?";&&
&&&&private&final&static&String&CONFIRMLOGIN_URL&=&"http://192.168.111.109:8000/confirmed?";&&
&&&&private&final&static&int&LOGIN_SUCCESS=1;&&
&&&&private&final&static&int&LOGIN_FAIL=0;&&
&&&&private&Button&btnConfirmL&&
&&&&private&Button&btnC&&
&&&&private&TextView&txtI&&
&&&&@Override&&
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&mContext&=&ConfirmActivity.this;&&
&&&&&&&&setContentView(R.layout.confirm_login);&&
&&&&&&&&getSupportActionBar().setDisplayHomeAsUpEnabled(true);&&
&&&&&&&&btnConfirmLogin&=&(Button)&findViewById(R.id.btn_login);&&
&&&&&&&&btnCancel&=&(Button)&findViewById(R.id.btn_cancel);&&
&&&&&&&&txtInfo=(TextView)findViewById(R.id.txt_confirm_info);&&
&&&&&&&&btnConfirmLogin.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&new&Thread(new&Runnable()&{&&
&&&&&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&&&&&public&void&run()&{&&
&&&&&&&&&&&&&&&&&&&&&&&&notifyConfirmed();&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}).start();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&&btnCancel.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&finish();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&&Intent&intent&=&getIntent();&&
&&&&&&&&sessionID&=&intent.getStringExtra("qrcodestring");&&
&&&&&&&&token&=&intent.getStringExtra("token");&&
&&&&&&&&if&(sessionID&==&null&||&sessionID&==&null)&{&&
&&&&&&&&&&&&finish();&&
&&&&&&&&}&&
&&&&&&&&new&Thread(new&Runnable()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&run()&{&&
&&&&&&&&&&&&&&&&notifyScanned();&&
&&&&&&&&&&&&}&&
&&&&&&&&}).start();&&
&&&&private&void&notifyConfirmed()&{&&
&&&&&&&&String&url&=&CONFIRMLOGIN_URL&+&"token="&+&token&+&"&sessionid="&&
&&&&&&&&&&&&&&&&+&sessionID;&&
&&&&&&&&String&s&=&null;&&
&&&&&&&&try&{&&
&&&&&&&&&&&&s&=&BaseHttpClient.httpGet(url);&&
&&&&&&&&&&&&if(s.equals("confirmed")){&&
&&&&&&&&&&&&&&&&handler.sendEmptyMessage(LOGIN_SUCCESS);&&
&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&handler.sendEmptyMessage(LOGIN_FAIL);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&private&void&notifyScanned()&{&&
&&&&&&&&String&url&=&SCANNED_URL&+&"token="&+&token&+&"&sessionid="&+&sessionID;&&
&&&&&&&&String&s&=&null;&&
&&&&&&&&try&{&&
&&&&&&&&&&&&s&=&BaseHttpClient.httpGet(url);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&&private&Handler&handler=&new&Handler(){&&
&&&&&&&&@Override&&
&&&&&&&&public&void&handleMessage(Message&msg)&{&&
&&&&&&&&&&&&if(msg.what==LOGIN_FAIL){&&
&&&&&&&&&&&&&&&&txtInfo.setText(R.string.pc_login_fail);&&
&&&&&&&&&&&&}else&if(msg.what==LOGIN_SUCCESS){&&
&&&&&&&&&&&&&&&&btnConfirmLogin.setVisibility(View.GONE);&&
&&&&&&&&&&&&&&&&btnCancel.setVisibility(View.GONE);&&
&&&&&&&&&&&&&&&&txtInfo.setText(R.string.pc_login_succuess);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&@Override&&
&&&&public&boolean&onMenuItemSelected(int&featureId,&MenuItem&item)&{&&
&&&&&&&&if&(item.getItemId()&==&android.R.id.home)&{&&
&&&&&&&&&&&&finish();&&
&&&&&&&&}&&
&&&&&&&&return&super.onMenuItemSelected(featureId,&item);&&
布局如下:
&version="1.0"&encoding="utf-8"&&
&xmlns:android="http://schemas.android.com/apk/res/android"&&
&&&&android:layout_width="match_parent"&&
&&&&android:layout_height="match_parent"&&
&&&&android:orientation="vertical"&&&
&&&&&&&&android:layout_width="wrap_content"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:layout_gravity="center_horizontal"&&
&&&&&&&&android:layout_marginBottom="10dp"&&
&&&&&&&&android:layout_marginLeft="40dp"&&
&&&&&&&&android:layout_marginRight="40dp"&&
&&&&&&&&android:layout_marginTop="10dp"&&
&&&&&&&&android:src="@drawable/pcs"&&&
&&&&&android:id="@+id/txt_confirm_info"&&
&&&&&&&&android:layout_width="wrap_content"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:layout_gravity="center_horizontal"&&
&&&&&&&&android:text="@string/confirm_login_label"&&
&&&&&&&&android:textSize="18sp"&&&
&&&&&android:id="@+id/btn_login"&&
&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:layout_marginTop="20dp"&&
&&&&&&&&android:layout_marginLeft="40dp"&&
&&&&&&&&android:layout_marginRight="40dp"&&
&&&&&&&&android:text="@string/btn_confirm_login"&&&
&&&&&android:id="@+id/btn_cancel"&&
&&&&&&&&android:layout_width="match_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:layout_marginLeft="40dp"&&
&&&&&&&&android:layout_marginRight="40dp"&&
&&&&&&&&android:text="@string/btn_cancel"&&&
这样一个手机客户端就完成了,其中用到的http请求的过程如下:
public&static&String&httpGet(String&url)&throws&Exception{&&
&&&&&&&&String&result&=&null;&&
&&&&&&&&HttpClient&client&=&new&DefaultHttpClient();&&&
&&&&&&&&HttpGet&get&=&new&HttpGet(url);&&
&&&&&&&&HttpResponse&response&=&client.execute(get);&&
&&&&&&&&if&(response.getStatusLine().getStatusCode()&==&HttpStatus.SC_OK)&{&&&
&&&&&&&&&&&&InputStream&is&=&response.getEntity().getContent();&&
&&&&&&&&&&&&result=inStream2String(is);&&
&&&&&&&&}&&
&&&&&&&&return&&&
&&&&public&static&String&inStream2String(InputStream&is)&throws&Exception&{&&&&
&&&&&&&&ByteArrayOutputStream&baos&=&new&ByteArrayOutputStream();&&&&
&&&&&&&&byte[]&buf&=&new&byte[1024];&&&&
&&&&&&&&int&len&=&-1;&&&&
&&&&&&&&while&((len&=&is.read(buf))&!=&-1)&{&&&&
&&&&&&&&&&&&baos.write(buf,&0,&len);&&&&
&&&&&&&&}&&&&
&&&&&&&&return&new&String(baos.toByteArray());&&&&
string如下
&&&&&name="app_name"二维码登录客户端&&
&&&&&name="confirm_login_title"已经扫描,请确认登录&&
&&&&&name="confirm_login_label"即将在浏览器上登录系统\n请确认是否是本人操作&&
&&&&&name="btn_confirm_login"我确认登录系统&&
&&&&&name="btn_cancel"取消&&
&&&&&name="user_name"用户名&&
&&&&&name="user_password"密 码&&
&&&&&name="login"登录&&
&&&&&name="relogin"重新登录&&
&&&&&name="start_scan"开始扫描&&
&&&&&name="login_failed"登录失败&&
&&&&&name="login_hint"随便输入用户名,登录之后,服务器会返回一个代表你身份的token。&&
&&&&&name="token_info"您已经成功登录,token:\n&%1$s&&
&&&&&name="pc_login_succuess"网页登录成功&&
&&&&&name="pc_login_fail"网页登录失败,可能您扫描的页面已过期!&&
原创文章,转载请注明出处
【为了方便测试,我把客户端打包上传,&】
测试程序在运行时可以设置服务器地址,服务器我们在下一篇会介绍。
实现手机扫描二维码页面登录,类似web微信-第四篇,服务器端
实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端
实现手机扫描二维码页面登录,类似web微信-第二篇,关于二维码的自动生成
实现手机扫描二维码页面登录,类似web微信-第一篇,业务分析
阅读(...) 评论()微信扫不了二维码怎么办?微信扫不了二维码问题解决教程
时间: 15:15:28
来源:网络
编辑:yangxiaorong
微信扫不了二维码怎么办?要知道,微信扫一扫在生活中的使用率也是极高的,作为微信用户的我们,如果出现了扫不了二维码的问题,先不要着急,各方面排查一下。1、先检查一下手机,打开拍照功能,看是否能正常使用,照片是否模糊。如果相机拍照一切正常,就说明摄像头和相机软件都没有问题;2、再检查一下微信软件,先打开网页版微信,试试扫一下登陆二维码,看能不能正常在电脑上登陆。3、微信登陆码,也扫描不上的话,一,请打开手机中的设置――应用程序――正在运行,里面有微信,将它关闭,再重新打开这个软件。4、将手机里的微信软件升级,打开微信界面,点击下方的“我”――设置――关于微信――新版本。下载升级安装替换旧版本。温馨提示:很多时候,是因为自己的微信没有更新导致这个问题的出现,所以,尽可能及时更新微信,跟上大部队的步伐吧!
喜欢这文章可以分享给您的朋友哦
微信聊天记录删除了怎么恢复?微信重装后聊天记录不见了怎么办?有时我们...
2016年微信抢红包成了一项全民运动,不仅有好友发的红包,还有摇一摇的企...
微信小视频保存在手机哪个文件。很多人都在玩微信的小视频这个功能,有时...
微信抢红包神器大行其道,大家抢红包抢的自然是不亦乐乎。现在微信团队终...
微信显示图片已过期或已被清理 微信图片已过期恢复方法。很多朋友在收到...
微信聊天记录删除了怎么恢复?微信重装后聊天记录不见了怎么办?有时我们...
微信小视频保存在手机哪个文件。很多人都在玩微信的小视频这个功能,有时...
如何偷偷恢复微信删除好友?你有删除过好友的经历吗?你有过删除后被好友...
微信从2017年的限额20万/年到2018年的日均支付限额500元,这个限额对于一...
使用微信的时候,总会有人不小心设置了什么东西而自己完全不知道是怎回事...
微信支付密码忘了怎么办?微信支付密码找回教程。  现在微信除了聊天,...
微信怎么长截图?微信收藏长截图功能介绍,超实用!相信很多人平常截长图...
不少朋友最近反馈微信发不出消息,问小编有没有什么解决方法。小编梳理了...
今天有位小伙伴问小编:我饿的另外一个微信号好久没登了,怎么解除?微信...
微信中每个公众号的菜单都会存在一些不同,运营者可以根据自己的用户来设...

我要回帖

更多关于 微信怎样扫二维码付款 的文章

 

随机推荐