Nexus7を外部モニタ化
Nexus7をPCの外部モニタにできないかちっと調べてみた。
幾つかアプリがあるようだが以下はPC側にも専用アプリを入れなといけないようなのでパス。
後は普通にVNCクライアントが複数あるので無料の物だけ試してみた。
androidVNC が縦画面未対応な以外は普通のVNC Viewerなのでどれも似たりよったり。
VNCをセカンドモニタとして使う方法はこちらを参照してください。-> 解像度の違うモニタで VNC 表示させる
こんな感じになりました。(PCは11インチです)
画面が小さいだけで解像度は高いので表示は破綻しません。
無線LAN接続でOfficeの編集作業にストレスは感じません。
さすがに動画はカクカクです。
一応、タップは左クリックとして反応します。
しかし、問題点が1つ...
画面下部のナビゲーションバーを消せるアプリが無く解像度が中途半端になります。
- 横画面: 1280x736
- 縦画面: 800x1205
PC側ではこんな解像度は設定できません。
横画面は 1280x720 が有ったのでまあ良いのですが縦画面で収まるのは 768x1024
となってしまい、いまいちです。
Nexus7に依存する問題なので今後、各アプリが対応するかは不明な感じです。 => 自力対応しましたNexus7を外部モニタ化 (2)
AndroidでWebServerを動かしてみた。
Android でも普通に ServerSocket が使えると言う話を小耳に挟んだので調べて見ると既に jetty が普通に動いているらしい。
これをインストールして試してもあんまり面白く無いので 自前で簡易WebServerを作ってみた。
ソース:
package org.kotemaru.android.webserver; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.widget.Toast; public class MainActivity extends Activity { private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { new AcceptThread(8080).start(); } catch (IOException e) { postMessage(e.getMessage()); Log.e("boot",e.getMessage()); } } void postMessage(final String msg) { handler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } }); } private class AcceptThread extends Thread { private ServerSocket ssock; public AcceptThread(int port) throws IOException { this.ssock = new ServerSocket(port); } @Override public void run() { try { postMessage("Server start"); while (true) { Socket sock = ssock.accept(); new ConnectThread(sock).start(); } } catch (IOException e) { postMessage(e.getMessage()); Log.e("AcceptThread",e.getMessage()); } } } private class ConnectThread extends Thread { private Socket sock; public ConnectThread(Socket sock) { this.sock = sock; } @Override public void run() { try { Log.i("ConnectThread","From "+sock.getRemoteSocketAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream())); BufferedOutputStream out = new BufferedOutputStream(sock.getOutputStream()); String reqLine = in.readLine(); String line = in.readLine(); while (!line.isEmpty()) { line = in.readLine(); // ヘッダーは無視 (^^; } String[] parts = reqLine.split(" "); String path = parts[1].replaceFirst("[?].*$", ""); File docroot = new File(Environment.getExternalStorageDirectory(),"docroot"); out.write("HTTP/1.0 200 OK\r\n".getBytes()); out.write(("Content-type: "+getCType(path)+"\r\n\r\n").getBytes()); InputStream fin = new FileInputStream(new File(docroot,path)); try { byte[] buff = new byte[1024]; int n; while ((n=fin.read(buff))>0) { out.write(buff,0,n); } out.flush(); out.close(); } finally { fin.close(); } } catch (IOException e) { postMessage(e.getMessage()); Log.e("ConnectThread",e.getMessage()); } finally { try { sock.close(); } catch (IOException e) { postMessage(e.getMessage()); Log.e("ConnectThread",e.getMessage()); } } } private String getCType(String path) { path = path.toLowerCase(); if (path.endsWith(".html")) return "text/html"; if (path.endsWith(".jpg")) return "image/jpeg"; if (path.endsWith(".png")) return "image/png"; if (path.endsWith(".gif")) return "image/gif"; if (path.endsWith(".js")) return "application/javascript"; if (path.endsWith(".css")) return "text/css"; return "unknown"; } } }
起動が Activity から行われている事以外はほんとにただの WebServer の実装。
DocumentRoot は内部ストレージの「docroot/」としたので コンテンツは Nexus7 をUSBで繋いでPCからコピペすればOK。
Wifi設定で Nexus7 のIPアドレスを調べてブラウザから直接URLを叩くとちゃんと表示された!
尚、AndroidManifest.xml には以下の設定が必要。
<uses-permission android:name="android.permission.INTERNET" />
但し、これを設定しても port=80 のサーバはパーミッションエラーとなる。 たぶん、root権が必要。
...
モバイル用途の端末だとサーバ化はあんまり意味無いっていうかセキュリティ上の問題がありそうだけど、 スティック型Androidの使い道は色々広がりそう。
安定動作しそうな スティック型Android 出ないかなぁ
Nexus7にキーボードとマウスを付けてみた。
というわけでキーボードとマイクロB接続のUSBハブを購入してみた。
その結果こういう事に。
もはや、タブレットの必然性が全く有りませんが入力は全然楽になりました。
マウスを繋ぐとちゃんとカーソルが現れてタッチと併用できます。画面に指紋を付けたく無いとき便利です。
このキーボードは Bluetooth ですが普通のUSBキーボードでも認識します。
っぽいキーボードが欲しかったので合えて買いました。
一見、アップル純正に見えますが中国製のパチ物で作りはチープです。
完全な英語配列である事だけが取りえなのですが一つ落し穴が...
eclipseにNexus7を繋げてみた
Nexus7はWin7に繋げるとストレージとして認識される。
但し、eclipse からはそのままだと認識されない。ドライバが必要らしい。
Android実機が eclipse から認識されてアプリを実行するまでの手順。
1. Nexus7をデバッグモードにする。
4.1.2 から[開発者向けオプション]が隠しになったらしく[設定]->[タブレット情報]の[ビルド番号]を7回タップする必要がある。
情報元
ついでに開発元不明のアプリを有効にする。
2. ドライバのインストール
開発用にSDKのドライバをインストールする必要が有る。
オプションなのでまず SDK Manager から「Google USB Driver」をインストール。
デバイスマネージャからNexus7のドライバを更新。
Android-SDK のフォルダを指定する。
OSにデバイスが認識される。
3. eclipse から実行
DDMSのパースペクティブを開くとNexus7が認識されている。
アプリを実行するとNexus7側にいきなりアプリが起動してくる。
以上。