質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

625閲覧

AndroidStudio ActivityのResultでコールバックを実行させたい

SZ-Z0001

総合スコア38

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/08/27 13:04

質問内容

画像をギャラリーもしくはカメラから取得し取り出す処理を別のアクティビティで定義し、他のアクティビティから呼び出せるようにしたい。
そして、Bitmapを引数に取る関数をコールバックとして最後に呼び出せるようにしたい。

詳細例

 内容としては 
MainActivityからImageManagerActivityなる画像を読み込むActivityを呼び出し、ImageManagerActivityではカメラとギャラリーから画像を取得後、取得したデータを引数に取る関数を実行したい。

###補足
質問するとおそらく呼び出し側ActivityのonActivityResultで読み取ればいいとのコメントが来ると思いますが、それだとBitmap変換処理を画像取得処理毎に書かなくてわならない為効率が悪すぎます。

###ためした事

 画像処理側のActivityはあくまでも画像を操作するためだけに使い、呼び出し側のIntentを渡す事で呼び出し側のonActivityResultで処理を行う。

-> 画像操作部分は短縮できたがやはりonActivityResultでの無駄なコードが多すぎる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ImageManagerActivityに選択・撮影した画像を保持するプロパティを設定し、ImageManagerActivityを終了する直前に、そのプロパティを元にBitmapに変換して、その値をsetResult()に設定すれば、onActivityResult()は使用しますが、やりたいことが実現できると思います。

Java

1//質問文に明記されていなかったため、以下のコードでは、 2//ImageManagerActivityで選択・撮影した画像はUri形式でその保存先Uriを取得できるものとする。 3//また本筋とは関係のないコードは省略しています。 4public class ImageManagerActivity extends Activity { 5 6 //選択・撮影した画像の保存先URIを保持するリスト 7 private ArrayList<Uri> pictureUriList = new ArrayList<>(); 8 9 @Override 10 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 11 super.onActivityResult(requestCode, resultCode, data); 12 Bundle bundle = data.getExtras(); 13 14 //~~略~~ 15 16 //ここで選択・撮影した画像をpicureUriListに保持させる 17  this.picutreList.add(selectingOrTakingPictureUri) 18 19 } 20 21 //全ての選択・撮影が完了したときに呼ばれるメソッド 22 private void onFinishSelectingOrTakingPicture(){ 23 24 //ここで、任意のUri→Bitmapの変換処理を行う 25 List<Bitmap> bitmaps = BitmapHenkanUtils.convertUriToBitmap(this.pictureUriList); 26 27 //インテントの作成 28 Intent data = new Intent(); 29 Bundle bundle = new Bundle(); 30 bundle.putParcelableArrayList("bitmaps", bitmaps) 31 data.putExtras(bundle); 32 33 //Resultを設定して終了する 34 this.setResult(RESULT_OK, data); 35 this.finish(); 36 37 } 38 39} 40

追記

投稿してから気づきましたが、一般にBitmapは必要なメモリ容量が大きく、Intentに容量が大きいBitmapを設定するとTransactionTooLargeExceptionが発生するため、この方法では容量が大きなBitmapは渡せないです。
メモリ消費を抑えるという観点からも、やはりImageManagerActivityではUri/FileなどのListを返し、呼び出し元で変換ユーティリティクラスなどを用いて、必要な時にBitmap化した方が良いかもしれません。

投稿2019/08/28 10:23

編集2019/08/28 11:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SZ-Z0001

2019/08/28 22:56

非常に解りやすい回答誠にありがとうございます。 ご記載いただいた内容を参考に改変をしたらうまくいきました。 最終的にContextを渡し呼び出し側のActivityからImageManagerActivityへ渡して、呼び出し側ActivityのonActivityResult側でImageConverterなるBitmap変換用のクラスを定義し、そのままリクエストコード群とコールバック処理を渡してあげる事で画像処理とコールバック処理を完結に書く事が出来ました。 呼び出し側Activityで毎回クラスのインスタンスを取らなくてはならない部分は私の勉強不足ですが、メモリ問題等も発生していたら完成に至りませんでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問