2012年3月4日日曜日

Zoom

CameraのZoomです。 Zoomに対応しているかどうかの確認です。
Camera.Parameters param = camera.getParameters();
Log.d("camera", "isZoomSupported = " + param.isZoomSupported ());
スムーズなZoomに対応しているかどうかの確認です。NexusOneは、対応していませんでした。
Camera.Parameters param = camera.getParameters();
Log.d("camera", "isSmoothZoomSupported = " + param.isSmoothZoomSupported ());
Zoomの設定可能なリストを表示します。
Camera.Parameters param = camera.getParameters();
List ZoomRatislist = param.getZoomRatios ();
for (int i=0;i < ZoomRatislist.size();i++) {
 Log.d("camera", "list " + i + " = " + ZoomRatislist.get(i));
}
Nexus Oneのリストの結果です。 0-12までが設定可能で、倍率は、1倍から2倍までのようです。
0 = 100
1 = 104
2 = 112
3 = 117
4 = 125
5 = 131
6 = 141
7 = 148
8 = 158
9 = 166
10 = 178
11 = 186
12 = 200
Zoomの設定をします。
Camera.Parameters param = camera.getParameters();
param.setZoom(zoom);
camera.setParameters(param);
ソースコード置き場

2012年2月26日日曜日

Send Mail

Intentを使用したMailを送信するアプリです。
送信するメールアドレスを用意します。
String to = new String("xxxxx@gmail.com");
メールの題名を用意します。
String title = new String("Hello");
メールの本文を用意します。
String text = new String("test");
Intentを生成してアクションを設定します。
Intent in = new Intent();
in.setAction(Intent.ACTION_SENDTO);
メールアドレスを設定します。
in.setData(Uri.parse("mailto:" + to));
メールの題名を設定します。
in.putExtra(Intent.EXTRA_SUBJECT, title);
メールの本文を設定します。
in.putExtra(Intent.EXTRA_TEXT, text);
メールを送信します。
startActivity(in);
ソースコードは ここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

mp3ファイルの再生

mp3の音楽ファイルを再生します。
MediaPlayerのクラスを用意します。
MediaPlayer mP = new MediaPlayer();
mp3のファイルを設定します。
mP.setDataSource("/sdcard/music/sample.mp3");
prepare() と start() を呼びます。
mP.prepare();
mP.start();
prepare() と setDataSource() は、 try / catchで括る必要があります。
ソースコードは ここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年2月19日日曜日

SpeechRecognizer

音声認識のクラス SpeechRecognizer classを確認しました。
インスタンスを生成する方法は、 createSpeechRecognizer(Context) をコールします。
SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
認識結果を受信するclassを作ります。
class MyRecognitionListener implements RecognitionListener {

 @Override
 public void onBeginningOfSpeech() {
  Log.d("Speech", "onBeginningOfSpeech");
 }

 @Override
 public void onBufferReceived(byte[] buffer) {
  Log.d("Speech", "onBufferReceived");
 }

 @Override
 public void onEndOfSpeech() {
  Log.d("Speech", "onEndOfSpeech");
 }

 @Override
 public void onError(int error) {
  Log.d("Speech", "onError");
 }

 @Override
 public void onEvent(int eventType, Bundle params) {
  Log.d("Speech", "onEvent");
 }

 @Override
 public void onPartialResults(Bundle partialResults) {
  Log.d("Speech", "onPartialResults");
 }

 @Override
 public void onReadyForSpeech(Bundle params) {
  Log.d("Speech", "onReadyForSpeech");
 }
 

 @Override
 public void onResults(Bundle results) {
  Log.d("Speech", "onResults");
  ArrayList strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
  for (int i = 0; i < strlist.size();i++ ) {
   Log.d("Speech", "result=" + strlist.get(i));
  }
 }

 @Override
 public void onRmsChanged(float rmsdB) {
  Log.d("Speech", "onRmsChanged");
 }
 
}
その中で一番重要なのは、onReuslt() の関数です。resultsの中に認識結果を格納しています。
public void onResults(Bundle results) {
 Log.d("Speech", "onResults");
 ArrayList strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
 for (int i = 0; i < strlist.size();i++ ) {
  Log.d("Speech", "result=" + strlist.get(i));
 }
}
先ほどのListerクラスを生成します。
MyRecognitionListener listener = new MyRecognitionListener();
Listenerクラスを設定します。
sr.setRecognitionListener(listener);
音声認識を開始します。
sr.startListening(RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()));
onResults()は、 1度だけコールされるようです。 "english"と言ってみました。
その結果です。
result=リング
result=english
result=ring
result=イング
result=ing
認識されました。
android.permission.RECORD_AUDIOのパーミッションの設定とネットワークが有効になっていることが必要です。

ソースコードはここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年2月9日木曜日

Camera Lock API

最近、NexusOneが2.3.6にバージョンアップされました。
以前、動いていたCamera ClassのLock() APIを使用するサンプルプログラムが動かなくなりました。
いろいろ試してみたところ、MediaRecorderでsetVideoSize()を設定することで動作するようになりました。
以下のプログラムは、NexusOne, Xperia rayで動作確認をしました。

_mediarecorder = new MediaRecorder();
_mediarecorder.setCamera(_camera);
_mediarecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
_mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
_mediarecorder.setVideoSize(640, 480);//Add
_mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
ソースコードはここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年2月5日日曜日

get sdcard path

SD card のpath調べました。
File file = Environment.getExternalStorageDirectory();
Log.d("test", file.getPath());
結果をLogcatで表示しました。
/mnt/sdcard
xperia rayで、shellから"cd /sdcard"としても"/mnt/sdcard/"に移動しました。なんで?
source code is here.
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年2月1日水曜日

getNetworkInfo

getNetworkInfo()の関数を使いました。

最初に、ConnectivityManager classを取得します。
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo クラスを取得します。例として TYPE_MOBILE の情報を取得しました。
NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
Wifiと3Gが使用できる状態で、setNetworkPrefernce()を使用して、ネットワークの使用優先度を変更しようと主ましたが、変更されませんでした。
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
If you use setNetworkPreference(), you must add CHANGE_NETWORK_STATE feature.
ソースコードはここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年1月31日火曜日

getAllNetworkInfo

getAllNetworkInfo() APIを確認しました。思ったより、ネットワークを持っていました。
すべてのネットワークの情報を取得します。
NetworkInfo[] ni = cm.getAllNetworkInfo();
ネットワークの情報を表示します。
Log.d("net", "getDetailedState = " + dt);
Log.d("net", "getExtraInfo = " + ni[i].getExtraInfo());
Log.d("net", "getReason = " + ni[i].getReason());

NetworkInfo.State st = ni[i].getState();

Log.d("net", "getState = " + st);
Log.d("net", "getSubtype = " + ni[i].getSubtype());
Log.d("net", "getSubtypeName = " + ni[i].getSubtypeName());
Log.d("net", "getType = " + ni[i].getType());
Log.d("net", "getTypeName = " + ni[i].getTypeName());
Log.d("net", "isAvailable = " + ni[i].isAvailable());
Log.d("net", "isConnected = " + ni[i].isConnected());
Log.d("net", "isConnectedOrConnecting  = " + ni[i].isConnectedOrConnecting ());
Log.d("net", "isFailover   = " + ni[i].isFailover  ());
Log.d("net", "isRoaming   = " + ni[i].isRoaming  ());
これは、自分の携帯電話の結果です。
getDetailedState = DISCONNECTED
getExtraInfo = dm.jplat.net
getReason = dataDisabled
getState = DISCONNECTED
getSubtype = 0
getSubtypeName = UNKNOWN
getType = 0
getTypeName = mobile
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = false
isRoaming   = false
getDetailedState = DISCONNECTED
getExtraInfo = null
getReason = null
getState = DISCONNECTED
getSubtype = 0
getSubtypeName = 
getType = 1
getTypeName = WIFI
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = true
isRoaming   = false
getDetailedState = IDLE
getExtraInfo = null
getReason = null
getState = UNKNOWN
getSubtype = 0
getSubtypeName = UNKNOWN
getType = 2
getTypeName = mobile_mms
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = false
isRoaming   = false
getDetailedState = IDLE
getExtraInfo = null
getReason = null
getState = UNKNOWN
getSubtype = 0
getSubtypeName = UNKNOWN
getType = 3
getTypeName = mobile_supl
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = false
isRoaming   = false
getDetailedState = IDLE
getExtraInfo = null
getReason = null
getState = UNKNOWN
getSubtype = 0
getSubtypeName = UNKNOWN
getType = 4
getTypeName = mobile_dun
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = false
isRoaming   = false
getDetailedState = IDLE
getExtraInfo = null
getReason = null
getState = UNKNOWN
getSubtype = 0
getSubtypeName = UNKNOWN
getType = 5
getTypeName = mobile_hipri
isAvailable = false
isConnected = false
isConnectedOrConnecting  = false
isFailover   = false
isRoaming   = false



