2013/06/23

Nexus7を外部モニタ化

Nexus7をPCの外部モニタにできないかちっと調べてみた。

幾つかアプリがあるようだが以下はPC側にも専用アプリを入れなといけないようなのでパス。

後は普通にVNCクライアントが複数あるので無料の物だけ試してみた。

androidVNC が縦画面未対応な以外は普通のVNC Viewerなのでどれも似たりよったり。

VNCをセカンドモニタとして使う方法はこちらを参照してください。-> 解像度の違うモニタで VNC 表示させる

こんな感じになりました。(PCは11インチです)

画面が小さいだけで解像度は高いので表示は破綻しません。

無線LAN接続でOfficeの編集作業にストレスは感じません。
さすがに動画はカクカクです。
一応、タップは左クリックとして反応します。


しかし、問題点が1つ...
画面下部のナビゲーションバーを消せるアプリが無く解像度が中途半端になります。

  • 横画面: 1280x736
  • 縦画面: 800x1205

PC側ではこんな解像度は設定できません。
横画面は 1280x720 が有ったのでまあ良いのですが縦画面で収まるのは 768x1024 となってしまい、いまいちです。

Nexus7に依存する問題なので今後、各アプリが対応するかは不明な感じです。 => 自力対応しましたNexus7を外部モニタ化 (2)


2013/03/24

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 出ないかなぁ


2013/01/26

Nexus7にキーボードとマウスを付けてみた。

Nexus7を開発に使っているとコンソールを使う事が多いのだがソフトウエアキーボードだと ls -l とか打つだけでも結構つらいw

というわけでキーボードとマイクロB接続のUSBハブを購入してみた。

その結果こういう事に。


もはや、タブレットの必然性が全く有りませんが入力は全然楽になりました。
マウスを繋ぐとちゃんとカーソルが現れてタッチと併用できます。画面に指紋を付けたく無いとき便利です。

このキーボードは Bluetooth ですが普通のUSBキーボードでも認識します。
っぽいキーボードが欲しかったので合えて買いました。

一見、アップル純正に見えますが中国製のパチ物で作りはチープです。



完全な英語配列である事だけが取りえなのですが一つ落し穴が...



[DEL]キーの位置に意味不明のキーがあります。
PCに繋いだときはブラウザ起動のホットキーになりますがAndroidの時は何も起こりません。
DEL は [Fn]+[BS] に割り振られているのですが利用頻度を考えると全く意味不明です。
これさえ無ければ値段相応の良いキーボードだったんですが (;_;)

追記:Macでは [Fn]+[BS] で DEL になるのが標準なのですね。



その他:
ハブに USBメモリを差せば読み込みはできます。書き込みはrootを取らないと出来ないようです。
商売の都合でしょうがちょっとがっかりです。

USBハブは必ず外部電源付きの物を買いましょう。Nexus7を電源に使っているとあっと言う間に電池が無くなります。




2013/01/20

eclipseにNexus7を繋げてみた

Nexus7を買ったので eclipse と繋げてみたのだが軽くハマったのでメモ。

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側にいきなりアプリが起動してくる。



以上。


プロフィール
20年勤めた会社がリーマンショックで消滅、紆余曲折を経て現在はフリーランスのSE。 失業をきっかけにこのブログを始める。

サイト内検索

登録
RSS/2.0

カテゴリ

最近の投稿【nexus7】

リンク

アーカイブ