Transcript pptx

他のアプリとの連携
6/22
前回の内容

実機でアプリを動かす方法(端末側の設定)

カメラ機能
◦ パーミッションの設定
◦ 実機でアプリを動かす方法(eclipse側の設
定)

音声の録音
本日の内容

インテント

顔検出

音声認識
他のアプリとの連携

Androidでは各種のアプリケーション
同士で連携を図るためのしくみ・イン
テントが用意されています
IntentTestActivity.javaを実行してみましょう
実行結果
ソースコード
Button bt;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
bt = new Button(this);
bt.setText("電話");
ll.addView(bt);
bt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
it.setData(Uri.parse("tel:12345678"));
startActivity(it);
}
}); }
①
②
③
④
インテント処理の流れ

インテント処理の流れは以下のようになる
インテントの作成
↓
インテントにアクションを設定する
↓
インテントにデータを設定する
↓
アクティビティの起動
①

インテントの作成
インテントを作成するにはインテント
型のオブジェクトを作成します
Intent it = new Intent();
② インテントにアクションを設定す
る


インテントのアクションとは、他のActivityやサー
ビスを起動する際に、何をしたいのかを指すため
のものです
アクションを設定する時はsetActionメソッドを使
い、アクションはIntent.ACTION_XXXで定義され
ています
it.setAction(Intent.ACTION_VIEW);
③ インテントにデータを設定す
る


インテントのデータとは特定のインテントの取り
扱い方に関する情報です
データを設定する時はsetDataメソッドを使い、
データには権限やユーザ情報・パスなどを指定す
ることが出来ます
it.setData(Uri.parse("tel:12345678"));
権限やユーザ情報・パス・アドレスなどのURI形式で
ないものはputExtraメソッドを使います
④

アクティビティの起動
設定が出来たらstartActivityメソッドで他のアク
ティビティを起動します
startActivity(it);
※アクションとデータの組み合わせでアクションに
対応したアプリケーションを起動することができ、
この例では電話アプリが起動します
実行結果

putExtraメソッドで検索ワードを指定して検索をす
る例(IntentSearchActivity.java)
ソースコード
Button bt;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
bt = new Button(this);
bt.setText("検索");
ll.addView(bt);
bt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent it = new Intent();
it.setAction(Intent.ACTION_SEARCH);
it.putExtra(SearchManager.QUERY, "Android");
startActivity(it);
}
});
}
①
メールを送る例
// アクションを指定
intent.setAction(Intent.ACTION_SENDTO);
// データを指定
intent.setData(Uri.parse("mailto:[email protected]"));
// CCを指定
intent.putExtra(Intent.EXTRA_CC, new String[]{"[email protected]"});
// BCCを指定
intent.putExtra(Intent.EXTRA_BCC, new String[]{"[email protected]"});
// 件名を指定
intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
// 本文を指定
intent.putExtra(Intent.EXTRA_TEXT, "本文の内容");
// Intentを発行
startActivity(intent);
インテントの取得

インテントで電話機能など予め用意し
てある機能を呼び出してみましたが、
自分で作成したアクティビティクラス
を呼び出してみましょう
呼び出すクラスの作成

資料にあるIntentSenderActivity.javaと
IntentReceiver.javaを1つのプロジェク
トの同じパッケージに入れます
タイトルの作成

インテントを受け取る側のアクティビ
ティクラスのタイトルを作ります
これ
タイトルの作成

Res/valuesの中にあるstring.xmlを開き
追加を押します
タイトルの作成

図のようなウィンドウが出たらString
を選択してOKを押します
タイトルの作成

適当な名前と値を設定して保存すれば
タイトルの完成です
アクティビティクラスの登録

メインとなるアクティビティクラスは
自動的にAndroidManifest.xmlに登録さ
れますが、2個目からは自分で登録し
ます
アクティビティクラスの登録

AndroidManifest.xmlを開き、下にある
AndrodManifest.xmlを開きます
アクティビティクラスの登録

赤枠で囲ってある部分のようにアク
ティビティクラス名とタイトルを指定
します
実行結果

クラスの登録ができたら実行してみま
しょう
顔検出

Androidには顔検出用の機能が搭載さ
れていて、簡単に顔検出をすることが
できます
drawableフォルダを作り適当な画像をいれて
FaceActivity.javaを実行してみましょう
実行結果

