2017年1月14日土曜日

Android の FrameLayout概要

目次へ



FrameLayoutでは、その中に部品を置くとその上に重なって表示されていきます。下の例は、それを使って画像の上にボタンともうひとつのが像を重ねています。

■■■■FrameLayout例

レイアウトファイル
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/img1"/ />
    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:src="@mipmap/ic_launcher" />
  <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="ボタン"/>


</FrameLayout>


上のような指定をした場合、次のような画面が表示されます。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2017年1月11日水曜日

Android ダイアログの使い方

目次へ



Androidでダイアログを作成する方法をまとめておきます。
ここで使うダイアログはすべてAlertDialogクラスを使い次のようなものを表示します。

  • メッセージを表示するだけのダイアログ
  • ボタンがあり、ユーザがボタンをタップし答えることのできるダイアログ
  • 複数の項目から選択をするダイアログ
  • ラジオボタンとボタンを表示するするダイアログ
  • チェックボックスとボタンを表示するするダイアログ




■■■■ダイアログを表示するためのボタンを作っておく



最初に5種類のダイアログを表示するためのボタンを作り、btn1~btn5の名前で使えるようにしておきます。
ボタンの作り方はこちら、あるいは、こちらなどで検索してください。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn1 = (Button)this.findViewById(R.id.button1);
        Button btn2 = (Button)this.findViewById(R.id.button2);
        Button btn3 = (Button)this.findViewById(R.id.button3);
        Button btn4 = (Button)this.findViewById(R.id.button4);
        Button btn5 = (Button)this.findViewById(R.id.button5);
    この下に、次から示すボタンのリスナを書く




■■■■メッセージを表示するだけのダイアログ



btn1をタップされた時の処理としてメッセージを表示するだけのダイアログを出すのが下のコードです。
この中の①のMainActivity.thisはActivityのインスタンスです。
OnClickListenerの中で使っているために、thisではなく、自分のクラス名.thisとしています。

if (btn1 != null) {
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);①
            builder.setTitle("タイトル");
            builder.setMessage("AlertDialogです");
            builder.show();
        }
    });
}



■■■■ボタンで答えるダイアログ



btn2をタップされた時の処理として上のようなダイアログを出すのが下のコードです。

ダイアログの中のボタンは、必要なものだけ、作成すればよいので、OKだけならbuilder.setPositiveButtonメソッドだけを呼び出せばよいことになります。

