Android

You are currently browsing the archive for the Android category.

BluetoothのSPPプロファイルでファイル(の中身)を送信するアプリケーション

SPPでBTデバイスにデータを送る実験をしていたが、
端末のコンソールに入力したテキストを送信するアプリはあっても、ファイルの中身を
送信するアプリがなかったので作成。

BTソケットのOutputStreamに、FileInputStreamで読み込んだファイルをWriteしている。

ダウンロード先↓

Android app on Google Play

サムネイル

概要


前回作成したAir for Android用 Alertダイアログをベースに、質問ダイアログを作成しました。

Alertダイアログでは、Yes,No,Cancelからの選択でしたが、今回作成したダイアログでは任意の文字列をボタンに割り当てられるようにしました。ボタンの数も自由に変更できます。(画面に表示可能な範囲で)
 


仕様


AlertDialogからのチョイ変です。

  1. static関数 CustomQuestionDialog.show()で表示
  2. ダイアログが閉じたときに、CloseEventをディスパッチ
  3. CloseEvent.detailに、選択結果(選択されたボタンのインデックス)を格納

としました。

 

ダウンロード


  ・ライブラリファイル(.swcファイル)
  ・プロジェクトファイル(.zip)
  ・ASDoc(APIリファレンス)

 

使い方


1. ライブラリファイル(CustomQuestionDialog.swc)を、プロジェクトのlibフォルダにおきます。




 

2.確認ダイアログを表示したいときに、CustomQuestionDialog.show()関数を呼びます。

1
2
3
4
5
6
7
CustomQuestionDialog..show(
                   this,
                   "メッセージ",
                   "タイトル",
                   ["選択肢1","選択肢2","選択肢3"]
                   onCloseQuestionDialog
                );

引数として、

  1. ダイアログの親のDisplayObject
  2. 表示するメッセージ
  3. ダイアログのタイトル
  4. ボタンに表示するテキスト(選択肢)の配列
  5. ダイアログが閉じたときに呼ばれる関数 (CloseEventのEventListenner, デフォルト: null)

を指定します。

 

3.確認ダイアログが閉じたときに呼ばれる関数(CloseEventのEventListener)を作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/** Dialogが閉じたときに呼ばれる関数 */
private function onCloseQuestionDialog
        (event:CloseEvent):void        
{
    /* ボタンの押下結果を取得する */
    var result:int = event.detail;
           
    if(result == 0)
    {
        /* 0番目のボタンを選択したとき */
        trace(0);
    }
    else if(result == 1)
    {
        /* 1番目のボタンを選択したとき */
        trace(1);
    }
    else if(result == 2)
    {
        /* 2番目のボタンを選択したとき */
        trace(2);
    }
    else if(result == -1)
    {
        /* xボタンでキャンセルしたとき */
        trace(-1);
    }
    else
    {
        /* 未到達コード */
        trace("その他");
    }
}

CloseEventのdetailに、ダイアログでのボタンの押下結果が含まれます。

  ・0番目(1番上のボタン)が選ばれたときは、1
  ・1番目(上から2番目のボタン)が選ばれたときは、2
  ・………
  ・キャンセル(xボタン)が選ばれたときは、-1
 
が格納されます。

概要


モバイルプロジェクトでは、mx.controls.Alert(確認ダイアログ)が使用できませんでした。
(Flex 4.5.1)
そこでライブラリとして自作することにしました。
TitleWindowがモバイルでも使えたのでこれベースとして作成。

 


仕様


Alertと挙動を合わせるために、
 
  1. static関数のshow()で表示
  2. ダイアログが閉じたときに、CloseEventをディスパッチ
  3. CloseEvent.detailに、選択結果を格納
 
という仕様にしました。
 
 
ダウンロード


  ・ ライブラリファイル(.swcファイル)
  ・ プロジェクトファイル(.zip)
  ・ ASDoc(APIリファレンス)
 
 
使い方


1. ライブラリファイル(AlertDialog.swc)を、プロジェクトのlibフォルダにおきます



 

2.確認ダイアログを表示したいときに、AlertDialog.show()関数を呼びます。

1
2
3
4
5
6
7
AlertDialog.show(
                   this,
                   "メッセージ",
                   "タイトル",
                   AlertDialog.YES_NO_DIALOG,
                   onCloseAlertDialog
                );

