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();
結果を表示