if (btn2 != null) {
    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("タイトル");
            builder.setMessage("ボタンのあるAlertDialogです");
            //3つのボタンのうち必要なボタンだけ作成すればよい
            builder.setPositiveButton("はい", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setNegativeButton("いいえ", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, "NO", Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setNeutralButton("またね", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast=Toast.makeText(MainActivity.this,"またね",Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}




■■■■複数の項目から選択をするダイアログ



btn3をタップされた時の処理として上のような複数の項目から選択をするダイアログを出すのが下のコードです。

このとき、選択肢の文字列はフィールドで定義しておきます。

   String[] ss = {"選択1", "選択2", "選択3"};
    int selectedItem = 0;
    boolean[] selectedItems = {false, false, false};

if (btn3 != null) {
    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してください");
            builder.setItems((CharSequence[]) ss, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int k) {
                    Toast toast=Toast.makeText(MainActivity.this,ss[k],Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}




■■■■ラジオボタンとボタンを表示するするダイアログ



btn4をタップされた時の処理として上のようなダイアログを出すのが下のコードです。
このとき、複数の項目から選択をするダイアログの時と同じようにフィールドで選択肢の文字列を定義しておきます。また、ラジオボタンを押したときにその番号を入れておくためのselectedItemもフィールドで定義しておきます。

   String[] ss = {"選択1", "選択2", "選択3"};
    int selectedItem = 0;


if (btn4 != null) {
    btn4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してからOKボタンを押してください");
            builder.setSingleChoiceItems((CharSequence[]) ss, 0, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    selectedItem = which;
                    Toast toast = Toast.makeText(MainActivity.this, ss[which], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast toast = Toast.makeText(MainActivity.this, ss[selectedItem], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}



■■■■チェックボックスとボタンを表示するするダイアログ



btn5をタップされた時の処理として上のようなダイアログを出すのが下のコードです。
このとき、フィールドで選択肢の文字列と、どこにチェックが入っているかを示すbooleanの配列が必要です。
   String[] ss = {"選択1", "選択2", "選択3"};
   boolean[] selectedItems = {false, false, false};


    btn5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("選択してからOKボタンを押してください");
            builder.setMultiChoiceItems((CharSequence [])ss, selectedItems, 
                                 new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int k, boolean isChecked) {
                    selectedItems[which] = isChecked;
                    Toast toast = Toast.makeText(MainActivity.this, ss[k], Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String s = "選択されているのは";
                    for(int i=0; i<3; i++) {
                        if(selectedItems[i]) {
                            s += ss[i]+" ";
                        }
                    }
                    Toast toast = Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT);
                    toast.show();
                }
            });
            builder.show();
        }
    });
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2017年1月8日日曜日

Android メニューの使い方

目次へ



基本的なことですが、Androidでメニューを作成し、メニューが選択された時の処理を作成する方法をまとめておきます。
  • onCreateOptionsMenu(Menu menu) がメニュー生成のためのメソッド
  • MenuInflater クラスがメニューを作成するためのクラス
  • onOptionsItemSelected(MenuItem item) がメニューが選択された時に呼ばれるメソッド


■■■■メニュー生成のためのメソッド

Android端末のメニューボタンを押すと画面にポップアップして現れるメニューをオプションメニューと言います。
オプションメニューは、ActivityクラスのonCreateOptionsMenuというメソッドをオーバーライドして作成します。
これは、AndroidStudioでBlank Activityなどを指定してプロジェクトを作成すると、MainActivityクラスに、作成されているものです。
Activityが作成され、オプションメニューを作成する段階になると、自動的にこのメソッドが実行され、メニューの組み込みが行われます。


■■■■MenuInflater

実際にメニュー項目を登録するには、MenuInflaterクラスを使います。
・Activityが持つgetMenuInflater()を使ってMenuInflaterオブジェクトの取得
MenuInflater menuInflater = getMenuInflater();
・メニューの生成
menuInflater.inflate(メニューのリソース,Menuのインスタンス);
・メニュー項目を追加するなら
Menuのインスタンス.add("aaa");


onCreateOptionsMenuメソッドの中で書くなら次のようになります。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    menu.add("aaa");
    return true;
}



res/menu/menu_main.xmlは以下のようになっています。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.yoko.myapplication.MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"       ※
        android:title="@string/action_settings"
        app:showAsAction="never" />       ※
</menu>


これで、メニューボタンを押すと下のように表示されます。
※menu_main.xmlのandroid:orderInCategoryはメニューの並びに関する値で、設定された値に従って、表示されます。
この値が小さければ最小の方に、大きければ最後の方に並べられます。

※menu_main.xmlのapp:showAsActionはアクションバーでのメニューの表示に関するものです。
アクションバーは画面の幅が広い時には重要なメニューをボタンとして表示します。
app:showAsActionはボタンとして表示するかどうかを指定するもので以下のような値が設定できますが、上では、neverとして、ボタンとして表示しないようにしています。
never 表示しない
ifRoom 表示できるならする
withText テキストも一緒に表示する
always 常に表示する
collapseActionView ActionViewを表示するときに使う


もし、alwaysとすると、次のようにSettingsというボタンがメニューボタンの横に表示されます。



■■■■メニューが選択された時に呼ばれるメソッド

表示されたメニューをユーザが選ぶとonOptionsItemSelectedというメソッドが呼び出されます。
引数選択されたMenuItemのインスタンスが渡されますので、それによって必要な処理を書きます。
下の例では、aaaというMenuItemが選択された時にトーストを表示しています。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if("aaa".equals(item.getTitle())) {
        Toast toast = Toast.makeText(this,"aaaが選択されました",Toast.LENGTH_SHORT);
        toast.show();
    }
    return super.onOptionsItemSelected(item);
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年6月22日水曜日

JARファイルに画像を入れる

目次へ



画像をプロジェクト内に保存し、JARファイルにすると画像が表示されません。 いろいろ試して、うまくいったので忘れないように書いておきます。
  • リソースフォルダの作成
  • クラスローダからリソースを取得
  • ECLIPSEの実行構成の設定
  • JARファイルの作成


■■■■リソースフォルダの作成

プロジェクトのフォルダの下にimageというフォルダを作成し、その中に画像ファイルを入れます。srcと同列になります。






■■■■クラスローダからリソースを取得

クラスローダを使って画像を取り入れているのが下のプログラムです。
public class ImageLabel01 extends JFrame {

 JLabel label = new JLabel();

 public ImageLabel01() {
  Image im=null;
  URL url=this.getClass().getClassLoader().
     getResource("image/stream.jpg");
  try {
   im=this.createImage((ImageProducer)url.getContent());
   label.setIcon(new ImageIcon(im));
  }catch(Exception ex){ }

  //ラベルをフレームに乗せフレームを表示
  getContentPane().add(label, BorderLayout.CENTER);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  this.setSize(350, 250);
  this.setVisible(true);
}
 public static void main(String[] args) {
  new ImageLabel01();
 }
}



■■■■ECLIPSEの実行構成の設定■■■■

メニューの[実行]から[実行構成]を選び、次のように設定をします。
[クラスパスのタブ]-[ユーザエントリをクリック]-[拡張ボタンを押す]
-[フォルダの追加にチェックを入れOK]
-[追加するフォルダとしてプロジェクトフォルダを選択しOK]
-[ユーザエントリにプロジェクト名-¥ が追加されていればOK(下の画像)]

これで、実行構成の設定が終わったのでこれで実行すればECLIPSE上で実行する分にはがぞうが表示されるはずです。

ユーザエントリにプロジェクト名-¥ が追加された様子



■■■■JARファイルの作成■■■■

あとは、次のように普通にJARファイルを作成すれば、JARファイルを実行したときにも画像が表示されるはずです。

[プロジェクトで右クリックしエクスポート]
-[Javaの中のJARファイルをクリックし次へボタン]
-[JARにしたいプロジェクトにチェックが入っていることを確認]
-[作成するJARファイルの出力先と名前を指定し次へボタン]
-[次の画面は何もせず次へ]
-[メインメソッドのあるクラスを指定し完了]


これでJARファイルができたらそれをダブルクリックすればちゃんと画像が出ます。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年4月4日月曜日

AndroidでMediaRecorder、MediaPlayerを使う

目次へ



声を録音したら、すぐにその声で返事をしてくれるアプリを作りたかったので、 まずは、録音と再生のしかたを、忘れないようにまとめておきます。
今後、これを変更して、「こんにちは」というと、ちょっと違う声で「こんにちは」と 同じ言葉をしゃべってくれるアプリをつくりたいのですが、まだ、いろいろわからないことだらけです。


■■■■音声の録音と再生■■■■

録音はMediaRecorder、再生はMediaPlayerを使います。
下のような画面が表示され、開始ボタンで録音開始、終了ボタンで録音終了、再生ボタンで今録音したものが再生されます。




import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private boolean isRecording = false;
    private TextView text;
    private MediaRecorder recorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

 //textは説明を表示しているTextViewです
        text = (TextView) findViewById(R.id.text1);
    }
    //-------- 開始ボタンを押したときの処理
    public void onStart(View view) {
        if (isRecording) return;

        //-------- 保存先 「内部ストレージ\test.3gp」ができる
        String path = Environment.getExternalStorageDirectory() + "/test.3gp";

        //-------- Recorder作成
        recorder = new MediaRecorder();
        //-------- オーディオソースをマイクとする
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //-------- ファイルのフォーマットを3GPPとする
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //-------- エンコーダをデフォルトとする
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        //-------- 出力先ファイル名指定
        recorder.setOutputFile(path);

        //-------- レコーディング
        try {
        //-------- 録音開始するには prepare,startを呼び出す
            recorder.prepare();
            recorder.start();
            isRecording = true;
            text.setText("isRecording");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //-------- 終了ボタンを押したときの処理
    public void onStop(View view) {
        if (!isRecording) {
            text.setText("録音中ではありません");
            return;
        }
        //-------- 終了には stop,reset,releaseを呼び出す
        recorder.stop();
        recorder.reset();
        recorder.release();
        isRecording = false;
        text.setText("録音終了");
    }
    //-------- 再生ボタンを押したときの処理
    public void onPlay(View view) {
        VoicePlayer player = new VoicePlayer();
        player.play();
    }
}





import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.widget.TextView;
import java.io.IOException;

public class VoicePlayer implements MediaPlayer.OnCompletionListener {
    private MediaPlayer player = new MediaPlayer();
    private String path;

    public VoicePlayer() {
        //-------- 再生が終わった時のリスナを設定
        player.setOnCompletionListener(this);
        //-------- 再生ボリューム 左、右を0.0f~1.0fで設定
        player.setVolume(1.0f, 1.0f);
        path = Environment.getExternalStorageDirectory() + "/test.3gp";
    }

    //-------- 再生
    public void play() {
        try {
            player.setDataSource(path);
            //-------- 再生するには、prepare、startを呼び出す
            player.prepare();
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //-------- 再生が終わった時に呼び出される
    public void onCompletion(MediaPlayer mp) {
        //-------- 終了したら、stop、releaseを呼び出す
        player.stop();
        player.release();
    }
}




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年3月21日月曜日

Androidのセンサーを使う

目次へ



Androidでは、いろいろなセンサーを使うことができますが、使い方が統一されているため、一つのセンサーの使い方を覚えれば別のセンサーも同じように使えます。
メインの画面が表示されている間センサーからデータを受け取るというつもりで次のようなステップを考えました。

メイン画面のonCreateで
 1.センサーマネージャ取得
 2.センサー取得
 3.リスナインスタンス作成

メイン画面のonResumeで
 4.センサーのリスナを登録する

メイン画面のonPauseで
 5.リスナの登録を解除する


■■■■センサーマネージャ取得■■■■

センサーを使うには、SensorManagerオブジェクトが必要です。
SensorManager sm;
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);



■■■■センサー取得■■■■

上で作成したSensorManagerオブジェクトを使って必要なセンサーを取得します。
デフォルトの加速度センサーを取り出すなら
Sensor accele;
accele = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

そのタイプのすべてのセンサーを取り出すなら
Listlist;
list = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);


センサータイプの定数
TYPE_ALL 全てのセンサー
TYPE_ACCELEROMETER 加速度センサー
TYPE_GRAVITY 重力センサー
TYPE_GYROSCOPE ジャイロセンサー
TYPE_LIGHT 光センサー
TYPE_LINEAR_ACCELERATION 単方向加速センサー
TYPE_MAGNETIC_FIELD 地磁気センサー
TYPE_PRESSURE 圧力センサー
TYPE_PROXIMITY 近接センサー
TYPE_ROTATION_VECTOR 回転ベクトルセンサー



■■■■リスナ作成■■■■

次にセンサーのリスナを作ります。
Activity自体をimplements SensorEventListenerとすれば簡単です。
class Xx implements SensorEventListener {
    //センサ精度が変更された時呼ばれる
    public void onAccuracyChanged(Sensor sensor, int accuracy) { }

    //センサ値が変更された時呼ばれる
    public void onSensorChanged(SensorEvent event) {
        event.values[0]~[2]にセンサーの値が格納されているので
        この値を使ってプログラムを書きます
    }
}



■■■■リスナ登録■■■■

メインのActivityが表示された時にセンサーからの値を使うのなら、onResumeメソッドで次のように、リスナを登録すればよいでしょう。
smはSensorManager、acceleはSensorです。
また、第3引数はイベントの発生間隔で次のような値が指定できます。
SENSOR_DELAY_FASTEST 最も短い間隔
SENSOR_DELAY_GAME ゲームに最適。FASTESTの次に短い間隔
SENSOR_DELAY_UI user interfaceに最適。GAMEの次に短い間隔
SENSOR_DELAY_NORMAL スクリーン方向の変化などに最適。最もゆっくり
数字 ミリ秒単位で自分で設定


sm.registerListener(リスナ,accele, SensorManager.SENSOR_DELAY_NORMAL); 



■■■■リスナ登録解除■■■■

メインのActivityが隠れた時に解除するなら、onPauseメソッドで次のように登録を解除すればよいと思います。
smはSensorManagerです。
sm.unregisterListener(リスナ);






にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2016年3月15日火曜日

Androidで音声認識

目次へ



Androidでは、日本語の音声認識を、簡単に使うことができます。
Intentを使い音声認識のためのActivityを起動し、認識された文字列を元のActivityで受け取るのですが、自分で書くのは、ほんの少しです。


■■■■音声認識■■■■

下のプログラムでは「開始」と書いたボタンを押すと、 RecognizerIntent.ACTION_RECOGNIZE_SPEECHを指定して、Intentのインスタンスを作成します。
このオブジェクトにputExtraメソッドを使って、いくつか情報を追加し、startActivityForResultメソッドを使って音声認識用Acyivityを起動します。
マイクの画面(これが音声認識用Activity)が表示され、話した内容を認識すると、元の画面に戻り、認識した内容をTextViewに表示します。
現在「Hello World」と表示している場所がTextViewです。

  

音声認識のActivityを表示するための部分が下のプログラムの(1)から(6)です
認識された文字列を使っているのが、(7)から
  1. まず音声認識用のActivityを指定しIntentのインスタンスを作ります。

  2. RecognizerIntent.EXTRA_LANGUAGE_MODELでは、
    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
    RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH
    のどちらかを指定しますが、LANGUAGE_MODEL_WEB_SEARCHは、Web検索の際に使います。

  3. RecognizerIntent.EXTRA_PROMPTで指定するのは、マイクの上に表示される文字列です。

  4. EXTRA_MAX_RESULTSは、認識した候補のうち、最大いくつ返すかを指定します。
    これを1にして、どうぞといった場合「どうぞ」という文字列がひとつ返ってきましたが、
    これを指定しなかった場合には「どうぞドウゾzozodmsoどうゾ」という文字列が返ってきました。

  5. Activityを起動します。
    この時リクエストコードとして、適当な数字を渡すと、戻り値を受け取る場合に、このリクエストコードで起動したActivityからの戻り値であるかを確認できます。

  6. エミュレータで実行した場合には、音声認識機能が無いため、catchが必要です。


  7. onActivityResultは(5)のstartActivityForResultでスタートしたActivityが終了した時に呼び出されるメソッドです。

  8. (5)で自分が発行したIntentであるか判断するのが、REQUEST_CODEのチェックです。

  9. 音声認識された文字列の候補をArrayListとして受け取り、全てを表示しています。
    もし、(4)で指定したように、候補を一つだけ受け取るようにしているのなら、for文など使わずに、results.get(0)を表示するだけです。





import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends Activity implements View.OnClickListener {

    private static final int REQUEST_CODE = 100;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
    }

    //button1をタップすると音声認識を行うActivityを起動する
    public void onClick(View v) {
        try {
            //--- (1)
            Intent intent = new Intent
                           (RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            //--- (2)
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
                            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            //--- (3)
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
                              "どうぞお話しください");
            //--- (4)
            intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
            //--- (5)
            startActivityForResult(intent, REQUEST_CODE);
        //--- (6)
        } catch(ActivityNotFoundException e) {        
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }


    //--- (7)
    public void onActivityResult(int requestCode,int resultCode,Intent data){
        //--- (8)
        if(requestCode==REQUEST_CODE && resultCode==RESULT_OK) {
            String str = "";

            //--- (9)
            ArrayList results = 
                data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            for(String s : results) {
                str += s;
            }
            TextView text = (TextView)findViewById(R.id.text1);
            text.setText(str);
        }
    }
}




■■■■音声認識によるWeb検索■■■■

もしも、音声認識後、その文字列ですぐにWeb検索を行う場合には、上のプログラムの(1)(2)を次のようにし、(7)のメソッドは削除します。
これだけで、音声認識後、Web検索へと進みます。



           //--- (1)
            Intent intent = new Intent
                           (RecognizerIntent.ACTION_WEB_SEARCH);
            //--- (2)
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
                            RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村