2018-01-16 11:33:42 songwenhui100 阅读数 2961
  • 微信公众号开发8-营销开发-微信开发php

    微信公众平台开发之营销开发是子恒老师《微信公众平台开发》视频教程的第8部。详细讲解了用php开发微信,对微信公众平台中的营销功能开发。内容包含获取微信短网址,生成推广二维码,生成推广海报等等。欢迎反馈,微信/QQ:68183131

    11381 人正在学习 去看看 秦子恒

今天介绍一下,实现二维码扫描的webView

可以实现二维码扫描的在度娘上有很多,今天这个呢其实和网上的差不多,只是我们的webView是一直在使用的,如果用网上的话,会改动很大,影响很多代码,所以我就在网上的基础上了做了一下修改,可以实现很轻松的使用。下面是自定义的webView

/**
* Created by swh123118 on 2017/12/20.
* 带长按扫描二维码功能的webview
*/

public class CustomWebView extends WebView implements OnLongClickListener{
    private LongClickCallBack mCallBack;
    public CustomWebView(Context context) {
            super(context);
            initListener();
    }
    public CustomWebView(Context context, AttributeSet attrs){
        super(context,attrs,0);
        initListener();
    }

    public CustomWebView(Context context, AttributeSet attrs,int defStyle){
        super(context,attrs,defStyle);
        initListener();
    }
    // 实现长按点击事件
    private void initListener() {
        setOnLongClickListener(this);
    }

    @Override
    public boolean onLongClick(View v) {
        // 长按事件监听(注意:需要实现LongClickCallBack接口并传入对象)
        final HitTestResult htr = getHitTestResult();//获取所点击的内容
        if (htr.getType() == WebView.HitTestResult.IMAGE_TYPE) {//判断被点击的类型为图片
            mCallBack.onLongClickCallBack(htr.getExtra());
        }
        return false;
    }
    /**
     * 长按事件回调接口,传递图片地址
     * @author swh123118
     */
    public interface LongClickCallBack{
        /**用于传递图片地址*/
        void onLongClickCallBack(String imgUrl);
    }
    /**
     * 设置长按事件回调接口
     * @author swh123118
     */
    public void setLongClickCallBackListener(LongClickCallBack callBack){
        this.mCallBack = callBack;
    }
}

使用 :和普通的自定义View差不多,可以在布局中使用,也可以在代码中直接添加,

接着来说一下具体使用吧,我这边扫描使用的是zxing

1 添加依赖:

dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.google.zxing:core:3.2.0'
}

2 添加权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

3 布局引入

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.xxxx.view.CustomWebView
        android:id="@+id/custom_webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.xxxx.view.CustomWebView>

</LinearLayout>

4 获取点击的image并下载到本地

public Bitmap getBitmap(String sUrl){
    try {
        URL url = new URL(sUrl);
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            InputStream inputStream = conn.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            saveMyBitmap(bitmap,"code");//先把bitmap生成jpg图片
            return bitmap;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

5 检查url并返回结果

public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
    Hashtable<DecodeHintType, String> hints =new    Hashtable<DecodeHintType,String>();
    hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
    RGBLuminanceSource source =new RGBLuminanceSource(bitmap);
    BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));  
    QRCodeReader reader2= new QRCodeReader();
    Result result = null;
    try {
        try {
            result = reader2.decode(bitmap1,hints);
        } catch (ChecksumException e) {
            e.printStackTrace();
        } catch (FormatException e) {
            e.printStackTrace();
        }

    } catch (NotFoundException e) {
            e.printStackTrace();
    } 
    return result;
}

6 根据结果判断是否显示扫描二维码

private Handler handler = new Handler(){
    public void handleMessage(Message msg) {
        if (msg.what == 0){
            if (isQR){
                adapter.add("识别图中二维码");
            }
            adapter.notifyDataSetChanged();
        }
    };
};

下面来看一下主要代码

