This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
スクリーンショットを撮影する
ページを編集
このチュートリアルでは、サードパーティのライブラリを使ってスクリーンショットを撮影し、Android と iOS では Expo Media Library で保存し、web ではダウンロードする方法を学びます。
この章では、サードパーティのライブラリを使ってスクリーンショットを撮影し、デバイスのメディアライブラリに保存する方法を学びます。スクリーンショットの撮影には react-native-view-shot を、デバイスのメディアライブラリへの画像の保存には expo-media-library を使用します。web ブラウザーはアプリにメディアライブラリへのアクセスを提供しないため、web ではスクリーンショットを画像ファイルとしてダウンロードします。
ここまで、
react-native-gesture-handlerやreact-native-reanimatedなどのサードパーティのライブラリを使用してきました。用途に応じて、React Native Directory で他にも数百のサードパーティのライブラリを見つけることができます。

react-native-view-shot でスクリーンショットを撮影し、expo-media-library を使ってデバイスのメディアライブラリに保存します。
2
権限を要求する
デバイスのメディアライブラリへのアクセスのような機密性の高い情報を必要とするアプリでは、アクセスを許可または拒否するための権限を要求する必要があります。expo-media-library の usePermissions() フックは、permissionResponse と、アクセスを要求するための requestPermission() メソッドを返します。このアプリはメディアライブラリに画像を保存するだけなので、writeOnly: true オプションを渡して、読み取りアクセスなしで書き込みアクセスを要求します。
アプリが初めて起動され、権限のステータスが許可も拒否もされていない場合、permissionResponse の値は null になります。権限を要求されると、ユーザーは権限を許可するか拒否するかを選択できます。許可されていない場合に判定する条件を追加します。許可されていない場合は、requestPermission() メソッドを呼び出します。アクセスが得られると、permissionResponse.granted の値は true に変わります。
次のコードスニペットを src/app/(tabs)/index.tsx の中に追加します。
3
現在のビューを保存するための ref を作成する
アプリ内でユーザーがスクリーンショットを撮影できるようにするため、react-native-view-shot を使用します。このライブラリは、captureRef() メソッドを使って <View> のスクリーンショットを画像として撮影します。撮影したスクリーンショット画像ファイルの URI が返されます。
前の章で、<ImageViewer> と <EmojiSticker> コンポーネントを <View> で囲みました。この <View> を撮影します。
react-native-view-shotからcaptureRefを、React からuseRefとComponentRef型をインポートします。<View>の参照を保持するimageRef参照変数を作成します。<ImageViewer>と<EmojiSticker>コンポーネントを囲む<View>のrefプロパティに、参照変数を渡します。
上のスニペットでは、collapsable プロパティを false に設定しています。これにより、<View> コンポーネントは背景画像と絵文字ステッカーのみをスクリーンショットの対象にできます。
4
スクリーンショットを撮影して保存する
onSaveImageAsync() 関数の中で react-native-view-shot の captureRef() メソッドを呼び出すことで、ビューのスクリーンショットを撮影できます。このメソッドは省略可能な引数を受け取り、スクリーンショットを撮影する領域の width と height を渡せます。利用可能なオプションの詳細については、ライブラリのドキュメント を参照してください。
また、captureRef() メソッドはスクリーンショットの URI で解決される Promise を返します。この URI を MediaLibrary.Asset.create() のパラメータとして渡すと、デバイスのメディアライブラリにスクリーンショットが保存されます。
src/app/(tabs)/index.tsx の中で、onSaveImageAsync() 関数を次のコードに更新します。
それでは、アプリで写真を選び、ステッカーを追加してから Save ボタンをタップしてみましょう。Android と iOS で次のような結果が表示されるはずです。
5
web でスクリーンショットを保存する
react-native-view-shot は web でもスクリーンショットを撮影できます。ただし、expo-media-library は Android と iOS でのみ動作します。web では、代わりにスクリーンショットを画像ファイルとしてダウンロードします。
React Native の Platform モジュールを使うと、プラットフォーム固有の動作を実装できます。web では、result オプションを 'data-uri' に設定すると、captureRef() はスクリーンショットを データ URL として返します。このデータ URL をリンク要素に渡すと、画像をダウンロードできます。
src/app/(tabs)/index.tsx の中で、onSaveImageAsync() 関数を更新し、Platform.OS プロパティを使って現在のプラットフォームが 'web' かどうかを判定します。
'web'でない場合は、Android と iOS 向けに追加したものと同じロジックを引き続き使用します。'web'の場合は、captureRef()メソッドを使って現在の<View>を JPEG 画像として撮影します。次に、データ URL を持つリンク要素を作成し、それをクリックして画像をダウンロードします。
imageContainer スタイルで使用しているため、Platform モジュールはすでに react-native からインポートされています。
web ブラウザーでアプリを実行すると、スクリーンショットを保存できるようになります。
まとめ
Chapter 7: Take a screenshot
We've successfully used react-native-view-shot and expo-media-library to capture a screenshot and save it on the device's library, and to download it on the web.
The app does everything we set out for it to do. In the next chapter, we will customize the app's status bar, splash screen, and app icon.