ソースコードは ここです

Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年1月30日月曜日

ConnectivityManager

ConnectivityManager クラスを使用します。

現在、利用しているネットワークを取得して、その情報を表示します。もし利用できるネットワークがない場合はExceptionga発生しました。
ConnectivityManager cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();

ネットワークの情報を表示します。
NetworkInfo.DetailedState dt = ni.getDetailedState();
Log.d("net", "getDetailedState = " + dt);
Log.d("net", "getExtraInfo = " + ni.getExtraInfo());
Log.d("net", "getReason = " + ni.getReason());
NetworkInfo.State st = ni.getState();
Log.d("net", "getState = " + st);
Log.d("net", "getSubtype = " + ni.getSubtype());
Log.d("net", "getSubtypeName = " + ni.getSubtypeName());
Log.d("net", "getType = " + ni.getType());
Log.d("net", "getTypeName = " + ni.getTypeName());
Log.d("net", "isAvailable = " + ni.isAvailable());
Log.d("net", "isConnected = " + ni.isConnected());
Log.d("net", "isConnectedOrConnecting  = " + ni.isConnectedOrConnecting ());
Log.d("net", "isFailover   = " + ni.isFailover  ());
Log.d("net", "isRoaming   = " + ni.isRoaming  ());


これは3Gが有効だった場合の結果です。
 getDetailedState = CONNECTED
 getExtraInfo = dm.jplat.net
 getReason = apnSwitched
 getState = CONNECTED
 getSubtype = 0
 getSubtypeName = UNKNOWN
 getType = 0
 getTypeName = mobile
 isAvailable = false
 isConnected = true
 isConnectedOrConnecting  = true
 isFailover   = false
 isRoaming   = false
Wifiが有効な場合の結果です。
 getDetailedState = CONNECTED
 getExtraInfo = null
 getReason = null
 getState = CONNECTED
 getSubtype = 0
 getSubtypeName = 
 getType = 1
 getTypeName = WIFI
 isAvailable = true
 isConnected = true
 isConnectedOrConnecting  = true
 isFailover   = false
 isRoaming   = false

ソースコードはここです。
Androidに関する課題や、ほしいアプリがあればメールやTwitterで連絡ください。試してみます。

2012年1月5日木曜日

HttpClient

