介紹
二維碼作為資訊的載體,廣泛應用於我們生活的方方面面,例如:使用支付寶支付,二維碼加好友,二維碼推廣等等,能舉例的例子多不勝數,而如果你的應用支援二維碼的掃描,使用者和體驗將會翻倍的增長,如果你是應用的開發者,歡迎來使用此二維碼掃描外掛!並希望能給予專案一個star,謝謝!專案地址:github.com/rhymelph/r_…
使用
你可以在pub.dev網站上面搜尋r_scan
即可找到該外掛,新增下面程式碼到pubspec.yaml
檔案
dependencies:
r_scan: last version
複製程式碼
- last version 可以在pub.dev網站搜尋
r_scan
得到
各裝置註意事項
- Android平臺下
android6.0系統以上請動態授權,可以結合permission_handler
外掛使用,程式碼如下:
import 'package:permission_handler/permission_handler.dart';
Future<bool> canReadStorage() async {
if(Platform.isIOS) return true;
var status = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (status != PermissionStatus.granted) {
var future = await PermissionHandler()
.requestPermissions([PermissionGroup.storage]);
for (final item in future.entries) {
if (item.value != PermissionStatus.granted) {
return false;
}
}
} else {
return true;
}
return true;
}
Future<bool> canOpenCamera() async {
var status =
await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
if (status != PermissionStatus.granted) {
var future = await PermissionHandler()
.requestPermissions([PermissionGroup.camera]);
for (final item in future.entries) {
if (item.value != PermissionStatus.granted) {
return false;
}
}
} else {
return true;
}
return true;
}
複製程式碼
- IOS平臺下
需要在info.plist
檔案下新增如下程式碼:
<key>NSCameraUsageDescription</key>
<string>掃描二維碼時需要使用您的相機</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>掃描二維碼時需要訪問您的相簿</string>
<key>io.flutter.embedded_views_preview</key>
<true/>
複製程式碼
導包
import 'package:r_scan/r_scan.dart';
複製程式碼
1.掃描檔案圖片二維碼
final result=await RScan.scanImagePath('你的檔案路徑');
if(result.isNotEmpty){
//result 為二維碼內容
}
複製程式碼
2.掃描圖片連結二維碼
final result=await RScan.scanImagePath('你的圖片連結');
if(result.isNotEmpty){
//result 為二維碼內容
}
複製程式碼
3.掃描記憶體圖片二維碼
ByteData data=await rootBundle.load('images/qrCode.png');
final result=await RScan.scanImageMemory(data.buffer.asUint8List());
if(result.isNotEmpty){
//result 為二維碼內容
}
複製程式碼
4.使用相機掃描二維碼
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:r_scan/r_scan.dart';
class RScanDialog extends StatefulWidget {
@override
_RScanDialogState createState() => _RScanDialogState();
}
class _RScanDialogState extends State<RScanDialog> {
RScanController _controller;
@override
void initState() {
super.initState();
initController();
}
bool isFirst=true;
Future<void> initController() async {
_controller = RScanController();
_controller.addListener(() {//監聽掃描到的二維碼
final result = _controller.result;
if (result != null) {
if(isFirst){
Navigator.of(context).pop(result);
isFirst=false;
}
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.black,
body: FutureBuilder<bool>(
future: canOpenCameraView(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.hasData && snapshot.data == true) {
return ScanImageView(//這個為自己寫的前景
child: RScanView(
controller: _controller,
),
);
} else {
return Container();
}
},
),
),
);
}
Future<bool> canOpenCameraView() async {
var status =
await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
if (status != PermissionStatus.granted) {
var future = await PermissionHandler()
.requestPermissions([PermissionGroup.camera]);
for (final item in future.entries) {
if (item.value != PermissionStatus.granted) {
return false;
}
}
} else {
return true;
}
return true;
}
}
複製程式碼
後續開發
- 支援手電筒
- 支援自定義區域觸發掃描
- 還有更多...