[Android] Camera で撮影、Intentで簡単にやりましょ

 

写真を外部ストレージ領域に保存

 
ある程度大きい画像で表示したい場合は画像をファイルとしてアプリ固有の外部ストレージに保存し、その画像を表示させます。

外部ストレージはSDカードや端末内部のメモリ領域を指しますが今回は、アプリ固有のプライベートなストレージを使います。フォトやギャラリーなどのユーザーが撮影した写真が保存される領域とは異なります。
 
また、アプリ固有の外部ストレージ領域を使いますので「WRITE_EXTERNAL_STORAGE」のPermissionは必要ありません。

API24からはUriをfile://xxx という使い方ができなくなったためFileProviderを使います。
https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat 

FileProvider:
アプリ間でのデータ共有を可能にしたContentProviderがありますが、それを簡単にしたサブクラスです。
このアプリとフォトアプリのデータ共有です(デフォルトのカメラアプリが撮影画像をフォトアプリで引き出せるメモリ領域に保存している)
 
FileProvider tag を AndroidManifestに追加します。
 
AndroidManifest.xml

 
android:authoritiesはアプリのパッケージ名+fileprovider
android:resource=”@xml/provider_path”
ではファイルを渡すための共有ディレクトリーを設定します。

xmlフォルダーを作成してその中に共有するファイルを入れます。例えば、
res¥xml¥provider_path.xml ファイルを作って以下のように記述します。
 
camera intent 02 1 - [Android]  Camera で撮影、Intentで簡単にやりましょ
 
provider_path.xml

 
あとは、Uri.fromFileの変更です。getUriForFile()からUriを取得します。
getUriForFile(Context context, String authority, File file)
authority はAndroidManifestで設定した
android:authorities=”${applicationId}.fileprovider”
になります。
 

 

サンプルコード

 
これでまとめると
MainActivity.java

 
provide_path.xml

 

AndroidManifest.xml

 
レイアウト、リソースは前と同じです。

activity_main.xml

 
strings.xml

camera simple 06 - [Android]  Camera で撮影、Intentで簡単にやりましょ

 
 
References:
Camera API | Android Developers
実行時のパーミッション リクエスト | Android Developers
FileProvider | Android Developers
Setting Up File Sharing | Android Developers
Privacy changes in Android 10 | Android Developers
一般的なインテント | Android Developers
Android 11 でのパッケージへのアクセス
動作の変更点: Android 11 をターゲットとするアプリ







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
Androidアプリコース



Code Camp
現役エンジニアによるオンラインプログラミングスクール【CodeCamp】


直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。



侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする