From 9b7e728c9d84ecb43cda5a73e5b4c0fd2c95016f Mon Sep 17 00:00:00 2001 From: Developer Date: Fri, 6 Mar 2026 12:58:41 +0800 Subject: [PATCH] 1 --- app.json | 9 +- app/_layout.tsx | 5 +- app/index.tsx | 5 +- app/video/[bvid].tsx | 3 +- components/NativeVideoPlayer.tsx | 37 +++ components/VideoPlayer.tsx | 39 ++-- package-lock.json | 377 ++++++++++++++++++++++++++++++- package.json | 10 +- 8 files changed, 452 insertions(+), 33 deletions(-) create mode 100644 components/NativeVideoPlayer.tsx diff --git a/app.json b/app.json index 5a09452..596f3d1 100644 --- a/app.json +++ b/app.json @@ -22,7 +22,14 @@ "backgroundImage": "./assets/android-icon-background.png", "monochromeImage": "./assets/android-icon-monochrome.png" }, - "predictiveBackGestureEnabled": false + "predictiveBackGestureEnabled": false, + "permissions": [ + "android.permission.RECORD_AUDIO", + "android.permission.MODIFY_AUDIO_SETTINGS", + "android.permission.RECORD_AUDIO", + "android.permission.MODIFY_AUDIO_SETTINGS" + ], + "package": "com.anonymous.bilibiliapp" }, "web": { "bundler": "metro", diff --git a/app/_layout.tsx b/app/_layout.tsx index adfd957..69ee5c2 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,6 +1,7 @@ import { Tabs } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { StatusBar } from 'expo-status-bar'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; import { useEffect } from 'react'; import { useAuthStore } from '../store/authStore'; @@ -12,7 +13,7 @@ export default function RootLayout() { }, []); return ( - <> + - + ); } diff --git a/app/index.tsx b/app/index.tsx index f7df5a5..7d11dad 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,8 +1,9 @@ import React, { useEffect, useState } from 'react'; import { - View, FlatList, StyleSheet, SafeAreaView, + View, FlatList, StyleSheet, Text, TouchableOpacity, ActivityIndicator, Dimensions } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { VideoCard } from '../components/VideoCard'; @@ -52,7 +53,7 @@ export default function HomeScreen() { item.bvid} + keyExtractor={(item, index) => `${item.bvid}-${index}`} numColumns={2} columnWrapperStyle={styles.row} contentContainerStyle={styles.list} diff --git a/app/video/[bvid].tsx b/app/video/[bvid].tsx index 3d842a3..ee1b37c 100644 --- a/app/video/[bvid].tsx +++ b/app/video/[bvid].tsx @@ -1,8 +1,9 @@ import React, { useState, useEffect } from 'react'; import { - View, Text, ScrollView, StyleSheet, SafeAreaView, + View, Text, ScrollView, StyleSheet, TouchableOpacity, Image, ActivityIndicator } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { VideoPlayer } from '../../components/VideoPlayer'; diff --git a/components/NativeVideoPlayer.tsx b/components/NativeVideoPlayer.tsx new file mode 100644 index 0000000..753d8b3 --- /dev/null +++ b/components/NativeVideoPlayer.tsx @@ -0,0 +1,37 @@ +import React, { useRef, useState } from 'react'; +import { View, StyleSheet, Dimensions } from 'react-native'; +import { Video, ResizeMode, AVPlaybackStatus } from 'expo-av'; + +const { width } = Dimensions.get('window'); +const VIDEO_HEIGHT = width * 0.5625; + +interface Props { + uri: string; +} + +export function NativeVideoPlayer({ uri }: Props) { + const videoRef = useRef