引数として、

  1. ダイアログの親のDisplayObject
  2. 表示するメッセージ
  3. ダイアログのタイトル
  4. ダイアログの種類(デフォルト: YES/NOダイアログ)
  5. ダイアログが閉じたときに呼ばれる関数 (CloseEventのEventListenner, デフォルト: null)

を指定します。

ダイアログの種類 (第4引数)は、

  ・YES/NOダイアログ (AlertDialog.YES_NO_DIALOG)
  ・YES/NO/Cancelダイアログ (AlertDialog.YES_NO_CANCEL_DIALOG)
  ・OKダイアログ (AlertDialog.OK_DIALOG)
  ・OK/CANCELダイアログ (AlertDialog.OK_CANCEL_DIALOG)

から選択できます。

 

3.確認ダイアログが閉じたときに呼ばれる関数(CloseEventのEventListener)を作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** 3. AlertDialogが閉じたときに呼ばれる関数 */
private function onCloseAlertDialog
                     (event:CloseEvent):void
{
    /* 選択結果 */
    var result:int = event.detail;
               
    if(result == AlertDialog.YES)
    {
        /* yesを選択したとき */     
    }
    else if(result == AlertDialog.NO)
    {
        /* noを選択したとき */
    }
}

CloseEventのdetailに、確認ダイアログでのボタンの押下結果が含まれます。

  ・Yesを選択したときは、AlertDialog.YES
  ・Noを選択したときは、AlertDialog.NO
  ・OKを選択したときは、AlertDialog.OK
  ・Cancelを選択したときは、AlertDialog.Cancel
 
が格納されます。

既存のFileReferenceだとsdcard以下のファイルしか選択できなかったので
ファイル選択するためのライブラリを作成しました。(以前アプリでつくったものをライブラリ化)

<ファイル>

FileChooser.zip (プロジェクトファイルの一式)
FileChooser.swc (ライブラリファイル)

<使い方>

1. ライブラリファイル(FileChooser.swc)を、プロジェクトのlibフォルダにおきます。

 

2. ファイル選択をしたいときに、FileChooserクラスのインスタンスを生成します。
引数として、現在のViewのインスタンス、最初に表示したいディレクトリのパスを指定します。
次に、作成したインスタンスのshowFileChooser()メソッドを呼び出します。

1
2
3
4
5
/* FileChooser(view, 最初のパス) */
var fc:FileChooser = new FileChooser(view,"/");

/* ファイル選択ビューの表示 */
fc.showFileChooser();

 

3. showFileChooser()を呼び出すと、ビューがファイル選択のビューに切り替わります。

 

4. リストから、ファイルを選択すると元のビューに戻ります。選択したファイルのパスは、
FileChooser.selectedPathに格納されます。

元のビューのViewNavigatorEvent.Activateイベントなどで、拾うとよいかと思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * ビューがアクティブになったとき
 *
 * @param event ViewNavigatorEventのインスタンス
 */

private function onActivate
     (event:ViewNavigatorEvent):void
{
    /* ファイルパスがセットされているときは、
        その値をフォームにセットする */

    if(FileChooser.selectedPath != null)
    {
          filePath = FileChooser.selectedPath;
    }
}

※static変数への格納はしたくなかったけど、パスの保持が
どうしてもうまくできなかったのでstatic変数に格納することにしました。

素材は、www.blog.spoongraphics.co.uk
のものを使用させてもらいました。

Air for Android を試したので簡単なアプリをつくって、公開してみた。
MD5生成は、以前作成したライブラリを使用。

 

最初は、Flash Builder Burritoで作っていたが、最近になって4.5の試用版が公開されたので、再インストール&プロジェクトをインポートした。

モバイルに関してはHeroから結構仕様が変わったらしく、見た目が変わったのとエラーが発生。(デスクトップ&webアプリは問題なし。)

調べたら以下のリンク先に、変更のあったAPIが詳しく載っていたので、これを参考に修正。

Updating Flash Builder Burrito Applications to Flash Builder 4.5

 

<アプリ作成に際して、気がついたこと>

1. ファイル選択のためのFileRefereceneクラスは、Androidだとsdcard以下のファイルしか選択できなかった。そのため、ファイル選択部分も自作する必要があった。

2. ByteArrayクラスのwriteMultiByteに、euc-jp,iso-2022-jpを指定してもうまく動作しなかった。デスクトップ上でのデバッグでは正常に動作。AndroidのAIRが対応してないのだろうか。

 

以下が作成したアプリのキャプチャ。

MD5GeneratorForAndroid