集合写真よりも、数人で撮ったような写真
のほうが検知しやすいそうです
ソースコード
private static final int MAX_FACES = 5;
ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
Bitmap image = BitmapFactory.decodeResource(getResources(),
R.drawable.test);
FaceDetector faceDetector = new FaceDetector(image.getWidth(),
image.getHeight(), MAX_FACES);
Face[] faces = new Face[MAX_FACES];
int num = faceDetector.findFaces(image, faces);
①
ソースコード
Bitmap imageCopy = image.copy(Config.ARGB_8888, true);
Canvas canvas = new Canvas(imageCopy);
Paint paint = new Paint();
paint.setColor(Color.argb(255, 255, 0, 0));
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(3.0f);
PointF point = new PointF();
for (int i = 0; i < num; i++) {
faces[i].getMidPoint(point);
canvas.drawPoint(point.x, point.y, paint);
canvas.drawRect(point.x - faces[i].eyesDistance(), point.y
- faces[i].eyesDistance(),
point.x + faces[i].eyesDistance(),
point.y + faces[i].eyesDistance(), paint);
}
imageView = new ImageView(this);
imageView.setImageBitmap(imageCopy);
ll.addView(imageView);
②
①

顔の検出
顔の検出はFaceDetectorクラスを使う
だけで簡単に出来ます
検知する画像の範囲
FaceDetector faceDetector = new FaceDetector(image.getWidth(),
image.getHeight(), MAX_FACES);
検知する最大数
Face[] faces = new Face[MAX_FACES];
int num = faceDetector.findFaces(image, faces);
実際に検知できた数
検知出来た情報をFace
オブジェクトにしまう
②
顔情報の出力
顔情報はFaceオブジェクトに保持され、そこでは目
の位置に注目しています
この例では、目の周辺を赤い四角で囲っています
目の中点?の座標を出力
faces[i].getMidPoint(point);
canvas.drawPoint(point.x, point.y, paint);
canvas.drawRect(point.x - faces[i].eyesDistance(), point.y
- faces[i].eyesDistance(), point.x + faces[i].eyesDistance(),
point.y + faces[i].eyesDistance(), paint);
目から中点までの距離
を返すメソッド
音声認識

Androidでは、端末のマイクに喋った
言葉を認識してテキストに出力してく
れる機能がついています
実行結果
※この機能は正規に契約した端末でしか動かせない
ようです。エミュレータ・情報科学部の端末では動
かないので、実機を持ってる人のを見せてもらって
ください
ソースコード
private static final int REQUEST_CODE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
Button bt = new Button(this);
bt.setText("開始");
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
Toast.makeText(AudioTextActivity.this,
"ActivityNotFoundException", Toast.LENGTH_LONG).show();
}}
});
ll.addView(bt);
}
①
②
ソースコード
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String resultsString = "";
ArrayList<String> results = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
resultsString = results.get(0);
Toast.makeText(this, resultsString, Toast.LENGTH_LONG).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
}
③
① 音声認識用のインテントの生
成
音声認識にはRecognizerIntentクラスの
ACTION_RECOGNIZE_SPEECHをアクションに指定すると実行でき
ます。
またputExtraメソッド内でweb検索なのかそうでないのかを指定
します
コンストラクタにアクショ
ンを指定することも可能
Intent intent = new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
Web検索の時は
LANGUAGE_MODEL_WEB_SEARCH
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
"テキストに変換");
認識中に表示する文字列
②
結果の受け取り
音声の入力が済んだら、startActivityForResultメソッドで
結果を受け取るためのメソッドを起動します
この時に、このクラスが発行したインテントであること
を識別するためにリクエストコードを指定します
startActivityForResult(intent, REQUEST_CODE);
(略)
protected void onActivityResult(int requestCode, int
resultCode, Intent data) {
}
③
音声認識後の処理
音声認識の結果は、getStringArrayListExtraメソッドで可能性の高
い順のリストになって返ってくるので、先頭のものを取り出し
ます
if (requestCode == REQUEST_CODE && resultCode ==
RESULT_OK) {
このクラスが発行したインテントか
String resultsString = "";
どうかの照合
ArrayList<String> results = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
resultsString = results.get(0); 結果を取得し先頭だけ取り出す
Toast.makeText(this, resultsString,Toast.LENGTH_LONG).show();
結果を表示