前回のエントリーでカメラやギャラリーから画像を取得する周りまとめを書きましたが、
カメラからの画像取得に関して、国産端末で上手くいかないことが判明しましたので
こちらのエントリーで訂正させていただきます。
■国産の端末のほとんどでonActivityResultのdataパラメタにuriが入ってきません;;
前回エントリーを書いてからアプリを実際につくり、
国内メーカーの機種で試したところdata.getData()でuriが取得できない事が判明。
そこで保存先を明示することにしました。
まずカメラの呼び出しから
Uri uri; ←Activityクラスにプロパティとして置いてonActivityResultで参照できるように
カメラボタン押下などインテントの呼び出しを行う箇所の記述
------------------------------------------------------
//ContentValues
ContentValues values = new ContentValues();
//ファイル名を決めて
String filename = System.currentTimeMillis() + ".jpg";
//必要な情報を詰める
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
//Uriを取得して覚えておく、Intentにも保存先として渡す
uri= getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
//インテントの設定
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, resourceUri);
startActivityForResult(intent, CAMMERA_IMAGE);
------------------------------------------------------
Manifastへの外部ストレージへの書き出し許可のユーザーパーミッションは忘れないでください。
onActivityResultの修正
------------------------------------------------------
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK){
return;
}
//uriにnullを詰めるコードを消す
if (requestCode == GALLERY_IMAGE) {
resourceUri= data.getData();
}
else if(requestCode == CAMMERA_IMAGE){
//カメラからの戻りの場合はuriをdataから取得しない(起動時に指定したUriが入っている)
// uri =data.getData();
}
if(uri == null){
return;
}
try {
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
/*
//ファイルパスを取得したい場合は下記のようにContentResolverを活用する
//ContentResolver経由でファイルパスを取得
ContentResolver cr = getContentResolver();
String[] columns = {MediaStore.Images.Media.DATA };
Cursor c = cr.query(uri, columns, null, null, null);
c.moveToFirst();
File picture = new File(c.getString(0));
*/
} catch (Exception e){
// } catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
return;
}
}
------------------------------------------------------
上記の画像のロードはシンプルな実装ですが、前回も書いた通り下記の関数を噛ませてリサイズしながらロードすることを推奨します。
こちらから飛んでください
これで国産端末でもカメラから画像を取得できると思います。
カメラからの画像取得に関して、国産端末で上手くいかないことが判明しましたので
こちらのエントリーで訂正させていただきます。
■国産の端末のほとんどでonActivityResultのdataパラメタにuriが入ってきません;;
前回エントリーを書いてからアプリを実際につくり、
国内メーカーの機種で試したところdata.getData()でuriが取得できない事が判明。
そこで保存先を明示することにしました。
まずカメラの呼び出しから
Uri uri; ←Activityクラスにプロパティとして置いてonActivityResultで参照できるように
カメラボタン押下などインテントの呼び出しを行う箇所の記述
------------------------------------------------------
//ContentValues
ContentValues values = new ContentValues();
//ファイル名を決めて
String filename = System.currentTimeMillis() + ".jpg";
//必要な情報を詰める
values.put(MediaStore.Images.Media.TITLE, filename);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
//Uriを取得して覚えておく、Intentにも保存先として渡す
uri= getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
//インテントの設定
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, resourceUri);
startActivityForResult(intent, CAMMERA_IMAGE);
------------------------------------------------------
Manifastへの外部ストレージへの書き出し許可のユーザーパーミッションは忘れないでください。
onActivityResultの修正
------------------------------------------------------
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK){
return;
}
//uriにnullを詰めるコードを消す
if (requestCode == GALLERY_IMAGE) {
resourceUri= data.getData();
}
else if(requestCode == CAMMERA_IMAGE){
//カメラからの戻りの場合はuriをdataから取得しない(起動時に指定したUriが入っている)
// uri =data.getData();
}
if(uri == null){
return;
}
try {
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
/*
//ファイルパスを取得したい場合は下記のようにContentResolverを活用する
//ContentResolver経由でファイルパスを取得
ContentResolver cr = getContentResolver();
String[] columns = {MediaStore.Images.Media.DATA };
Cursor c = cr.query(uri, columns, null, null, null);
c.moveToFirst();
File picture = new File(c.getString(0));
*/
} catch (Exception e){
// } catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
return;
}
}
------------------------------------------------------
上記の画像のロードはシンプルな実装ですが、前回も書いた通り下記の関数を噛ませてリサイズしながらロードすることを推奨します。
こちらから飛んでください
これで国産端末でもカメラから画像を取得できると思います。