当前位置:首页 > React

react native 实现相册

2026-01-27 09:15:55React

实现相册功能的核心模块

React Native 实现相册功能主要依赖以下核心模块:

  • 媒体库访问:使用 expo-media-libraryreact-native-fs 获取设备图片
  • 图片展示:通过 FlatListSectionList 实现网格布局
  • 权限管理:处理 iOS/Android 的存储权限请求

安装必要依赖

# 使用 Expo 生态
expo install expo-media-library expo-image-picker

# 非 Expo 项目
npm install react-native-permissions @react-native-camera-roll/camera-roll

权限请求实现

iOS 需要在 Info.plist 添加:

<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以选择照片</string>

Android 需要在 AndroidManifest.xml 添加:

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

权限请求代码示例:

react native 实现相册

import { PermissionsAndroid, Platform } from 'react-native';
import * as MediaLibrary from 'expo-media-library';

const requestPermission = async () => {
  if (Platform.OS === 'android') {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
    );
    return granted === PermissionsAndroid.RESULTS.GRANTED;
  }

  const { status } = await MediaLibrary.requestPermissionsAsync();
  return status === 'granted';
};

获取相册图片数据

使用 expo-media-library 获取媒体资源:

const loadPhotos = async () => {
  const { granted } = await MediaLibrary.getPermissionsAsync();
  if (!granted) return;

  const albums = await MediaLibrary.getAlbumsAsync();
  const cameraRoll = albums.find(album => album.title === 'Camera Roll');

  const { assets } = await MediaLibrary.getAssetsAsync({
    album: cameraRoll,
    mediaType: ['photo'],
    first: 100,
    sortBy: ['creationTime'],
  });

  return assets;
};

图片网格布局实现

使用 FlatList 展示图片:

import { FlatList, Image, StyleSheet } from 'react-native';

const renderItem = ({ item }) => (
  <Image 
    source={{ uri: item.uri }} 
    style={styles.thumbnail}
  />
);

const PhotoGrid = ({ photos }) => (
  <FlatList
    data={photos}
    renderItem={renderItem}
    keyExtractor={item => item.id}
    numColumns={3}
    contentContainerStyle={styles.grid}
  />
);

const styles = StyleSheet.create({
  thumbnail: {
    width: 120,
    height: 120,
    margin: 2
  },
  grid: {
    padding: 5
  }
});

图片选择功能扩展

集成图片选择器实现单选/多选:

react native 实现相册

import * as ImagePicker from 'expo-image-picker';

const pickImage = async () => {
  const result = await ImagePicker.launchImageLibraryAsync({
    mediaTypes: ImagePicker.MediaTypeOptions.Images,
    allowsMultipleSelection: true,
    selectionLimit: 5
  });

  if (!result.canceled) {
    return result.assets;
  }
};

性能优化建议

对于大型相册加载:

  • 实现分页加载 (getAssetsAsyncafter 参数)
  • 使用 resizeMode="cover" 优化图片渲染
  • 考虑使用 react-native-fast-image 替代默认 Image 组件
  • 对 Android 大图集添加 decodeWidth: 200 参数降低内存占用

平台差异处理

iOS 特殊处理:

if (Platform.OS === 'ios') {
  // iOS 需要额外处理相册变更监听
  const subscription = MediaLibrary.addListener(() => {
    // 相册内容变化时重新加载
  });
}

Android 10+ 适配:

if (Platform.Version >= 29) {
  // 使用 MediaStore API 替代直接文件访问
  const uri = ContentUris.withAppendedId(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    id
  );
}

标签: 相册react
分享给朋友:

相关文章

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Context中…

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…

typescript react 如何

typescript react 如何

TypeScript 与 React 结合使用的方法 在 React 项目中使用 TypeScript 可以提升代码的可维护性和类型安全性。以下是一些关键步骤和最佳实践: 安装 TypeScript…

如何调试react

如何调试react

调试 React 应用的方法 使用 React Developer Tools 安装浏览器扩展(Chrome/Firefox),通过组件树查看组件状态、props 和 hooks。支持实时编辑 pro…

react如何debugger

react如何debugger

调试 React 应用的方法 使用浏览器开发者工具进行调试 React 开发者工具(React DevTools)是调试 React 应用的必备工具。安装 Chrome 或 Firefox 扩展后,可…