* @deprecated * BarCodeScanner has been deprecated and will be removed in a future SDK version. Use `expo-camera` instead. * See [How to migrate from `expo-barcode-scanner` to `expo-camera`](https://expo.fyi/barcode-scanner-to-expo-camera) * for more details. */
时间: 2025-08-18 13:21:59 浏览: 3
<think>我们正在讨论的是使用 expo-camera 替代已弃用的 BarCodeScanner 进行二维码扫描。根据引用[3],我们知道Expo原本的BarCodeScanner组件已经被弃用,现在推荐使用expo-camera中的Camera组件,它内置了条码扫描功能。
步骤:
1. 安装expo-camera
2. 请求相机权限
3. 使用Camera组件,并设置onBarCodeScanned事件处理函数
4. 处理扫描到的数据
注意:expo-camera是Expo SDK的一部分,因此只能在Expo项目中使用(包括托管工作流和裸工作流)。
下面是一个具体的代码示例:</think>### 在 React Native 中使用 expo-camera 实现二维码扫描
Expo 官方已弃用 `BarCodeScanner` 组件,推荐使用 `expo-camera` 中的 `<Camera>` 组件实现二维码扫描功能[^3]。以下是完整实现方案:
#### 1. **安装依赖**
```bash
expo install expo-camera
expo install expo-barcode-scanner # 条码扫描功能
```
#### 2. **完整组件实现**
```javascript
import React, { useState, useEffect } from 'react';
import { Text, View, StyleSheet, Alert } from 'react-native';
import { Camera } from 'expo-camera';
import * as BarCodeScanner from 'expo-barcode-scanner';
const QRScanner = () => {
const [hasPermission, setHasPermission] = useState(null);
const [scanned, setScanned] = useState(false);
const [cameraType, setCameraType] = useState(Camera.Constants.Type.back);
// 请求摄像头权限
useEffect(() => {
(async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setHasPermission(status === 'granted');
})();
}, []);
// 处理二维码扫描
const handleBarCodeScanned = ({ type, data }) => {
setScanned(true);
Alert.alleet(
'扫描成功',
`类型: ${BarCodeScanner.BarCodeType[type]}\n内容: ${data}`,
[
{ text: '继续扫描', onPress: () => setScanned(false) }
]
);
};
// 切换摄像头方向
const toggleCameraType = () => {
setCameraType(
cameraType === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back
);
};
// 权限状态处理
if (hasPermission === null) {
return <View style={styles.container}><Text>请求摄像头权限...</Text></View>;
}
if (hasPermission === false) {
return <View style={styles.container}><Text>无摄像头访问权限</Text></View>;
}
return (
<View style={styles.container}>
<Camera
style={styles.camera}
type={cameraType}
onBarCodeScanned={scanned ? undefined : handleBarCodeScanned}
barCodeScannerSettings={{
barCodeTypes: [
BarCodeScanner.Constants.BarCodeType.qr,
BarCodeScanner.Constants.BarCodeType.code128
]
}}
>
<View style={styles.overlay}>
{/* 自定义扫描框 */}
<View style={styles.border} />
<Text style={styles.scanText}>将二维码置于框内扫描</Text>
</View>
</Camera>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
camera: {
flex: 1,
},
overlay: {
flex: 1,
backgroundColor: 'transparent',
justifyContent: 'center',
alignItems: 'center',
},
border: {
width: 250,
height: 250,
borderWidth: 2,
borderColor: 'rgba(0, 255, 0, 0.7)',
backgroundColor: 'transparent',
},
scanText: {
fontSize: 18,
color: 'white',
marginTop: 20,
backgroundColor: 'rgba(0,0,0,0.5)',
padding: 10,
borderRadius: 5,
}
});
export default QRScanner;
```
#### 3. **关键功能说明**
1. **权限管理**:
- 使用 `Camera.requestCameraPermissionsAsync()` 请求权限
- 自动处理 Android/iOS 的权限差异[^3]
2. **扫描控制**:
- `scanned` 状态控制是否响应新扫描
- 扫描成功后显示提示框,点击"继续扫描"可重置状态
3. **自定义扫描框**:
- 通过覆盖层实现绿色扫描框
- 支持添加扫描动画等UI增强
4. **摄像头控制**:
- 支持前后摄像头切换
- 默认扫描二维码和标准条码
#### 4. **最佳实践**
1. **性能优化**:
```javascript
// 在组件卸载时释放资源
useEffect(() => {
return () => Camera.cleanupAsync();
}, []);
```
2. **扫描灵敏度调节**:
```javascript
<Camera
...
barCodeScannerSettings={{
interval: 1000, // 扫描间隔(毫秒)
}}
/>
```
3. **Android 特殊配置**:
在 `android/app/src/main/AndroidManifest.xml` 添加:
```xml
<uses-permission android:name="android.permission.CAMERA" />
```
#### 5. **常见问题解决**
- **扫描不灵敏**:增加扫描间隔或调高设备亮度
- **权限被拒绝**:引导用户到系统设置开启权限
- **旧设备兼容**:降低 `expo-camera` 版本(如 `~13.1.0`)
- **扫描框定位问题**:使用 `Dimensions` API 适配不同屏幕尺寸
> 该方法完全兼容 Expo 托管工作流和裸工作流,相比已弃用的 `BarCodeScanner` 有更好的性能和维护支持[^3][^4]。
### 相关问题
1. 如何在 expo-camera 中实现手电筒开关功能?
2. 扫描二维码时如何添加扫描成功的声音反馈?
3. 如何将扫描结果直接用于页面跳转或 API 调用?
4. 在 Android 设备上遇到扫描框位置偏移该如何解决?
[^1]: React Native 项目调试 之二维码扫描。react-native-barcode-scanner-universal是react-native-barcodescanner和react-native-camera的结合,react-native-barcodescanner应用于android平台,react-native-camera应用于iOS平台。
[^2]: 全栈工程师之路-React Native之扫描二维码。由于会用到 native 的功能,react link会自动向 native 模块中添加各种依赖和导包的操作。
[^3]: Expo|ReactNative 中实现扫描二维码功能。以上代码使用了 `BarCodeScanner` 组件来扫描二维码。该组件会检查用户是否已授予相机权限,并根据权限状态显示相应的内容。
[^4]: Expo XDE(Experience Development Environment)是Expo团队开发的一个集成开发环境,专为构建React Native应用程序而设计。它提供了一种简单的方式,让开发者可以迅速搭建、预览并调试他们的 Expo 项目。
阅读全文
相关推荐




















