Tosainu Lab

MVNOなSIMを入手した結果Androidアプリを書くことに

みょん.

タイトル通り, 今までのWiMAXの代わりとしてBIGLOBEのデータ通信3G/LTESIMを契約しました.
いろいろ迷いましたが, 数年前のように外出先で数十GBのデータをやり取りする機会も無くなりましたし大丈夫かなと思っています.

手続きをしたのは7月末でしたが, 旅行とお盆休み, そして書類の不備等があって時間がかかりましたが, 何とか夏休み中に届いてよかったなぁって感じです.
sim

とりあえず

何気にLTE対応nanoSIMにしました(LTE, nanoSIM共に対応端末持ってないくせに).
まぁいずれLTE対応端末が欲しいなぁと思っているのでこうしました. ちなみに同社には200yen/monthの3G専用SIM等もあります.

ということで, 別で購入していたSIMアダプタを使いXperiaRayに挿してみたところ問題なく認識しました.
simad
rai

でもSoftBank SIMも使えないと困るよね

しかし, 僕は諸事情で別でSoftBankの銀SIMを使っています. 電話なんて滅多に掛けませんし掛かってきませんが, 無いなら無いで面倒なので仕方がないです.

そういえばタッチパネルが逝ったArcがあったなぁ… ん???
Arcをモバイルルータ化すればよくね???

ってことで.

こんな感じで問題なくテザリングできました. 便利ですね.
tether

速度を実際に測ったわけではありませんが, 思ったよりは快適な感じです.
自宅無線LANと大差ないかもしれない(´・_・`)

ちなみに, ROMはLegacyXperiaのCM10.2を利用しました.
軽量だということからCM7.2も検討したのですが, Androidが標準で搭載してきたData usageが使いたかったのと, 最近のアプリ対応状況などからこうしました.
また, バックグラウンドでの通信を最小限にしたいことなどからGoogle Playを始めとするgappsも入れず, ネットワーク関係のプリインを片っ端から無効化してこんな感じにしました.
arc

でもでもタッチパネル逝った携帯をどうやって使うのさ?

とはいえキーボードとマウスがないと操作できないルーターは不便すぎますね.
ってことでXperia2011の物理ボタンを有効活用できる感じのテザリングON/OFFアプリがないかな〜と探したのですがいい感じのものは見当たらず…

仕方がないので簡単なAndroidアプリを書くことにしました.

Tosainu / ToggleTether — Bitbucket
toggleTether-release.apk

起動するとWifiテザリングが有効か無効かを確認し, 有効だったら無効に, 無効だったら有効にするだけのアプリです.
Homeアプリの設定で “メニューボタン長押し” でこれが起動するようにすると幸せになれました.

また, タッチパネルが逝ってるせいで画面ロックも解除できないので横のカメラボタンで解除できるように設定したほか, ホームボタンでData usageが表示されるように設定しました.

初Androidアプリでハマったこととか

IDE使いたくない!

これからガツガツAndroidアプリ書くわけでもないのに, EclipseInstallBattleだとか言われるような(多分)巨大なIDEを入れるのは何ともめんどくさいです. (今の流行はAndroidStudioかな?)

とはいえAndroidアプリ開発に外部のIDEは必須ではなく, コマンドラインから一発でプロジェクトが作成できるようです.

$ android create project -n ProjectName \
    -t TargetID \
    -p ./ProjectDirectory \
    -k packageName \
    -a DefaultActivityName

TargetIDにはAPI Levelを入れるのかな〜と思ったのですがそうではなく, $ android list targetsで表示される中から選ぶみたいです.

アプリのビルドにはantコマンドを使います. makeみたいな感じですね. Arch Linuxではapache-antパッケージです.

// デバッグ用
$ ant debug

// リリース用
$ ant release

変数宣言時に必ず初期化しないといけない?

こんな感じのコードを書くと…

import android.widget.Toast;

String s;

s = "みょーん";

Toast.makeText(this, s, Toast.LENGTH_LONG).show();

怒られます.

-compile:
    [javac] Compiling 1 source file to /hoge/fuga/bin/classes
    [javac] /hoge/fuga/src/info/myon/toggleTether/Main.java:7: error: variable s might not have been initialized
    [javac]     Toast.makeText(this, s, Toast.LENGTH_LONG).show();
    [javac]                          ^
    [javac] 1 error

BUILD FAILED

String s = "みょーん";みたいに宣言時に初期化しないといけないみたい(たぶん)

Activity Lifecycle

Activityには幾つかの状態があって, それぞれの状態に合わせてonCreate(Bundle savedInstanceState)だとかonResume()だとかのメソッドが呼び出されるらしい.

最初, 作成されたテンプレートに合わせてonCreate()にいろいろ命令を書いていたのだが, アプリの最初の起動ではうまく動作するものの2回目以降はうまく動作しなかった.

それもそのはず, onCreate()Activityが開始された時に呼び出されるメソッドである.
そして, Androidアプリは大抵の場合閉じてもすぐに終了されないので, 2回目以降はonCreate()が呼び出されること無く最後に起動した時の状態が復元されてしまう.

ということで, Activityが再開した時にも呼び出されるonResume()メソッドをオーバーライドしてこのように記述した.

public class Main extends Activity {
  @Override
  public void onResume() {
    // なんか処理

    this.finish();
  }
}

権限の追加

AndroidManifest.xmlに,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="info.myon.toggleTether"
  android:versionCode="1"
  android:versionName="1.0">

  <!-- こんな感じに -->
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
  <uses-permission android:name="android.permission.WRITE_SETTINGS" />

参考にしたサイト等

わかりやすい解説をありがとうございました.
AndroidアプリどころかJavaすら書いたことない僕ですがなんとかなりました.