public class ScanCodeActivity extends Activity{
    private CustomWebView mCustomWebView;
    private CustomDialog mCustomDialog;
    private ArrayAdapter<String> adapter;
    private boolean isQR;//判断是否为二维码
    private Result result;//二维码解析结果
    private File file;

    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            if (msg.what == 0){
                if (isQR){
                    adapter.add("识别图中二维码");
                }
                adapter.notifyDataSetChanged();
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_code);
        initWebView();
    }

    private void initWebView() { 
        mCustomWebView = (CustomWebView) findViewById(R.id.custom_webview);
        mCustomWebView.loadUrl("https://mp.weixin.qq.com/s/DyfRn3Ox2cuFZX4etF2LSQ");//加载页面
        mCustomWebView.setFocusable(true);
        mCustomWebView.setFocusableInTouchMode(true);

        WebSettings mSettings = mCustomWebView.getSettings();
        mSettings.setJavaScriptEnabled(true);//开启javascript
        mSettings.setDomStorageEnabled(true);//开启DOM
        mSettings.setDefaultTextEncodingName("utf-8");//设置字符编码
        //设置web页面
        mSettings.setAllowFileAccess(true);//设置支持文件流
        mSettings.setSupportZoom(true);// 支持缩放
        mSettings.setBuiltInZoomControls(true);// 支持缩放
        mSettings.setUseWideViewPort(true);// 调整到适合webview大小
        mSettings.setLoadWithOverviewMode(true);// 调整到适合webview大小
        mSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);// 屏幕自适应网页,如果没有这个,在低分辨率的手机上显示可能会异常
        mSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
        //提高网页加载速度,暂时阻塞图片加载,然后网页加载好了,在进行加载图片
        mSettings.setBlockNetworkImage(true);
        mSettings.setAppCacheEnabled(true);//开启缓存机制
        //实现监听回调
        mCustomWebView.setLongClickCallBackListener(new MyonLongClickCallBack());
        mCustomWebView.setWebViewClient(new MyWebViewClient());
}

    //这里可以不加,直接在原有基础上实现方法onScaleChanged即可
    private class MyWebViewClient extends WebViewClient {
        /**
         * 加载过程中 拦截加载的地址url
         * @param view
         * @param url  被拦截的url
         * @return
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }
        /**
         * 页面加载过程中,加载资源回调的方法
         * @param view
         * @param url
         */
        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
        }
        /**
         * 页面加载完成回调的方法
         * @param view
         * @param url
         */
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            // 关闭图片加载阻塞
            view.getSettings().setBlockNetworkImage(false);
        }
        /**
         * 页面开始加载调用的方法
         * @param view
         * @param url
         * @param favicon
         */
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }
        @Override
        public void onReceivedError(WebView view, int errorCode,                            String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
        @Override
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            super.onScaleChanged(view, oldScale, newScale);
            view.requestFocus();
            view.requestFocusFromTouch();
        }
    }

    private class MyonLongClickCallBack implements CustomWebView.LongClickCallBack{
        @Override
        public void onLongClickCallBack(final String imgUrl) {
            // 获取到图片地址后做相应的处理
            new Thread(){
                public void run() {
                    decodeImage(imgUrl);
                    handler.sendEmptyMessage(0);
                };
            }.start();
            showDialog();
        }
    }

    /**
     * 判断是否为二维码
     * @param
     * @return
     */
    private boolean decodeImage(String sUrl){
        result = DecodeImage.handleQRCodeFormBitmap(getBitmap(sUrl));
        if(result == null){
            isQR = false;
        }else {
            isQR = true;
        }
        return isQR;
    }

    /**
     * 根据地址获取网络图片
     * @param sUrl 图片地址
     * @return
     * @throws IOException
     */
    public Bitmap getBitmap(String sUrl){
        try {
            URL url = new URL(sUrl);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            if(conn.getResponseCode() == 200){
                InputStream inputStream = conn.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                saveMyBitmap(bitmap,"code");//先把bitmap生成jpg图片
                return bitmap;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 显示Dialog
     * @param
     */
    private void  showDialog() {

        adapter = new ArrayAdapter<String>(this,R.layout.item_dialog);
        adapter.add("发送给朋友");
        adapter.add("保存到手机");
        adapter.add("收藏");

        mCustomDialog = new CustomDialog(this, R.layout.custom_dialog) {

            @Override
            public void initViews() {
                // 初始CustomDialog化控件
                ListView mListView = (ListView) findViewById(R.id.lv_dialog);
                mListView.setAdapter(adapter);
                mListView.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        // 点击事件
                        switch (position) {
                            case 0:
                                sendToFriends();
                                Toast.makeText(ScanCodeActivity.this, "已发送给朋友", Toast.LENGTH_LONG).show();
                                closeDialog();
                                break;
                            case 1:
                                saveImageToGallery(ScanCodeActivity.this);
                                Toast.makeText(ScanCodeActivity.this, "已保存到手机", Toast.LENGTH_LONG).show();
                                closeDialog();
                                break;
                            case 2:
                                Toast.makeText(ScanCodeActivity.this, "已收藏", Toast.LENGTH_LONG).show();
                                closeDialog();
                                break;
                            case 3:
                                goIntent();
                                Toast.makeText(ScanCodeActivity.this, "二维码识别结果: " + result.toString(), Toast.LENGTH_LONG).show();
                                closeDialog();
                                break;
                        }

                    }
                });
            }
        };
        mCustomDialog.show();
    }

    /**
     * 发送给好友
     */
    private void sendToFriends() {
        Intent intent=new Intent(Intent.ACTION_SEND);
        Uri imageUri=  Uri.parse(file.getAbsolutePath());
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, imageUri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(Intent.createChooser(intent, getTitle()));
    }

    /**
     * bitmap 保存为jpg 图片
     * @param mBitmap 图片源
     * @param bitName  图片名
     */
    public void saveMyBitmap(Bitmap mBitmap,String bitName)  {
        file= new File( Environment.getExternalStorageDirectory()+"/"+bitName + ".jpg");
        FileOutputStream fOut = null;
        try {
            fOut = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
        try {
            fOut.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 先保存到本地再广播到图库
     * */
    public  void saveImageToGallery(Context context) {

        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), "code", null);
            // 最后通知图库更新
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file)));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 实现url的条状
     * 也可以直接在本页面打开
     * mCustomWebView.loadUrl(result.toString());//加载页面
     * */
    public void goIntent(){
        Uri uri = Uri.parse(result.toString());
        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
        startActivity(intent);
    }
}

