当前位置:首页 > 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"/>

权限请求代码示例:

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
  }
});

图片选择功能扩展

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

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 native 实现相册

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

相关文章

如何删除react

如何删除react

卸载 React 项目依赖 打开项目根目录下的 package.json 文件,删除所有包含 react、react-dom 或其他 React 相关库的依赖项。保存文件后运行以下命令: npm…

react 如何引入jquery

react 如何引入jquery

安装 jQuery 库 在 React 项目中引入 jQuery 的第一步是安装 jQuery。可以通过 npm 或 yarn 安装: npm install jquery # 或 yarn…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…