Androidのアプリ開発関連のブログ

SSHクライアント配信開始

制作していたSSHクライアント配信開始した。


いつもどおり一旦公開してからAdMobのID作ってから更新で、
Android-x86とGenymotionだけで動かして開発して、実機にはGoogle Play経由で入れて初確認したのだが、
Androidのバージョンが原因か?テスト環境では問題ないのに、キー入力すると常に即死する症状がw

というわけで確認したが、
AndroidManifestで起動時にキーボードを表示して、ActivityのオーバーライドしたdispatchKeyEventでキー入力を処理となっていたが、死ぬ。
logcatしてもわからなかったんで、試しにdispatchKeyEventをonKeyDownに変えてみたが、同じく死ぬ。
物理キーボード繋いでみても、そっちでも死ぬ。
で、tryしてみたら、結局死ぬw
そもそもdispatchKeyEventまで到達していないぽい。
EditTextなしでAndroidManifestでソフトキーボードを出してキーイベントを処理していたが、多分ダメなバージョンがあるんだと思うがヤメた方が良いぽい。

で、android:visibility="gone" で非表示であってもフォーカスさえあれば問題ない様だったので、
AndroidManifestでの起動時キーボード表示はヤメて、onCreateで表示されてないEditTextにフォーカスを当ててソフトキーボードを表示するようにした。
一応死ななくなったが、 キーボードが有効なままフォーカスが外れたら死ぬことになるね・・・一応ならないように考えたつもりだが・・・

さらに、入力で即死することはなくなったが、
全てのキーがdispatchKeyEventで取得できるつもりが、Enterとか一部のキー以外はdispatchKeyEventに来ない。
EditTextにフォーカスを当ててるからView.setOnKeyListener() も試してみたが、来ない。
フォーカスを当てている EditTextには入力されるので、Enterが押された場合はEditTextの内容を確認して必要なら中身送るようにした。
もうちょっと改良したほうが良いかも。

そこまでとAdMobの変更して2回目の配信したのだが、
作業中にスクリーン・タッチでのカーソルキー送信が反応が悪いことに気づいてたのだが対応忘れてたので、それを修正して再度更新した。
タッチの方は最初TextViewと重なってる箇所でダメなのかと思ったが、
View.setOnTouchListener()で取得できるMotionEventの座標(getX()とgetY())がテストの際に絶対座標と判断したのだが、(広告がなくてサイズが同一だったから)
実はMotionEventの座標はView上の座標だった。
それが原因で座標がズレてた。

あと、サーバー側から切断された場合にキー入力された場合などに何らかの方法でわかるようにしようかと思ったが、ちょっと難しい感じだったのでヤメた。
良い感じの方法思いついた感じなんで次回対応するかも。


次以降の制作の構想もあるのだが、
localのshellを使うターミナルなら今回のコードをほぼ流用できると思うんで、Javaでの外部コマンド実行の方法をちょい調べたが、
簡単にできそうな気がしたんで、やはり次回はそれになりそう。
だが今作の流用になるし、タッチ操作でのCtrlキー送信機能とかつけて完成度上げてからのほうが良いかな。って感じ。