以上就是实现全部内容,欢迎大家知错

2017-10-27 15:01:01 wozaixiaoximen 阅读数 8765
  • 微信公众号开发8-营销开发-微信开发php

    微信公众平台开发之营销开发是子恒老师《微信公众平台开发》视频教程的第8部。详细讲解了用php开发微信,对微信公众平台中的营销功能开发。内容包含获取微信短网址,生成推广二维码,生成推广海报等等。欢迎反馈,微信/QQ:68183131

    11381 人正在学习 去看看 秦子恒

微信客户端发现用户长按<img>时,会截屏并启动二维码识别,二维码识别的不是<img>而是截屏。这样做的好处是不用下载图片,坏处是识别的图片更复杂了。

猜测:(Android)过程估计是,在WebView里注入JS给第三方页面中的所有图片绑定事件,长按触发JS回调,在回调中调用Java函数,这个Java函数做的工作大概是截屏、识别(在WebView里Java与JS互调就忽略了╮(╯_╰)╭毕竟我不会)

这里写图片描述

然后,就和页面无关了

2017-11-01 21:15:00 weixin_34268610 阅读数 36
  • 微信公众号开发8-营销开发-微信开发php

    微信公众平台开发之营销开发是子恒老师《微信公众平台开发》视频教程的第8部。详细讲解了用php开发微信,对微信公众平台中的营销功能开发。内容包含获取微信短网址,生成推广二维码,生成推广海报等等。欢迎反馈,微信/QQ:68183131

    11381 人正在学习 去看看 秦子恒

这篇文章是上一篇文章的延伸与总结,做的一个微信游戏宣传页上要调用长按识别二维码的功能,做的过程中遇到了两个坑,后来在组里分享会上分享了入坑经历,然后再度发现一个坑。本文就是在分享会上发言总结而成。

坑一:iOS 版微信长按识别二维码无法正常识别的bug

(8.21 更新:最新版6.2.4 已经修复该bug)

以下实测在iOS 版(iPhone)微信6.2.2 中有此bug,安卓版微信暂时没有发现有此bug。建议看下面的内容前先看这篇文章

“众所周知”,在一些使用在微信内置浏览器的页面上要调用其长按识别二维码的功能,需要将二维码图片单独切出,img 标签形式展现。长按识别二维码 的原理Jeff 不甚了解,但却发现其有一个实际可识别区域上移的bug:对于二维码区域,实际可识别区域是整体上移64px,64px 的偏移量与二维码大小本身无关

下面是一个重现bug 的Demo 页面,请用iPhone 版微信扫描:

红色的色块区域是我单独为了定位区域而写的,不是在二维码本身(具体可以查看上面Demo 的源代码),用手指长按你可以看到实际可识别二维码区域为红色部分:即整体可识别区域上移了64px,而往下拉看到不同大小的二维码你会发现这个64px 的偏移量与二维码本身大小无关。友情提示:你可以用小拇指在边界区域长按以确认。

为什么是神秘的64px 偏移量?答案是:64px 正好是微信内置浏览器标题栏+系统标题栏的高度。可以猜测的是,微信客户端在识别二维码的时候忽略了微信标题栏+系统状态栏的高度。

