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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1565閲覧

Intentで他の特定のアプリからテキストを取得し、finish()して戻ってきたい

chuker

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

2クリップ

投稿2020/03/16 06:10

前提・実現したいこと

自分のAndroidアプリで、別のバーコードアプリをintentで起動して、テキストを取得したいです。
バーコードアプリでバーコードを読み取ると、バーコードを数字に置き換えたテキストが得られるはずですが、どうやって**finish()**して自分のアプリに戻ってくればいいかが分かりません。

現状わかっていること

例えば、何らかのカメラアプリを起動する場合であれば、以下のようにIntentを生成し、startActivityForResult()を実行すればいいことはわかっています。

Java

1Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 2if (intent.resolveActivity(getPackageManager()) != null) { 3 // 下記でカメラへ遷移する 4 startActivityForResult(intent, requestCode); 5}

上記コードによりカメラアプリに遷移し、撮影が完了すると**onActivityResult()**が呼び出され、そこでデータの受け取り処理などを行う。ここまでは理解しています。

また、特定のアプリを起動したい場合、以下のような記法でIntentの生成時にアプリのパッケージ名+末尾にアクションを指定する必要があることもわかっています。

Java

1Intent intent = new Intent("com.package.name.SCAN")

わからないこと

今回実現したいのは呼び出し先からのテキストの取得です。
しかし、そもそも呼び出し先のアプリをどうやってfinish()すればいいのかが分かりません。
カメラアプリの場合は撮影したタイミングで勝手に呼び出し元アプリに戻ってきてくれました。
しかし、今回利用しようとしているバーコード読み取りアプリは、読み取り完了と共にfinish()しないように思われます。そのため、一度バーコードアプリへと遷移すると、onActivityResult()戻ってきてテキストを取得するということができません。
finish()して戻ってくることさえできれば、getExtras()等でテキストの取得は問題なくできるのではないかと考えています。

そもそもの理解の確認

初歩的な質問になりますが、そもそも呼び出し先アプリのソースコードにfinish()が書かれているかどうかを判断する術はあるのでしょうか?
また、呼び出し先アプリのfinish()以外の方法で、呼び出し元のアプリに帰ってくる方法はありますか?

補足(その他試したこと)

・PackageManagerを使ったアプリの起動

Java

1PackageManager pm = getPackageManager(); 2Intent intent = pm.getLaunchIntentForPackage("com.package.name"); 3startActivityForResult(intent, requestCode);

setFlagsを使ったアプリの起動

Java

1Intent intent = new Intent(); 2intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3intent.setClassName("com.package.name","com.package.name.MainActivity"); 4startActivityForResult(intent, requestCode);

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/16 11:34

> 自分のAndroidアプリで、別のバーコードアプリをintentで起動して 日本語が微妙なんですけど、バーコードアプリの方は、質問者さんが作ってない、中身の実装を知らないものなんですよね?
chuker

2020/03/16 14:54

はい。何も中身を知らない、ストアからDLしたアプリを起動します。 初心者のため質問自体におかしな点がある可能性がありますが、以下に状況をまとめます。 ■自分で実装できたこと  ・Intentで自アプリ内のアクティビティ間でデータのやりとり  ・ACTION_IMAGE_CAPTUREで、端末標準カメラアプリを起動して、写真を取得 ■実装できていない(知りたい)こと  ・パッケージ名でストアからDLした特定のアプリを起動し、自分のアプリにテキストを取得
退会済みユーザー

退会済みユーザー

2020/03/19 13:05

その特定のアプリがstartActivityForResult()で返せる情報を持っているなら、何かしらこういうデータを返しますって公表してると思うんですよね。 それか、バーコードの読み取りなんで、読み取った結果をコピーするとか、なんかのアプリを開いて貼り付けるという動作なんかがアプリの機能として提供されているか。(それだとstartActivityForResult()じゃ受け取れませんが) startActivityForResult()で値を返せるかは見ようがないので、情報提供されてなければ可能性は低いかと。
chuker

2020/03/20 04:28

お返事ありがとうございます。 アプリを起動しても必ずしも情報を取得できるわけではないのですね。 これで足踏みせずに別の方法に切り替えることができます。 ありがとうございました。
guest

回答1

0

ベストアンサー

概論

Androidで他のアプリにIntentで仕事を頼んで、結果が帰ってくることを期待するときはstartActivityForResultというメソッドにインテントを載せて飛ばします。

インテントで起動されることを前提に書かれているアプリ側ではfinishWithResultというメソッドが呼ばれていて結果をインテントに乗せてくれます。

自分アプリ側ではonActivityResultというメソッドを実装しておいて帰ってきたインテントをキャッチします。

そのやり方で実装された例

バーコードリーダーをそのやり方で実装した例のようです。(詳しくは読んでいません)
http://lnovel.diary.to/archives/65803041.html

とはいえ、編集日時を見ると2012年4月とちょっと古く感じます。

検索してみると、最近ではバーコードリーダーを「ガッシャン!!」と起動するよりはもっとスマートに行き来するのが流行っている模様

よりモダンなバーコードリーダー実装

同じ名前のバーコードリーダーの新しいバージョンのようです。
https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

使い方は日本語で調べてくださった方がいるようです。
https://kagamikarasu.net/android%E3%81%A7zxing%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%83%90%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8B/

こちらも詳しくは読んでいないのですが、embedded(組み込み)とあるので、あたかも自分のアプリの一部のようにバーコードリーダーを呼び出せるようです。

でもやっていることは概論で述べたことと同じで、その機能をよりスマートな感じでラップ(包み込んだ)もののように見受けます。

Androidにおけるプロセス間通信

特殊なバーコードアプリでIntentによる通信を想定していない場合はプロセス間通信が残された可能性になると思います。

公式ドキュメント
https://developer.android.com/guide/components/aidl?hl=ja

私どもは実装したことがないので申し訳ありませんが、実装例を示すことはできません。

考え方

AndroidをLinuxの派生の一つですのでプロセス間通信ができるはずです。
ちなみにLinuxにおいてWebアプリが実行されている場合、サーバサイドプログラムとMySQLなどのデータベースがプロセス間通信をしています。
プロセス間通信はそれぞれのプロセス(アプリ)が指定したポート番号に共通のプロトコルでバイト列を投げ合うことにより行います。
貼り付けた公式ドキュメントがAndroidにおけるプロセス間通信のための情報のようです。

とはいえ、Androidの場合はモバイルデバイスでもあるので矢鱈目鱈に情報を投げ合ってはセキュリティ上問題が発生するのでいろいろ制限があるのだと思います。

果たして「特殊なバーコードアプリ」がこのプロセス間通信に対応しているかどうかは全く未知数なので、この面でドキュメント等に言及がない場合は通信することは想定していない可能性もあります。

投稿2020/03/16 06:52

編集2020/03/17 11:08
quadii.shii

総合スコア257

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

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

chuker

2020/03/17 07:20

詳細なご回答ありがとうございます。 Intentの働きについては理解できました。 しかし、今回利用する特定のバーコードアプリには指定があり、それは「zxing」ではないのです。 非常に初歩的な確認になりますが、 Intentで起動して利用しようとしているアプリが、そもそも他のアプリから起動されることを想定した作りになっていなかった場合、データを受け取ることはできないのでしょうか? 標準のカメラアプリをIntentで起動した時には簡単に写真のDataを自分のアプリに取得できたため、根本的な勘違いをしているかもしれません。 よろしくお願いいたします。
quadii.shii

2020/03/17 07:42

興味深いケースですね。 (指定されている?)バーコードアプリの名称を教えていただくことは可能でしょうか。調査したいです。 私の知見もそれほどではないので断言はできないのですが、「他のアプリから起動されることを想定していないバーコードリーダー」というものが存在するとしたら、それ自体が興味深いです。 確かにどんなアプリでも明示的インテントで指定すれば起動できますが、バーコードリーダーアプリの場合は読み取った結果を返してなんぼだと思うので、何らかの仕方でデータを投げ返してると思うのです。 そうでないとしたら、「読み取ったバーコードでURLをブラウザで開く」など入力に対して自ら完結してるはずではないかと…
chuker

2020/03/17 10:11

申し訳ないです。今回利用するバーコードアプリは少し特殊な、特定の製品に取り付けられている形状のバーコードを読み込む専用のアプリとなっています。 そのため、当然検索による同ケースの解決策が見つからなかったため質問させて頂いているのですが、アプリ名の開示は控えさせてください。 力添え頂いておきながら勝手で恐縮ですが、ご理解をお願いいたします。 上記のようなこともあり、もしかするとそもそも外から呼び出されてデータを投げる作りにはなっていない可能性もあるのかもしれません。その場合だと、intentでのデータ受け取りは諦める他ないということになりますでしょうか?
quadii.shii

2020/03/17 10:58

思いついたことがありますが、少し長くなるので回答に追記します。
chuker

2020/03/20 04:32

別のソリューションまで提示くださりありがとうございました。 ひとまずIntentでの情報の受け取りは、本件において適切ではない可能性が高いことが分かったので、次に進めます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問