2011年6月30日木曜日

[Android] 自分の電話番号を知るコード

知っているようで案外知らない。Android端末での自局番号取得方法。

  1. String mNumber = null;  
  2. TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  3.   
  4. // 取得  
  5. mNumber = telManager.getLine1Number();  

たったこれだけのコードでとれます。

ありがちですが、テキストボックスに入力してもらった電話番号と比べてみて判断してみたりする。

  1. EditText inputNumberText;   
  2. inputNumberText = (EditText) findViewById(R.id.inputText1);  
  3. String inputNumber = inputNumberText.getText().toString();  
  4. if(mNumber.equals(inputNumber)) {  
  5.  // とおるがいい  
  6.  Toast.makeText(this"とおるがいい", Toast.LENGTH_SHORT).show();  
  7.  Intent intent = new Intent(this,FourthActivity.class);  
  8.  startActivity(intent);  
  9.  finish();  
  10.    
  11. else {  
  12.  // 帰れ!!  
  13.  Toast.makeText(this"まーちがーえたーねー。じゃ☆", Toast.LENGTH_SHORT).show();  
  14.  finish();  
  15. }  

Android端末ってそんなに通話しないからなぁ・・・。
というわけで案外電話番号が設定からみれることは知られてなかったりする。

2011年6月27日月曜日

[Android] 端末のSIMの状況を取得する

先日、上司に向けてアプリをつくったのですが、
かるーくスルーされたので「きー!!(怒)」となっています。

ま、そんな愚痴はともかく、
今日はSIMの有無を確認するコードを。

SIMの状況を取得するにはTelephonyManagerを使用します。
getSystemServiceでシステムの状況を取得すれば、判定することができます。

まずは取得。

  1. int mStatus = 0;  
  2.   
  3. TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  4. mStatus = telManager.getSimState();  

これでInt型で取得することができるので、あとは状況に応じて処理をふっていきます。

  1. switch(mStatus) {  
  2.  case TelephonyManager.SIM_STATE_UNKNOWN: // SIM不明  
  3.      Toast.makeText(this"まぁ、許す", Toast.LENGTH_SHORT).show();  
  4.      break;  
  5.  case TelephonyManager.SIM_STATE_ABSENT: // SIMなし  
  6.         Toast.makeText(this"ゆるさない", Toast.LENGTH_SHORT).show();  
  7.         break;  
  8.  case TelephonyManager.SIM_STATE_PIN_REQUIRED: // PIN待ち  
  9.         Toast.makeText(this"まぁ、いいか", Toast.LENGTH_SHORT).show();  
  10.         break;  
  11.  case TelephonyManager.SIM_STATE_PUK_REQUIRED: // PUK待ち  
  12.         Toast.makeText(this"うーん、悩む", Toast.LENGTH_SHORT).show();  
  13.         break;  
  14.  case TelephonyManager.SIM_STATE_NETWORK_LOCKED:  // ロック  
  15.      Toast.makeText(this"エクセレント!!", Toast.LENGTH_SHORT).show();  
  16.         break;  
  17.  case TelephonyManager.SIM_STATE_READY:  // 在り  
  18.         Toast.makeText(this"とおるがいい", Toast.LENGTH_SHORT).show();  
  19.         break;  
  20.  default:  
  21.      Toast.makeText(this"わかんないから許す", Toast.LENGTH_SHORT).show();  
  22.         break;  
  23.            
  24. }  

たったこれだけです。
まぁ、一応例外処理としてdefaultをいれております。
上のコードではSIMがある場合のみ次の処理へいくように・・・というためにかいたのですが、
分かりやすくするためにToastでメッセージを表示するだけにしておきました。

特にpermissionの設定もいらないので
適当にごにょごにょするには良いのではないかと思います。
設定値を勝手に変更すれば、エアな感じにもできるんじゃないのかな?と勝手に憶測。

といっても、現物SIMがないと結局は通信なんぞできないはず(なのかな?)なので
あんまり使うことはないかもですけど。

2011年6月22日水曜日

[Android] バックライトを常時ONにしてみる(ただしアプリ起動中のみ)

いつのまにか設定からバックライトの常時Onがきえているので
なんとなくアプリで実装してみる。

本当はずーっととどめておきたかったのですが、アプリのみでしか
できないので「あーうー」となっています。

というわけで本日のコード。

  1. Window windows = getWindow();       
  2.      String timeout = Settings.System.getString(this.getContentResolver(), "screen_off_timeout");  
  3.   
  4.      if(timeout.equals("-1")) {  
  5.       // 常時  
  6.         
  7.       // その他に変更  
  8.       windows.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  9.         
  10.         
  11.      } else {  
  12.       // その他  
  13.         
  14.       // 常時に変更  
  15.       windows.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  16.      }  

View単位でやるならこっち。

  1. View LayoutView = (LinearLayout) findViewById(R.id.LayoutView);  
  2.        
  3.      if(LayoutView.getKeepScreenOn()) {  
  4.       // 常時  
  5.         
  6.       // その他に変更  
  7.       LayoutView.setKeepScreenOn(false);  
  8.      } else {  
  9.       // その他  
  10.         
  11.       // 常時に変更  
  12.       LayoutView.setKeepScreenOn(true);  
  13.      }  

解説したいですが、なんだか「がー」な気分なのでまた。

[Android] 端末のUSBDriverのまとめ

まとめてみる。

REGZA Phone(T-01C)
T-01C USBドライバ

MEDIAS(N-04C)
ADB用USBドライバー(アンドロイド開発者向け)

Xperia
端末の中にあるDriver.zip

LYNX 3D(SH-03C)
ドコモスマートフォン LYNX 3D(SH-03C)


USBドライバ(ADB)

※両方必要

Galaxy S
SAMSUNG Kies,PC Sync


とりあえずここまで。

[Android] MEDIAS(N-04C)の充電方法について

先日MEDIAS(N-04C)を使用しているとき、
付属でないUSBケーブルを使用したら充電ができませんでした。

どうやら付属のUSBケーブルじゃないと充電できないみたい。
相性問題なのでしょうか。

検証してくれているページはこちら。
MEDIAS お前もか・・・

いやー、もうどうにかしてほしいですね。

2011年6月17日金曜日

[Android] 縦書きを実装したったー(といってもまだ1行)

青空文庫とかをみていておもったのですが、まー、横文字の小説は読みづらい。
というわけなので、さくっとつくってみました。
(といいながら、案外時間がかかってしまった)
「縦書き」の実装です。

こんな感じになります。
























ありがちな発想としては
1.縦長のテキストビューを1つ作る
2.1文字ごとに改行をいれる。
というものなんですが、そんなアホなことをしてしまっては日本語本来の味が失われるということで、
あえて別の実装をしてみました。

どういう実装なのかというのを書きます。

1.文字数を取得
2.画面を半分に割る
3.縦幅を文字数で割る

こうするとわりと均等な感じで文字が配置できます。
文字がふえてくるとまた実装もかわってくるのですが、
今回は固定文字サイズと固定行数(1行)で行きたいとおもいます。

さ、まずは

0.ステータスバーとタイトルバーを消しさる。
・・・いきなり0番。

  1. // タイトルバーの削除    
  2. requestWindowFeature(Window.FEATURE_NO_TITLE);    
  3.           
  4. // ステータスバー削除    
  5. getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  

0.1.画面を用意する
前準備多いですな。
今回はViewを手作りします。

  1. class CharDrawView extends View {  
  2.     
  3.  public CharDrawView(Context context) {  
  4.   super(context);  
  5.   setFocusable(true);  
  6.   this.context = context;  
  7.      
  8.  }  
  9. }  

コンストラクタあたりまでかいてみた。

さて、次はonDrawの実装です。
  1. protected void onDraw(Canvas canvas) {  
  2.  super.onDraw(canvas);  
  3.   
  4.  // 1.文字数を取得する  
  5.  int length = mMessage.length();  
  6.            
  7.  // 2.画面を縦に割る  
  8.  int height = canvas.getHeight() - 40;  
  9.  int width = canvas.getWidth() / 2 - 20;  
  10.    
  11.  // 背景色  
  12.  canvas.drawColor(Color.WHITE);  
  13.            
  14.  // 文字色  
  15.  Paint paint = new Paint();  
  16.  paint.setAntiAlias(true);  
  17.    
  18.  paint.setColor(Color.BLUE);  
  19.  paint.setTextSize(40);  
  20.    
  21.  // 描画領域外(ここからスタート)  
  22.  int oneHeight = 40;   
  23.            
  24.  // 3.1文字の高さを取得する  
  25.  int charSize = charHeight(length,height);  
  26.            
  27.  for(int i= 0;i < length;i++) {  
  28.   String oneChar = getOneMessage(i);  
  29.             
  30.      canvas.drawText(oneChar, width, oneHeight + oneCharHeight(charSize,40), paint);  
  31.             
  32.      // 一文字の高さを足す  
  33.          oneHeight += charSize;  
  34.   
  35.      }  
  36.            
  37.            
  38. }  
  39.     
  40. /* 
  41.  * 1文字の高さ(余白なし) 
  42.  */  
  43. public int charHeight(int length,int height) {  
  44.  return height / length;  
  45. }  
  46.   
  47. /* 
  48.  * 中心点から描く 
  49.  */  
  50. public int oneCharHeight(int one,int charSize) {  
  51.  return (one / 2) + (charSize /2);  
  52. }  
  53.     
  54. /* 
  55.  * 1文字取得 
  56.  */  
  57. public String getOneMessage(int index) {  
  58.  return String.valueOf(mMessage.charAt(index));  
  59. }  
まとめちゃった。 だいたいこんな感じで。 最後にViewをはめこんで終了です。
  1. View drawView = new CharDrawView(this);  
  2. setContentView(drawView);  

えっと、なんでこういう実装にしたかというと、
本来日本語(漢字のほうがただしいかな?)って縦書き文化なんですよ。
升目に分けて整列して書くものなので、
Viewを四画にわって配置していくのが適切じゃないかな、と。

もちろん、文字数が増えたり、行数が増えたらまたかわってくるのですが、
それはまたの機会にでも。

2011年6月5日日曜日

[Scala] UIっぽいものをつくってみたんだぜ。

ScalaはJavaのものが使えるので
GUIプログラミングにはSwingかしら?とおもって
使ったことも無いSwingにチャレンジしてみた。
って、会社にScalaの本をわすれた・・・。
ので、今日はとってもJavaチックになるはず。

Swingについては基本的にはこのページを元に。
Swingを使ってみよう

で、今回は
チェックボックス3つとボタン1つ。
まー、フォームをつくるのが理想なんですが、
とりあえずUIを。

構造としては、
1.まずはフレームを作る。

  1. val frame = new JFrame()  
  2. frame setSize new Dimension (640480)  
  3. frame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

もうなんかJavaっぽい。

2.つづいて、フレームからパネルを取得する

  1. val contentpane =  frame getContentPane();  

3.パネルをつくる

  1. val panel = new JPanel()  

4.部品をつくってパネルに追加していく
  1. val hogeCheck1 = new JCheckBox("ほげ1",true)  
  2. val hogeCheck2 = new JCheckBox("ほげ2",false)  
  3. val hogeCheck3 = new JCheckBox("ほげ3",false)  
  4. panel add(hogeCheck1)  
  5. panel add(hogeCheck2)  
  6. panel add(hogeCheck3)  
  7.   
  8. val button = new JButton("実行")  
  9. button setPreferredSize(new Dimension(200100))  
  10. panel add(button)  

5.つくったパネルをフレームにいれて表示
  1. contentpane add(panel, BorderLayout.CENTER);  
  2.   
  3. frame setVisible true  

これで実行すると
チェックボックスが3つとボタンが1つ表示されます。

書き方がとってもJavaっぽいんだけど、まー、いいか。

2011年6月2日木曜日

[Scala]ScalaでPostgreSQLを操作する - ファイル出力編

さきほどのPersonデータを取得したのですが、
やはりテキストなりなんなりに落とさなくてはならなくなったので
とりあえずCSVに吐き出す処理をくっつけました。

ぶっちゃけ(キムタク)、さきほどのプログラムの
Console.scalaに以下を入れるだけですが。

  1. // ファイル処理  
  2. val file = new File("hogehoge.txt")  
  3. val bw = new BufferedWriter(new FileWriter(file))  
  4. using(new PrintWriter(bw)) { pw =>  
  5.  for(i <- 0 to list.length -1){  
  6.   val str = list(i).name + "," + list(i).mailAdderss  
  7.   pw.println(str)  
  8.  }  
  9. }  

はい、えーっと、Control.scalaを使いまわしています。
ちなみに私はEclipseなんで、何も指定していないとプロジェクトの直下にhogehoge.txtができます。
(マイコンから見るとできてる)
便宜上似非CSVにしてみました。

[Scala]ScalaでPostgreSQLを操作する - ごにょごにょ編

さて、環境もできたのでごにょごにょしましょう。
今回はJDBCを使用してPostgreSQLを操作します。
通信とかDB周りってぜーんぜん詳しくないので(笑)
ツッコミどころがおおくてごめんね☆

さて、まずは自作関数を。
Scalaプログラミング入門という本を使って書いてみます。

DBをいじる際に重要になるのはやっぱりOPEN/CLOSEなので
そのあたりを軽くしてみるのでこんなものを。

Control.scala
  1. object Control {  
  2.   def using[A <: {def close(): Unit}, B](param: A)(f: A => B): B =  
  3.     try {  
  4.       f(param)  
  5.     } finally {  
  6.       param.close()  
  7.     }  
  8.   
  9.     import scala.collection.mutable.ListBuffer  
  10.     def bmap[T](test: => Boolean)(block: => T): List[T] = {  
  11.       val ret = new ListBuffer[T]  
  12.       while(test) ret += block  
  13.       ret.toList  
  14.     }  
  15. }  

教科書のまるぱくり。いえいえ、写経ですから。
上のコードではusingという関数をつくってますね。
これは読んだらとじてくれます。finallyわすれをしないためですね。

つづいての関数はSQLで取得したアイテムをListに落としてくれるためのものです。

自作関数はできたので、使用例を。


Person.scala
  1. case class Person(name:String,mailaddress:String)  
  2.   
  3. object Person {  
  4.   import Control._  
  5.   import java.sql._  
  6.     
  7.   def selecter(conn : Connection) : List[Person] =   
  8.     using(conn.createStatement) {st =>  
  9.       using(st.executeQuery("select name, mailaddress from PersonDB")) { rs =>  
  10.         bmap(rs.next) {  
  11.           new connectionDB(rs.getString("name"), rs.getString("mailaddress"))  
  12.         }  
  13.       }  
  14.     }   
  15. }  

すごーくすっきりなものになりました。
ここでは実際のSQL文を書いております。
そして取得したフィールドをListにして返却してますね。


さらにこれを使用します。
教科書はここから書いてなかったのでここからは素人的な書き方になります。

Console.scala
  1. object Console {  
  2.   import connectionDB._  
  3.   import java.sql.DriverManager  
  4.     
  5.   def main(args: Array[String]): Unit = {  
  6.     Class.forName("org.postgresql.Driver")  
  7.     val db = DriverManager.getConnection(  
  8.    "jdbc:postgresql://{ホスト名}/{データベース名}",  
  9.    "{アカウント}",  
  10.    "{パスワード}")  
  11.  val list = selecter(db)  
  12.  db.close  
  13.       
  14.  list.foreach(i => println(i))  
  15.    
  16.   }  
  17.   
  18. }  

取得したリストをコンソールに表示するだけの簡単なお仕事。
なんですが。ものすごーく初心者のような書き方になっています。
もっと腕をあげたいですね。

実行すると
Person(hoge,hogehoge@hoge.com)
というような出力をされますよ。

[Scala]ScalaでPostgreSQLを操作する - 導入編

まずはPostgreSQLの環境を作ります。
http://www.postgresql.jp/PostgreSQL

windows7はここからダウンロードしてインストーラーを実行
パスワードを聞かれたら自分がすきなものをいれましょう。これはローカルDBのパスワードになります。
postgresを推奨。
あとでわからなくなるので。

それから、今回はScalaでJDBCドライバを使用するので
http://jdbc.postgresql.org/download.html
ここから最新Verをとってくる

Current Versionでかまいません。

jarをおとしたら適当な箇所に保存しておきます。

続いてEclipseを起動して
Scalaのプロジェクトを作成。

プロジェクトを右クリックして「properties」を開きます。
「Java Build Path」を選択して「Libraries」を選択します。

「Add External JARs...」から先ほど保存したjarを選択します。

これで準備完了。
あとはだらだらコードを書きましょう。

2011年6月1日水曜日

[Android]Widgetをエレガントにする

さて、昨日はWidget(ウィジェット)を配置してみました。
これですね。






















小さい!!(笑)
格好悪いので本来の形にもどしてみましょう。






















本来の形になりました。
ちなみにこれは
画像ファイルの大元をいじっているわけではなくて、dipをいじっているだけですが。
dipってなんぞ?
density-independent pixels の略です。直訳すると「密度に依存しないピクセル」なんだそうです。
このあたりの詳しいことは @yanzm さんという人が綺麗にまとめてくださっているのでどうぞ。

Y.A.M の 雑記帳
Android Dimension 単位

さて、dipの意味はわかりましたでしょうか?
続けます。

Androidの場合は1マスは縦横で74dipx74dipとなりますが、
実際に描画できる範囲は-2dipをひいたものになります。
すなわち、72dipx72dipということになりますね。

前回ではそれを踏まえたうえで xmlフォルダ内のappwidget.xmlの一部(縦横サイズ指定箇所)を

  1. android:minHeight="72dip"  
  2.     android:minWidth="72dip"  

としていました。
これだと1マス分しか指定していないので先ほどの不幸が訪れるわけです。
では、3マスにするにはどうすればいいのか?

先ほどの74dipという数字を使って算出します。
公式はこちら。

(74 * 描画マス分)- 2

今回は3マスなので

(74dip * 3マス) - 2dip = 220dip

となります。
縦は1マスなのでそのままを使用します。
というわけで

  1. android:minHeight="72dip"  
  2.     android:minWidth="220dip"  

とします。
これで実行すると























こんなようにいい感じになります。
さらにウィジェットにはサイズを指定することでもっとエレガントになる方法があるのですが、
やっぱり長くなるので気が向いたときに書きますな。