疯狂的二维码连盟怎样扫描二维码

iOS 原生二维码扫描(可限制扫描区域)
写这篇文章的主要原因不是展示如何使用 AVFoundation
来进行二维码扫描,更主要的是限制扫描二维码的范围。(因为默认的是全屏扫描)
项目遇到扫描二维码的功能需求,这里我放弃了使用三方库,而采用了苹果原生的扫描。
原生的好处就是扫描特别快效率特别高,但是遇到一个问题就是不知道怎么去限制扫描范围。
还是先简单说一下怎么使用来进行二维码扫描吧。
首先是要用到的几个类
@property (strong,nonatomic)AVCaptureDevice *
@property (strong,nonatomic)AVCaptureDeviceInput *
@property (strong,nonatomic)AVCaptureMetadataOutput *
@property (strong,nonatomic)AVCaptureSession *
@property (strong,nonatomic)AVCaptureVideoPreviewLayer
他们之间的关系可以看下面的篇文章
下面分别创建他们
_device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
_input = [AVCaptureDeviceInputdeviceInputWithDevice:self.deviceerror:nil];
_output = [[AVCaptureMetadataOutputalloc]init];
[_outputsetMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
// Session
_session = [[AVCaptureSessionalloc]init];
[_sessionsetSessionPreset:AVCaptureSessionPresetHigh];
if ([_sessioncanAddInput:self.input])
[_sessionaddInput:self.input];
if ([_sessioncanAddOutput:self.output])
[_sessionaddOutput:self.output];
条码类型 AVMetadataObjectTypeQRCode
_output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
// Preview
_preview =[AVCaptureVideoPreviewLayerlayerWithSession:_session];
_preview.videoGravity =AVLayerVideoGravityResizeAspectF
_preview.frame =self.view.layer.
[self.view.layerinsertSublayer:_previewatIndex:0];
[_sessionstartRunning];
然后实现 AVCaptureMetadataOutputObjectsDelegate
#pragma mark AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray
*)metadataObjects fromConnection:(AVCaptureConnection *)connection
NSString *stringV
if ([metadataObjectscount] >0)
//停止扫描
[_sessionstopRunning];
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjectsobjectAtIndex:0];
stringValue = metadataObject.stringV
到此为止就可以成功扫描二维码了,但是有个尴尬的问题,这时的扫描是全屏扫描的。即
vc/CzuejrLDRy/nT0M/rtb21xLe9t6i2vMrUwcvSu7Hpo6y1q8rHtryyu9DQo6i2vMrHwOGjqaOs1+xcb6tcTKsbryt6LP1sHL0ru49rHIvc+/ydLJtcS146GjPC9wPgo8cD48YnI+CjwvcD4KPHA+PC9wPgo8cD5AcHJvcGVydHkobm9uYXRvbWljKUNHUmVjdCByZWN0T2ZJbnRlcmVzdApOU19BVkFJTEFCTEVfSU9TKDdfMCk7PC9wPgrV4srHtcQgQVZDYXB0dXJlTWV0YWRhdGFPdXRwdXQg0ru49sr00NSjrMv8tcS94srNyscKCjxwPgpAZGlzY3Vzc2lvbjwvcD4KPHA+ClRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIGEgQ0dSZWN0IHRoYXQgZGV0ZXJtaW5lcyB0aGUgcmVjZWl2ZXI="s rectangle of interest for each frame of video.
The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata.
Specifying
a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the
value CGRectMake(0, 0, 1, 1).
Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
大概意思就是设置每一帧画面感兴趣的区域(字面意思),那岂不是就是设置扫描范围喽,大喜
于是赶紧把rectOfInterest设置成中间框的frame,
[_outputsetRectOfInterest:CGRectMake((ScreenWidth-220)/2,60+64,220,
//中间区域的宽和高都是220
ScreenWidth为设备屏幕宽度
但是却发现怎么扫描都不能成功了。于是又看了看上面的一段话。
第二句:区域的原点在左上方(后面才知道坑苦我了!),然后区域是相对于设备的大小的,默认值是CGRectMake(0, 0, 1, 1),这时候我才知道是有比例关系的,最大值才是1,也就是说只要除以相应的设备宽和高的大小不就行了?然后就改成
[_outputsetRectOfInterest:CGRectMake(((ScreenWidth-220)/2)/ScreenWidth,(60+64)/ScreenHigh,220/ScreenWidth,220/ScreenHigh)];
按说这样应该就完美了,但是才知道我还是高兴得太早了,一扫描才发现完全不是那么回事,差很多。
于是我就一点一点调,但是最后也没调成功,最后一狠心有设置了一个很确定的值。
[_output setRectOfInterest:CGRectMake(0.5,0.5,0.5, 0.5)];
这次应该很确定是在右下方的四分之一区域吧,嘿嘿。
但是事实又一次打击了我,扫描后发现是左下的四分之一区域,也就是说rectOfInterest的原点是右上角!!!
回头又一想,即使右上角是原点那也应该没有影响啊,但是为什么不行呢,不会是原点的 X 和 Y 互换了吧?算了不管怎么着,试一试吧。
[_outputsetRectOfInterest:CGRectMake((60+64)/ScreenHigh,((ScreenWidth-220)/2)/ScreenWidth,220/ScreenWidth,220/ScreenHigh)];
又扫描了一下发现成功了!果然原点正确了,我只想说TMD!
但是宽和高又怎么对不上了?不会也互换了吧!赶紧试试
[_outputsetRectOfInterest:CGRectMake((124)/ScreenHigh,((ScreenWidth-220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)];
怀着忐忑的心情又试了试,完美扫描!OMG我想死的心都有了。
于是用原生的扫描二维码就完美了!
今天就跟大家分享这一个点,转载请注明出处,谢谢 ― ― LCAndroid 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心。
随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去/p/zxing/和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然没有微信做的那么精致,但是效果还是可以的,所以将自己修改UI的代码和扫描二维码的代码分享给大家,一是自己以后项目遇到同样的功能直接拷贝来用,二是给还没有加入二维码功能的人一个参考,站在巨人的肩膀上,哈哈,我之前也是站在巨人的肩膀上加上此功能,接下来跟着我一步一步来实现此项功能,里面去除了很多不必要的文件
我们先看下项目的结构
如果你项目也想加入此功能,你直接将com.mining.app.zxing.camera,com.mining.app.zxing.decoding,com.mining.app.zxing.view这三个包拷贝到你的项目中,然后引入相对应的资源进去,我也是从我的项目中直接引用过来的,包名都没改呢,当然还需要引用Zxing.jar
com.example.qr_codescan包里面有一个MipcaActivityCapture,也是直接引入我之前项目的代码的,这个Activity主要处理扫描界面的类,比如,扫描成功有声音和振动等等,主要关注里面的handleDecode(Result result, Bitmap barcode)方法,扫描完成之后将扫描到的结果和二维码的bitmap当初参数传递到handleDecode(Result result, Bitmap barcode)里面,我们只需要在里面写出相对应的处理代码即可,其他的地方都不用改得,我这里处理扫描结果和扫描拍的照片
* 处理扫描结果
* @param result
* @param barcode
public void handleDecode(Result result, Bitmap barcode) {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
String resultString = result.getText();
if (resultString.equals(&&)) {
Toast.makeText(MipcaActivityCapture.this, &Scan failed!&, Toast.LENGTH_SHORT).show();
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(&result&, resultString);
bundle.putParcelable(&bitmap&, barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK, resultIntent);
MipcaActivityCapture.this.finish();
我对MipcaActivityCapture界面的布局做了自己的改动,先看下效果图,主要是用到FrameLayout,里面嵌套RelativeLayout,里面的图片也是从微信里面拿出来的,平常我看到需要什么图片就去微信里面找,没有美工的公司的程序员就是苦逼
布局代码如下
&?xml version=&1.0& encoding=&utf-8&?&
&FrameLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent& &
&RelativeLayout
android:layout_width=&fill_parent&
android:layout_height=&fill_parent& &
&SurfaceView
android:id=&@+id/preview_view&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:layout_gravity=&center& /&
&com.mining.app.zxing.view.ViewfinderView
android:id=&@+id/viewfinder_view&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content& /&
android:id=&@+id/include1&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:layout_alignParentTop=&true&
layout=&@layout/activity_title& /&
&/RelativeLayout&
&/FrameLayout&
在里面我将界面上面部分写在另一个布局里面,然后include进来,因为这个activity_title在我项目里面还供其他的Activity使用,我也是直接拷贝出来的
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:background=&@drawable/mmtitle_bg_alpha& &
android:id=&@+id/button_back&
android:layout_width=&75.0dip&
android:text=&返回&
android:background=&@drawable/mm_title_back_btn&
android:textColor=&@android:color/white&
android:layout_height=&wrap_content&
android:layout_centerVertical=&true&
android:layout_marginLeft=&2dip& /&
android:id=&@+id/textview_title&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_alignBaseline=&@+id/button_back&
android:layout_alignBottom=&@+id/button_back&
android:layout_centerHorizontal=&true&
android:gravity=&center_vertical&
android:text=&二维码扫描&
android:textColor=&@android:color/white&
android:textSize=&18sp& /&
&/RelativeLayout&
在我这个demo里面,有一个主界面MainActivity,里面一个Button, 一个ImageView和一个TextView,点击Button进入到二维码扫描界面,当扫描OK的时候,回到主界面,将扫描的结果显示到TextView,将图片显示到ImageView里面,然后你可以不处理图片,我这里随带的加上图片,主界面的布局很简单如下
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:background=&#ffe1e0de& &
android:id=&@+id/button1&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:layout_alignParentTop=&true&
android:text=&扫描二维码& /&
android:id=&@+id/result&
android:layout_width=&fill_parent&
android:layout_height=&wrap_content&
android:layout_below=&@+id/button1&
android:lines=&2&
android:gravity=&center_horizontal&
android:textColor=&@android:color/black&
android:textSize=&16sp& /&
&ImageView
android:id=&@+id/qrcode_bitmap&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:layout_alignParentLeft=&true&
android:layout_below=&@+id/result&/&
&/RelativeLayout&
MainActivity里面的代码如下,里面的功能在上面已经说了
package com.example.qr_
import android.app.A
import android.content.I
import android.graphics.B
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.ImageV
import android.widget.TextV
public class MainActivity extends Activity {
private final static int SCANNIN_GREQUEST_CODE = 1;
* 显示扫描结果
private TextView mTextV
* 显示扫描拍的图片
private ImageView mImageV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.result);
mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);
//点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转
//扫描完了之后调到该界面
Button mButton = (Button) findViewById(R.id.button1);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MipcaActivityCapture.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SCANNIN_GREQUEST_CODE:
if(resultCode == RESULT_OK){
Bundle bundle = data.getExtras();
//显示扫描到的内容
mTextView.setText(bundle.getString(&result&));
mImageView.setImageBitmap((Bitmap) data.getParcelableExtra(&bitmap&));
上面的代码还是比较简单,但是要想做出像那样只的扫描框,紧紧上面的代码是没有那种效果的,我们必须重写com.mining.app.zxing.view包下面的ViewfinderView类,微信里面的都是用的图片,我是自己画出来的,代码注释的比较清楚,大家直接看代码吧,相信你能理解的,如果你要修改扫描框的大小,去CameraManager类里面修改
* Copyright (C) 2008 ZXing authors
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package com.mining.app.zxing.
import java.util.C
import java.util.HashS
import android.content.C
import android.content.res.R
import android.graphics.B
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.R
import android.graphics.T
import android.util.AttributeS
import android.view.V
import com.example.qr_codescan.R;
import com.google.zxing.ResultP
import com.mining.app.zxing.camera.CameraM
* This view is overlaid on top of the camera preview. It adds the viewfinder
* rectangle and partial transparency outside it, as well as the laser scanner
* animation and result points.
public final class ViewfinderView extends View {
private static final String TAG = &log&;
* 刷新界面的时间
private static final long ANIMATION_DELAY = 10L;
private static final int OPAQUE = 0xFF;
* 四个绿色边角对应的长度
private int ScreenR
* 四个绿色边角对应的宽度
private static final int CORNER_WIDTH = 10;
* 扫描框中的中间线的宽度
private static final int MIDDLE_LINE_WIDTH = 6;
* 扫描框中的中间线的与扫描框左右的间隙
private static final int MIDDLE_LINE_PADDING = 5;
* 中间那条线每次刷新移动的距离
private static final int SPEEN_DISTANCE = 5;
* 手机的屏幕密度
* 字体大小
private static final int TEXT_SIZE = 16;
* 字体距离扫描框下面的距离
private static final int TEXT_PADDING_TOP = 30;
* 画笔对象的引用
* 中间滑动线的最顶端位置
private int slideT
* 中间滑动线的最底端位置
private int slideB
private Bitmap resultB
private final int maskC
private final int resultC
private final int resultPointC
private Collection&ResultPoint& possibleResultP
private Collection&ResultPoint& lastPossibleResultP
boolean isF
public ViewfinderView(Context context, AttributeSet attrs) {
super(context, attrs);
density = context.getResources().getDisplayMetrics().
//将像素转换成dp
ScreenRate = (int)(20 * density);
paint = new Paint();
Resources resources = getResources();
maskColor = resources.getColor(R.color.viewfinder_mask);
resultColor = resources.getColor(R.color.result_view);
resultPointColor = resources.getColor(R.color.possible_result_points);
possibleResultPoints = new HashSet&ResultPoint&(5);
public void onDraw(Canvas canvas) {
//中间的扫描框,你要修改扫描框的大小,去CameraManager里面修改
Rect frame = CameraManager.get().getFramingRect();
if (frame == null) {
//初始化中间线滑动的最上边和最下边
if(!isFirst){
slideTop = frame.
slideBottom = frame.
//获取屏幕的宽和高
int width = canvas.getWidth();
int height = canvas.getHeight();
paint.setColor(resultBitmap != null ? resultColor : maskColor);
//画出扫描框外面的阴影部分,共四个部分,扫描框的上面到屏幕上面,扫描框的下面到屏幕下面
//扫描框的左边面到屏幕左边,扫描框的右边到屏幕右边
canvas.drawRect(0, 0, width, frame.top, paint);
canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1,
canvas.drawRect(0, frame.bottom + 1, width, height, paint);
if (resultBitmap != null) {
// Draw the opaque result bitmap over the scanning rectangle
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);
//画扫描框边上的角,总共8个部分
paint.setColor(Color.GREEN);
canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,
frame.top + CORNER_WIDTH, paint);
canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top
+ ScreenRate, paint);
canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,
frame.top + CORNER_WIDTH, paint);
canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top
+ ScreenRate, paint);
canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left
+ ScreenRate, frame.bottom, paint);
canvas.drawRect(frame.left, frame.bottom - ScreenRate,
frame.left + CORNER_WIDTH, frame.bottom, paint);
canvas.drawRect(frame.right - ScreenRate, frame.bottom - CORNER_WIDTH,
frame.right, frame.bottom, paint);
canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - ScreenRate,
frame.right, frame.bottom, paint);
//绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE
slideTop += SPEEN_DISTANCE;
if(slideTop &= frame.bottom){
slideTop = frame.
canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);
//画扫描框下面的字
paint.setColor(Color.WHITE);
paint.setTextSize(TEXT_SIZE * density);
paint.setAlpha(0x40);
paint.setTypeface(Typeface.create(&System&, Typeface.BOLD));
canvas.drawText(getResources().getString(R.string.scan_text), frame.left, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint);
Collection&ResultPoint& currentPossible = possibleResultP
Collection&ResultPoint& currentLast = lastPossibleResultP
if (currentPossible.isEmpty()) {
lastPossibleResultPoints =
possibleResultPoints = new HashSet&ResultPoint&(5);
lastPossibleResultPoints = currentP
paint.setAlpha(OPAQUE);
paint.setColor(resultPointColor);
for (ResultPoint point : currentPossible) {
canvas.drawCircle(frame.left + point.getX(), frame.top
+ point.getY(), 6.0f, paint);
if (currentLast != null) {
paint.setAlpha(OPAQUE / 2);
paint.setColor(resultPointColor);
for (ResultPoint point : currentLast) {
canvas.drawCircle(frame.left + point.getX(), frame.top
+ point.getY(), 3.0f, paint);
//只刷新扫描框的内容,其他地方不刷新
postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top,
frame.right, frame.bottom);
public void drawViewfinder() {
resultBitmap =
invalidate();
* Draw a bitmap with the result points highlighted instead of the live
* scanning display.
* @param barcode
An image of the decoded barcode.
public void drawResultBitmap(Bitmap barcode) {
resultBitmap =
invalidate();
public void addPossibleResultPoint(ResultPoint point) {
possibleResultPoints.add(point);
上面的代码中,中间那根线微信是用的图片,我这里是画的,如果你想更加仿真点就将下面的代码
canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH/2, frame.right - MIDDLE_LINE_PADDING,slideTop + MIDDLE_LINE_WIDTH/2, paint);
Rect lineRect = new Rect();
lineRect.left = frame.
lineRect.right = frame.
lineRect.top = slideT
lineRect.bottom = slideTop + 18;
canvas.drawBitmap(((BitmapDrawable)(getResources().getDrawable(R.drawable.qrcode_scan_line))).getBitmap(), null, lineRect, paint);
那条扫描线自己去微信里面找一下,我贴出来的失真了,下载微信apk,将后缀名改成zip,然后解压就行了
画扫描框下面字体的代码需要修改下,这样子能根据字体自动排列在中间,如果字太长我没有处理,那个要自动换行,你可以自行处理
paint.setColor(Color.WHITE);
paint.setTextSize(TEXT_SIZE * density);
paint.setAlpha(0x40);
paint.setTypeface(Typeface.DEFAULT_BOLD);
String text = getResources().getString(R.string.R.string.scan_text);
float textWidth = paint.measureText(text);
canvas.drawText(text, (width - textWidth)/2, (float) (frame.bottom + (float)TEXT_PADDING_TOP *density), paint)
运行界面截图,其中中间的那根绿色的线会上下移动,跟微信的效果差不多,当然运行你还需要相对应的权限问题,有兴趣的朋友可以去下载demo疯狂联盟礼包怎么领 关注微信领取白银礼包_百度知道
疯狂联盟礼包怎么领 关注微信领取白银礼包
提问者采纳
  点开游戏内公测宣传片,进入网址左下角  登陆微信,点开右上角扫一扫,扫描二维码,关注疯狂联盟公众帐号,然后会有消息通知或直接点开通讯录里面的公众账号,找到疯狂联盟,点右下角的公测礼包,就可以兑换了,您可以手机直接登陆该网址兑换  白银礼包福利:钱袋子1万*3,米袋子1万*3,小喇叭缉唬光舅叱矫癸蝎含莽*5,体力药5*5
电子产品技术支持
其他类似问题
为您推荐:
白银的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁最新最全LOL视频尽在 【德玛西亚】
& 英雄联盟LOL二维码登录功能开启
英雄联盟LOL二维码登录功能开启
&  英雄联盟的各位召唤师,我们将于日陆续开启各游戏大区的二维码登录功能,您将可以通过手机扫描二维码方式登录英雄联盟。
  具体操作如下,点击登录框左下角的&二维码安全登录&图标:
  弹出二维码如下图:
  安装&腾讯手机管家&,打开并点击&QQ安全登录&,扫描游戏客户端的二维码,在手机端&确认登录&,即可立即登录游戏。
  使用手机二维码全登录,远离盗号风险,希望能提升您的游戏体验。
  如何下载和如何使用&腾讯手机管家&。您可以参照:
说明进行登录。
更新 2-7时长 00:16
更新 2-7时长 16:07
更新 2-7时长 21:30
更新 2-7时长 09:31
更新 2-7时长 45:58
更新 2-7时长 47:25
更新 2-7时长 37:17
更新 2-7时长 39:03
更新 2-7时长 24:12
更新 2-7时长 10:08
更新 2-7时长 25:32
更新 2-7时长 30:13
更新 2-7时长 16:07
更新 2-7时长 33:17
更新 2-7时长 30:16
更新 2-7时长 37:17
更新 2-7时长 31:26
更新 2-7时长 15:00
更新 2-6时长 11:00
更新 2-6时长 03:11
更新 2-6时长 29:57
更新 2-6时长 54:11
更新 2-6时长 21:21
更新 2-6时长 39:36
新闻攻略 TOP10

我要回帖

更多关于 疯狂创意二维码软件 的文章

 

随机推荐