android智能终端SDK

移动支付产品接入文档


Android快速实现一维二维码扫描

<p>&amp; <strong>付费方案</strong>:网上开源方案适用于解码速度要求不高、扫码使用频率不大的项目,对于一些高频率扫码,或扫码速度要求高的项目,我们研发了高速解码引擎,可以软件集成或扫码枪模式集成,扫码效果见视频:<a href="https://v.qq.com/x/page/b3005jt1vjd.html">https://v.qq.com/x/page/b3005jt1vjd.html</a></p> <p>Android中二维码扫描的最常用库是zxing和zbar,zxing项目地址为https://github.com/zxing/zxing 目前还有多个人在维护。zbar主要用C来写的,对速度有要求的可使用zbar,但目前没有在维护 项目地址:<a href="https://github.com/ZBar/ZBar">https://github.com/ZBar/ZBar</a></p> <p>Zxing</p> <p>github上Zxing项目代码很多,但其实用到的只有一部分,这里分享一下集成过程,比较实用。</p> <p>效果图: <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9ac6cb976.png" alt="" /> <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9ad373d05.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=84fdea6367f1eddcbe2aef575aa96922&amp;amp;file=file.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=765e37da9a699f84d36f47eb0844e17d&amp;amp;file=file.png" alt="" /> 1.引入jar包 <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9ae2b0cd2.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d8acfad43310c0313f8bc687b8c5fe54&amp;amp;file=file.png" alt="" /></p> <p>2.copy Zxing包到项目 <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9ae86fef0.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1054d2920e6fec73d07853a2b6f0ae06&amp;amp;file=file.png" alt="" /> 这里包名不一样肯定会报错,我们暂时不管,先把资源文件copy过来,后面来做处理。</p> <p>3.导入相关资源文件 copy res底下的相关资源文件,如下: drawable、drawable-hdpi和layout <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9af74d8e0.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=eacb441569345bfa3857b1d4b2ba73e9&amp;amp;file=file.png" alt="" /></p> <pre><code>raw文件和values文件</code></pre> <p><img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9b1104fec.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=9732a4d538695c8ad9c491ea96606493&amp;amp;file=file.png" alt="" /></p> <pre><code> 注:values中相关资源不要直接替换,否则会覆盖之前的,需要打开文件将内容加到自己项目对应文件中。 </code></pre> <p>4.AndroidManifest.xml加入相关权限和扫描的Activity</p> <pre><code class="language-java">&amp;lt;uses-permission android:name=&amp;quot;android.permission.CAMERA&amp;quot; /&amp;amp; &amp;lt;uses-permission android:name=&amp;quot;android.permission.INTERNET&amp;quot; /&amp;amp; &amp;lt;uses-permission android:name=&amp;quot;android.permission.VIBRATE&amp;quot; /&amp;amp; &amp;lt;uses-permission android:name=&amp;quot;android.permission.FLASHLIGHT&amp;quot; /&amp;amp;</code></pre> <pre><code class="language-java">&amp;lt;activity android:name=&amp;quot;.zxing.android.CaptureActivity&amp;quot; android:screenOrientation=&amp;quot;portrait&amp;quot; android:theme=&amp;quot;@android:style/Theme.NoTitleBar&amp;quot; /&amp;amp;</code></pre> <p>5.Clean Projects,修改报错的类</p> <p>报错无非就是包名不对,修改为自己包名即可 <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9b49b81bd.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ddd1d3da151a8569d7e59f7153231670&amp;amp;file=file.png" alt="" /></p> <p>6.capture.xml的ViewfinderView改成自己包名下的 <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9b4f49771.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=eededff225da3099fccc7032c7978ea4&amp;amp;file=file.png" alt="" /></p> <p>7.调起扫描界面 获取扫描结果</p> <p>在需要打开扫描界面的地方直接跳转到CaptureActivity就OK(使用startActivityForResult)</p> <pre><code class="language-java">/** * 跳转到扫码界面扫码 */ private void goScan(){ Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, REQUEST_CODE_SCAN); }</code></pre> <p>在onActivityResult的回调中即可获取扫描内容</p> <pre><code class="language-java">@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 扫描二维码/条码回传 if (requestCode == REQUEST_CODE_SCAN &amp;amp;amp;&amp;amp;amp; resultCode == RESULT_OK) { if (data != null) { //返回的文本内容 String content = data.getStringExtra(DECODED_CONTENT_KEY); //返回的BitMap图像 Bitmap bitmap = data.getParcelableExtra(DECODED_BITMAP_KEY); } } }</code></pre> <p>动态权限申请 由于扫描需要调用相机,打开摄像头属于敏感权限,所以需要进行权限的动态申请,如下</p> <pre><code class="language-java">//动态权限申请 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1); } else { //扫码 goScan(); }</code></pre> <pre><code class="language-java">@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length &amp;amp; 0 &amp;amp;amp;&amp;amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) { //扫码 goScan(); } else { Toast.makeText(this, &amp;quot;你拒绝了权限申请,无法打开相机扫码哟!&amp;quot;, Toast.LENGTH_SHORT).show(); } break; default: } }</code></pre> <pre><code>上面的代码就是动态申请权限的流程,首先判断用户是不是已经给我们权限授权了,使用ContextCompat.checkSelfPermission()方法,第一个参数是Context,第二个参数是具体的权限名称,如果等于PackageManager.PERMISSION_GRANTED表明已授权,不等于就是没有授权。 如果已授权就直接做后面的操作,如果没有授权,需要调用ActivityCompat.requestPermissions()方法申请授权,第一个参数是当前Activity实例,第二个参数是权限数组,第三个是请求码。 用户的选择将会回调到onRequestPermissionsResult()方法中,授权结果封装在grantResults参数中,如果grantResults长度大于0且grantResults[0]等于PackageManager.PERMISSION_GRANTED,也就是上面权限数组中加入的第一个打开摄像头的权限被授权,则可跳转至扫描界面扫码,否则提示用户未打开权限无法使用。</code></pre> <p>效果 打开个6.0以上模拟器试试 <img src="http://doc.szzkc.com/Public/Uploads/2019-05-05/5cce9b8fb042c.png" alt="" /> <img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3747848aac844ffaa9e7bf80712b9cf5&amp;amp;file=file.png" alt="" /> 点击按钮将弹出权限申请,用户授权后方可进行二维码扫描。</p>

页面列表

ITEM_HTML