后来进一步排查的时候,发现二维码大到一定程度就没有“识别上移”的诡异现象了,大概是二维码大小在400px 以上的时候就没有(当然,这个是在iPad 版微信上测出来的),具体可以查看下面这个Demo 页面

人在微信实习,所以后面经过与微信 iOS 开发人员的反馈沟通,确定是微信的 bug,也的确是这个64px 的问题;据他们的说法目前已经修复,但能否在下一个版本中加入么,就不得而知了。

解决方案的话有两个:

1)通过img增加padding 增大可接触面积;这个需要微调。

2)为二维码图片本身增加透明底部背景,这也是我们团队采用的方案。类似下图的样子,前端上用户是看不到的;但有个缺点就是如果用户保存二维码后则不是那么好看。

坑二:两(多)张两张二维码无法在同一屏幕视窗中共存

小标题说的“同一屏幕视窗”是指微信内置浏览器中在当前的手机屏幕上显示的可见范围,我们发现,当同一同一屏幕视窗中存在两个或以上的二维码的时候,微信客户端就会识别错误,无论你按哪个二维码长按识别,识别出来都是同一个目标。这个问题在iOS 版(iPhone)微信2.2及安卓版上均有之。

下面是一个演示Demo 页面,请用目标手机(iPhone 或安卓机上)微信扫描访问,然后长按识别二维码:

该页面一共有六个二维码,两两分组为三组,每组的二维码的信息分别是指向qq.com、baidu.com 的url。为了保证每次只有一组二维码在当前屏幕可视范围,页面特意将每组二维码距离拉得很大。每次请保持只有一组二维码在你当前屏幕范围内,然后请依次长按识别二维码。你会发现无论无论你按哪个二维码长按识别,识别出来都是同一个目标。

然后再尝试最后一组二维码,尝试通过滚动页面使得某个二维码不在你的屏幕可见范围,再执行长按识别二维码。

通过上面的Demo 页面,其实我们可以猜测微信中长按识别二维码的运行原理,就是你长按的时候相当于将当前手机屏幕截屏,识别截屏后的图片,这样一张图片有两个二维码图的时候当然只会识别出一个。顺着这个思路也可以解释上述坑一,因为截屏的图片当然包括了系统状态栏那部分,也就不难理解为什么会有“识别上移”的诡异现象了。

解决方案的话就是不要将两个二维码共存在同一个页面中。

坑三:多次执行长按二维码的功能会导致内存泄露,手机会变卡

这个是组里的同事在分享会那天做演示的时候发现出来的,多次执行长按二维码的功能会导致手机(iPhone)变卡。之前我做测试的时候也发现,多次测试后居然右键都识别出来是二维码图片(即没有出现“识别二维码”的按钮)。





End




来源:

http://devework.com/weixin-qrcode-bug2.html?replytocom=2633#









   本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1694886,如需转载请自行联系原作者







2017-05-18 10:33:52 qq_35434831 阅读数 4125
  • 微信公众号开发8-营销开发-微信开发php

    微信公众平台开发之营销开发是子恒老师《微信公众平台开发》视频教程的第8部。详细讲解了用php开发微信,对微信公众平台中的营销功能开发。内容包含获取微信短网址,生成推广二维码,生成推广海报等等。欢迎反馈,微信/QQ:68183131

    11381 人正在学习 去看看 秦子恒
新手学习二维码相关开发,翻阅了许多博客及文档,看到好的就进行模仿编写,终有小成,不负众望。下面对自己写的Demo进行分享。
主要实现:zxing二维码生成扫描,识别二维码图片,长按识别二维码;
优点: 调用方便简洁,操作简单,UI嘛,自己感觉very beautiful!
之前参考的一则博客许多代码就是用他的:感觉不错:http://blog.csdn.net/aaawqqq/article/details/24880209

这里就直接讲怎么使用了:首先先看看包 有改变的不多,大多都是原生的class,camera、decoding原生的不需要了解太多。


BarCodeTestActivity 是测试的入口界面

如何使用:

package com.ericssonlabs;

import com.zxing.activity.CaptureActivity;
import com.zxing.picture.PictureLongListener;
import com.zxing.encoding.CreateQRBitmp;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class BarCodeTestActivity extends Activity {

    private TextView resultTextView;
    private EditText qrStrEditText;
    private ImageView qrImgImageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);
        qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);
        qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);

        Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);
        scanBarCodeButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //打开扫描界面扫描条形码或二维码
                Intent openCameraIntent = new Intent(BarCodeTestActivity.this, CaptureActivity.class);
                startActivityForResult(openCameraIntent, 0);
            }
        });

        qrImgImageView.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                // 长按识别二维码
                OnLongClickReaderImage();
                return true;
            }
        });


        Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);
        generateQRCodeButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                String contentString = qrStrEditText.getText().toString();
                if (!contentString.equals("")) {
                    /***方法 :可自行设置大小的二维码***/
                   /*
                    // 这里添加一张图片(R.drawable.ic_launcher)生成bitmap
                    Bitmap portrait = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                    //portrait 放在二维码中间,当这个对象为空时,只有二维码图片,最后两个是二维码大小和中间图片大小
                    Bitmap qrCodeBitmap = CreateQRBitmp.createQRCodeBitmap(contentString, portrait,350,50);
                    */
                    //这里是生成二维码图片的bitmap对象
                    Bitmap portrait = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                    //两个方法,一个不传大小,使用默认
                    Bitmap qrCodeBitmap = CreateQRBitmp.createQRCodeBitmap(contentString, portrait);
                    qrImgImageView.setImageBitmap(qrCodeBitmap);
                } else {
                    //提示文本不能是空的
                    Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();
                }


            }
        });
    }

    private void OnLongClickReaderImage() {
        //获取当前屏幕的大小
        int width = getWindow().getDecorView().getRootView().getWidth();
        int height = getWindow().getDecorView().getRootView().getHeight();
        //找到当前页面的根布局
        View view = getWindow().getDecorView().getRootView();
       //将view传给PictureLongListener解析,获取图片中的数据
        String data = PictureLongListener.getQrViewPictureContent(width, height, view);
        if (data != null) {
            //显示数据
            resultTextView.setText(data + "");
        } else {
            Toast.makeText(BarCodeTestActivity.this, "无法识别", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) {
            resultTextView.setText(data.getStringExtra("result"));
        }
    }
}
XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_scan_barcode"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="打开摄像机扫描" />
    
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_marginTop="10dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        
        <TextView 
       	android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:textSize="18sp"
        android:text="二维码解析结果:" />
        
        <TextView 
        android:id="@+id/tv_scan_result"
       	android:layout_width="fill_parent"
       	android:textSize="18sp"
       	android:textColor="@android:color/black"
        android:layout_height="wrap_content" />
    </LinearLayout>
    
    <EditText 
        android:id="@+id/et_qr_string"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:textColor="@color/contents_text"
        android:hint="输入要生成的二维码"/>
    
    <Button
        android:id="@+id/btn_add_qrcode"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="点击生成二维码" />
    
    <ImageView 
        android:id="@+id/iv_qr_image"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:scaleType="fitXY"
        android:layout_marginTop="10dp"
        android:layout_gravity="center"/>

</LinearLayout>

效果呢:

主界面扫描界面

                                                                                   


不说了,新手,不会,真的写不下去了,还望见谅!项目工程下载
http://download.csdn.net/detail/qq_35434831/9845393里面有详细注释与使用方法。

2019-03-29 16:33:54 wuyte87 阅读数 74
  • 微信公众号开发8-营销开发-微信开发php

    微信公众平台开发之营销开发是子恒老师《微信公众平台开发》视频教程的第8部。详细讲解了用php开发微信,对微信公众平台中的营销功能开发。内容包含获取微信短网址,生成推广二维码,生成推广海报等等。欢迎反馈,微信/QQ:68183131

    11381 人正在学习 去看看 秦子恒

很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可。下面给大家介绍这个功能

 

em2up4mw.png

功能目的

生成微信跳转链接,实现微信内置浏览器跳转外部浏览器打开网页。

功能效果

对网页所属的PHP代码进行相关处理,加入跳转接口即可实现。

功能实现后, 苹果用户即可在微信内直接下载app也可以跳转浏览器下载,安卓用户则自动打开手机浏览器下载app, 如果不含下载文件,则直接从微信内跳转到外部浏览器访问指定页面。下面是含app下载文件的实现效果:

1、苹果跳转浏览器效果

2、App Store应用实现效果

3、企业版app实现效果

4、安卓用户则自动打开手机默认浏览器访问指定h5页面或者下载app。

用以上方式就可以实现用户在微信内打开分享链接直接跳转到外部浏览器打开了。

如此一来我们就解决了网页分享链接被微信拦截而无法打开的问题了,那么接下来就可以在微信内大量的分享链接或二维码来进行宣传引流。不仅提高了用户体验,也能够极大地提高自己的APP在微信中的推广转化率,充分利用微信的用户群体来达到我们的期望!

微信域名防封,微信域名防封系统是如何实现的

微信公众号点击菜单直接打开手机浏览器的实现方式

没有更多推荐了,返回首页