Androidで、HTTPのライブラリを使用して、Yahoo JapanのPageを取得します。
Android端末側が無線LANの設定が済んでおり、インターネットに接続できることが前提です。
DefaultHttpClient クラスを作成し、urlにYahoo Japanのトップページを設定します。 HttpのGetのメッセージも作成します。
String url = "http://www.yahoo.co.jp";
HttpClient hc = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
Httpを実行します。インターネットのYahooへアクセスします。
取得したYahoo JapanのPageは、HttpResponseクラスに格納されます。
HttpResponse res;
res = hc.execute(get);
Httpの応答が200 OKの場合、Httpのコンテンツを取得します。
コンテンツは、Yahoo JapanのPageのHTML形式で記述されたPageになります。
if (res.getStatusLine().getStatusCode() == 200) {
 //It is ok.
 InputStream input = res.getEntity().getContent();
コンテンツをLogCatに出力します。
BufferedReader rBuffer = new BufferedReader(new InputStreamReader(input, "UTF-8"));
String readLine;

try {
 while((readLine = rBuffer.readLine()) != null) {
  Log.d("HttpClientActivity", readLine);

Yahoo JapanのPageを取得することができました。

ソースコードはこちらです。.

Socket

Socket クラスを使用して、ネットワークの送受信を確認します。 自分のblogのPageのデータを受信します。

Socketを生成します。
String host ="playandworkandroid.blogspot.com"; 
sk = new Socket(host, 80);
送信データと受信データを入れるバッファを用意します。
rBuffer = new BufferedReader(new InputStreamReader(sk.getInputStream()));
wBuffer = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
データを受信する命令を含む、送信データを作成します。flush()することで、送信されます。
wBuffer.write("GET / HTTP/1.1\n");
wBuffer.write("host : " + host + "\n");
wBuffer.write("\n");
wBuffer.flush();
Socketにデータが受信されたら、LogCatに表示します。
while((readLine = rBuffer.readLine()) != null) {
 Log.d("HttpGetActivity", readLine);
}
これで、Blogのデータが受信できたと思います。
ソースコードはこちらです。.

2012年1月3日火曜日

ActivityInstrumentationTestCase2 GridView ClickItem

GridViewに設定するonClickItemListener() API と、
GridView上に設置したImageViewのonClickListener() APIは、
両方設定されて場合でも、どちらかだけしか有効にならないと思います。
今回は、GridViewのonClickItemListener()のテストをします。
テストは、ActivityInstrumentationTestCase2クラスを使用します。

最初に、テストされる側のActivityを説明します。GridViewを使用して、
SDCardのビデオクリップを表示する部分は、前に説明しているので
そちらを参照してください。

OnItemClickListenerをGridViewに設定します。
OnItemClickListenerは、positionの情報が含まれます。

mGridView.setOnItemClickListener(new OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView arg0, View arg1, int position,
   long id) {
  Log.d("GridViewActivity", "onItemClick " + position + " " + id);
  
 }
});

次に、テストする側のコードを説明します。ActivityInstrumentationTestCase2を使用します。
positionを指定して、performItemClick()をUIThreadからコールします。

GridView and postion. must be UIThread
mActivity.runOnUiThread(new Runnable() {
 public void run() {
  
  Log.d("GridViewActivity", "performItemClick 3");
  gridview.performItemClick(gridview, 3, 0);
  
  
 }
});
mInstrumentation.waitForIdleSync();

Logcatを使用して、テストする側からpoerformItemClick()をコールして、OnItemClick()がコールされていることを確認します。.
performItemClick 3
onItemClick 3 0
   テストされる側のソースコードです。.
  テストする側のソースコードです。.

ActivityInstrumentationTestCase2 GridView Select View

AndroidのActivityInstrumentationTestCase2 Classを
使用したJUnitのテストコードの説明です。
GridViewで作られたViewのテストをするようにします。

最初にテストされる側のActivityの説明をします。
前に、GridViewでSDCardのビデオクリップを表示する
サンプルの説明をしたので、基本的な部分はそちら
参照してください。

GridViewに、OnClickListener()を設定します。
OnClickListener()では、どの画像(ImageView)がClickされているか
わからないので、コンストラクタでpositionを引数とした
OnClickListenerのサブクラスを作ります。


class OnClickListenerDetectPosition implements OnClickListener {
 private int mPosition = 0;
 public OnClickListenerDetectPosition(int position ) {
  mPosition = position;
 }
 @Override
 public void onClick(View v) {
  Log.d("GridViewActivity", "onClick = " + mPosition);
 }
 
}
OnClickListenerDetectPositionをGridViewに設定します。
OnClickListener onclikclistener = new OnClickListenerDetectPosition(position);
imageView.setOnClickListener(onclikclistener);

次に、テストする側のクラスを説明します。
ActivityInstrumentationTestCase2のサブクラスを作成します。
UIThread上からsetPosition()を使用してpositionを変更します。
mActivity.runOnUiThread(new Runnable() {
 public void run() {
  Log.d("GridViewActivity", "setSelection 2");
  gridview.setSelection(2);
 }
});
mInstrumentation.waitForIdleSync();

次に、getSelectedView()で、選択されているViewを取り出し、performClickを使用して、
クリックする動作をテストします。
mActivity.runOnUiThread(new Runnable() {
 public void run() {
  
  Log.d("GridViewActivity", "getSelectedItemPosition = " + gridview.getSelectedItemPosition ());
  
  Log.d("GridViewActivity", "getSelectedView");
  ImageView imageview = (ImageView)gridview.getSelectedView();
  Log.d("GridViewActivity", "performClick");
  imageview.performClick();
 }
});
Logcatを使用して動作を確認します。テストする側からperformClickすることで、テストされる側のOnClickListenerDetectPosition クラスが動作できたことがわかります。
setSelection 2
getSelectedItemPosition = 2
onClick = 2
   テストされる側のソースコードです。.
  テストする側のソースコードです。.