Androidでカメラを作る ~ その3:写真のAndroidへの登録
1回目の投稿で、私のスマートフォンで撮影した写真がAndroidへ登録されないという内容を書きました。私の今使っているAndroidスマートフォンはAndroid10でかつColor OSです。この条件では、従来のAndroidへの通知では駄目なようです(その1の記事をご覧ください)。
MediaStore(メディアコレクション )に保存
従来は、自アプリ内のストレージに画像を保存し、その位置をAndroidに通知していました。
しかし、今回のようなAndroid10以降の場合は(正解な区分ではないかもしれないが)、MediaStoreの領域に画像を保存し、自アプリの領域には画像を保存しない方が良いようです。
その方が、アプリをアンインストールしても画像がMediaStoreに残るので、間違って削除する心配もなくなります。
保存されている場所は?
それでは、MediaStoreについて説明します。MediaStoreでは、主に以下のコンテンツを扱います。
- 画像
- 動画
- オーディオ
今回は写真を扱うので、画像が対象になります。実際にカメラアプリケーションを動かして写真がどこに保存されたか確認すると、Picturesのフォルダに保存されていました (ファイルマネージャーで確認) 。
これで、Androidから見えるようになったので、選択してクラウドへコピーすることもできるようになりました。
MediaStoreへ登録するときのコード
MediaStoreへ登録するコードを抜粋しました。
// Android 10からのメディアへの登録
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, imgFileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.IS_PENDING, 1);
ContentResolver resolver = getApplicationContext().getContentResolver();
Uri collection = MediaStore.Images.Media.getContentUri(
MediaStore.VOLUME_EXTERNAL_PRIMARY);
Uri item = resolver.insert(collection, values);
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
try (OutputStream outstream = getContentResolver().openOutputStream(item)) {
bmp.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
} catch (IOException e) {
e.printStackTrace();
}
values.clear();
values.put(MediaStore.Images.Media.IS_PENDING, 0);
resolver.update(item, values, null, null);
画像データの「bytes」をJPEGでクオリティ70%で保存しています。
アプリの提供はバージョンの確認が大事
Androidの開発では、Android OSのバージョンを確認する必要があります。今回のカメラアプリ開発ではCamera2というライブラリを使っていますが、これはAndroid 5.0から使える機能で、それ以前のAndroidでは、古いライブラリを使用する必要があります。
とにかくAndroidは仕様変更が多くて、権限の縛りがどんどん厳しくなっています。そのため、従来のままで対応すると、動作しなくなることも多いです。
私のように個人で作成している分は動作しなくてもご愛敬で済みますが、仕事として社会全体に行き渡るような開発をしている人は、常に情報を確認し、対応してください。そうしないと、昨今のような混乱が頻繁に起こってしまうでしょう。
今回で基本的な機能の実装が終わりました。今後は、自分に必要な機能を肉付けしていきたいと思います。