Skip to content

Instantly share code, notes, and snippets.

@tanbt
Last active August 19, 2020 19:58
Show Gist options
  • Save tanbt/857da772db304c0f1562b28c823a0777 to your computer and use it in GitHub Desktop.
Save tanbt/857da772db304c0f1562b28c823a0777 to your computer and use it in GitHub Desktop.
Expo recording using expo-av
import { StatusBar } from "expo-status-bar";
import React, { useEffect, useState } from "react";
import { StyleSheet, Text, View, Button } from "react-native";
import { Audio } from "expo-av";
import * as Permissions from "expo-permissions";
export default function App() {
const [recording, setRecording] = useState<Audio.Recording>();
const [isAllowRecord, setAllowRecord] = useState("No");
const [recordingStatus, setRecordingStatus] = useState<Audio.RecordingStatus>();
// similar to componentDidMount and componentDidUpdate
useEffect(() => {
_askForPermissions();
});
async function _askForPermissions() {
const response = await Permissions.askAsync(Permissions.AUDIO_RECORDING);
setAllowRecord(response.status);
}
let currentRecordingStatus;
async function _startRecording() {
await Audio.setAudioModeAsync({
playsInSilentModeIOS: true,
allowsRecordingIOS: true,
}); // <= important for IOS
const newRrecording = new Audio.Recording();
setRecording(newRrecording);
await newRrecording.prepareToRecordAsync(
Audio.RECORDING_OPTIONS_PRESET_LOW_QUALITY
);
newRrecording.setOnRecordingStatusUpdate((status: Audio.RecordingStatus) =>
setRecordingStatus(status)
);
await newRrecording.startAsync();
}
async function _stopRecording() {
if (!recording) {
console.log("You are not recording.")
return;
}
try {
await recording.stopAndUnloadAsync();
console.log(`Recorded URI: ${recording.getURI()}`);
} catch (error) {
// Do nothing -- we are already unloaded.
}
}
return (
<View style={styles.container}>
<Text>Open up App.tsx to start working on your app!</Text>
<Button title="start record" onPress={_startRecording} />
<Button title="stop record" onPress={_stopRecording} />
<View>
<Text>Recording permission: {isAllowRecord} </Text>
<Text style={{ fontSize: 15 }}>
Can record: {recordingStatus?.canRecord ? "Yes" : "No"}
</Text>
<Text>Is recording: {recordingStatus?.isRecording ? "Yes" : "No"}</Text>
<Text>
Is done recording: {recordingStatus?.isDoneRecording ? "Yes" : "No"}
</Text>
<Text>Recording time: {recordingStatus?.durationMillis}</Text>
</View>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center",
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment