android Intentから呼び出したカメラで撮影した画像のファイルサイズの設定方法
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,575
拝見していただきありがとうございます。
不足・不手際等ございましたら、ご指摘いただければと思います。
前提・実現したいこと
ボタンを押下時に、
カメラかギャラリーかを選択して画像を取得してImageViewに表示させます。
カメラを選択した際に、撮影した写真はギャラリーの中に残します。
発生している問題・エラーメッセージ
撮影した写真のファイルサイズが現状では0Bとなってしまうため、
正しいファイルサイズを設定したいです。
該当のソースコード
package com.example.sampleappimagefile;
import android.content.ContentValues;
import android.content.Intent;
import android.media.ExifInterface;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CHOOSER = 1;
private Uri m_uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void getImage(View view) {
try {
//カメラの起動Intentの用意
String imageName = System.currentTimeMillis() + ".jpg";
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.TITLE, imageName);
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, imageName);
contentValues.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
// 1970/01/01 9:00からの秒のため1000で割る。※ミリ秒ではなく秒
contentValues.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000);
//この時点ではファイルサイズは分からない
//contentValues.put(MediaStore.Images.Media.SIZE, size);
m_uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, m_uri);
//Documentは省略
Intent intent = Intent.createChooser(intentCamera, "画像の選択");
startActivityForResult(intent, REQUEST_CHOOSER);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
super.onActivityResult(requestCode, resultCode, data);
// カメラかギャラリーの写真
if (requestCode == REQUEST_CHOOSER) {
if (resultCode != RESULT_OK || data != null && data.getAction() == null) {
// キャンセル時または、ギャラリーから選択を選び、不要となったカメラintentの画像元データを削除する
getContentResolver().delete(m_uri, null, null);
return;
}
Uri resultUri = null;
if (data != null) {
resultUri = data.getData();
} else {
resultUri = m_uri;
}
// 画像を取得に失敗
if (resultUri == null) {
return;
}
MediaScannerConnection.scanFile(
this,
new String[]{resultUri.getPath()},
new String[]{"image/jpeg"},
null
);
ExifInterface ex = new ExifInterface(resultUri.getPath());
//ファイルサイズに該当する属性が分からない
//ex.setAttribute(ExifInterface.SIZE?, size);
ex.saveAttributes();
// 画像を設定
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageURI(resultUri);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
試したこと
contentValues.put(MediaStore.Images.Media.SIZE, size);
ここに値を入れればファイルサイズに反映するが、
写真撮影前のため正しい値が分からない。
ExifInterface ex = new ExifInterface(resultUri.getPath());
//ex.setAttribute(ExifInterface.SIZE?, size);
ex.saveAttributes();
これでExifに追加できそうだが、
ファイルサイズに該当する属性が分からない。
端末のギャラリーの設定にある
「情報の更新とキャッシュの削除」を行うと正しいファイルサイズがセットされるが
アプリの時点で正しいファイルサイズを設定したいです。
よろしくお願いいたします。
補足情報
Android Studio 2.2.2
端末 SH-05G
Androidバージョン 5.0.2
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/10/25 13:21
getImageでは、まだ撮影をしていないためFile#lengthでも0となりました。
また、onActivityResultでは取得はできるのですが、それを画像に反映させる方法がわかりません。
何か、いい方法がありましたらよろしくお願い致します。
2016/10/25 13:43
撮影前にデータを登録するとカメラアプリでホームボタンを押して、タスクキルするとデータが残りますね。
2016/10/25 15:18
上記の方法しか見つけることはできませんでした。
>撮影前にデータを登録するとカメラアプリでホームボタンを押して、タスクキルするとデータが残りますね。
この場合にデータが残ってしまうのは把握していましたが、
getImageではIntent呼び出しだけでm_uriにinsertを行わず、
onActivityResultだけで完結しようとした時のソースが以下なのですが、
Bitmap画像が粗すぎて上記の方法になりました。
```
Bundle bundle = data.getExtras();
Bitmap bmp = (Bitmap) bundle.getParcelable("data");
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(bmp);
```
2016/10/25 15:27
・現状のままでサイズは登録せず、onActivityResultでサイズをupdateしたらどうでしょう。
2016/10/25 20:50
ありがとうございます。
>撮影前にデータを登録するとカメラアプリでホームボタンを押して、タスクキルするとデータが残りますね。
この場合もあるため、
次はFileインスタンスからUriインスタンスを作ってIntentを投げ、onActivityResultでinsertする形で実装してみます。