2014年10月2日木曜日

Visual Studio ブレークポイントで停止して、三行先から実行

Visual Studioを使っていて、たまに、ブレークポイントをかけて、三行先から再開というような事をマクロで自動実行出来ないかなと。
出来るんですね。
ブレークポイントをかけるときに、トレースポイントの挿入とするか、ブレークポイントを右クリックし、「ヒット時」を選択。
メッセージを表示するはOFF、マクロを実行するをON、続けて実行するをON。
マクロは別のツールで定義して。
本当は先にマクロを定義しておくべきですが、
以下のような。
Sub skipprogramline3()
DTE.AvtiveDocument.Selection.LineDown(False,3)
DTE.ExecuteCommand("Debug.ssetNextStatement")
End Sub
三行下がって再開します。

2014年9月26日金曜日

msysGit 競合した場合の措置

まず、適当に

 taroフォルダを作成、そこにgittext.txtを作成し、中身は
image
とした。

image
ここgit Init Hereする。

git GUIを呼び出して、
image
コミットして登録する。

リモートリポジトリを作成、taroの兄弟で、REPO、taro.gitを作ってそこを共有させるためのgitリポジトリとする。

taroでgit GUIを呼んで、リモート、追加、REPO/taroを作って、書込んで初期化してやる。

この状態は、、、

GIT_TEST
                    taro
                                 gittext.txt
                                 .git   (ローカルリポジトリ)
     REPO
                                 taro
                                            .git(共有リポジトリ)

ここで、新しい環境、hanakoをREPO/taroから作成する。

imageで作成する。

GIT_TEST
                    taro
                                 gittext.txt
                                 .git   (ローカルリポジトリ)
     REPO
                                 taro
                                            .git(共有リポジトリ)
                   hanako
                                 gittext.txt
                                 .git   (ローカルリポジトリ)

現時点ではhanakoのgittext.txtとtaroのgittext.txtは同じです。

それぞれのgittext.txtを別々に編集します。

hanakoが先に共有リポジトリに登録。Push、OK

taroが次に登録しようとすると、、、、

Pushing to ../REPO/taro
To ../REPO/taro
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '../REPO/taro'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

というエラーが出る。まず、fetchしてマージしなさいということ。

メニューのリモート、取得元、REPOを選択して、fetchする。

REPOから新しい変更をフェッチしています。というメッセージで緑色のベルトで成功と出た。

マージ、ローカルマージ、トラッキングブランチを選択して、マージを押す。

Auto-merging gittest.txt
CONFLICT (content): Merge conflict in gittest.txt
Automatic merge failed; fix conflicts and then commit the result.

ま、失敗したというわけ、で、画面は
image
エラーになってる。コンフリクトを解決するには、gittest.txtを開いて、テキストを修正する。例えば
image
<<<<<と======と>>>>>を外した。

このままgit GUIで何をやっても前に進めなくなるので、

git GUIは閉じて、

フォルダをエクスプローラで開いて、右クリックして

git Add all file nowを選択する。(競合を解決したと解釈)

同じく、gitGUIを開くと、、、、あらま不思議、gittest.txtがステージングされているじゃありませんか。

このまま、コミットします。git Histroyで状態を見ます。

image

正しくMergeされていますね。競合したのでマージコミットが
入りました。

このままでは意味がありません。pushしておいてください。

hanakoでもfetchとマージを行って最新状態にしておいてください。

これを書いた理由は、、、、
   競合を解決した後のマージの継続方法を知りたかったのです。どのように解決するかを覚えておきたかったからです。正しいファイルに更新した後に、エクスプローラーの Add all file ですね。その後、git GUIを呼び出して、コミット、Pushするということで。

有り難うございました。

2014年9月14日日曜日

android usbserial

   

usbserialの作り方

if (manager == null)
{
    manager = (UsbManager) getSystemService(this.USB_SERVICE);
}
if (manager != null)
    usb = UsbSerialProber.findFirstDevice(manager);
if (usb == null)
{
    Toast toast = Toast.makeText(this, "USB接続がありません", Toast.LENGTH_LONG);
    mainMessage("USB接続がありません");
    toast.setGravity(Gravity.TOP, 0, 50);
    toast.show();
    return;
}

if (usb != null)
{
    try{
        usb.open();
        usb.setParameters(MONI_BPS, usb.DATABITS_8, usb.STOPBITS_1, usb.PARITY_ODD);
        start_read_thread(); // シリアル通信を読むスレッドを起動
    }
    catch(IOException e){
        e.printStackTrace();
    }
}

読み取りスレッド

static int nMaxR = 0;
    static private byte buf[] = new byte[1024];
    public void start_read_thread(){
          new Thread(new Runnable(){
            public void run(){
              try{
                while(!bUsbClose){
                  int num = usb.read(buf, 256);
                  for (int i = 0; i < num; i++)
                  {
                      if (mWcnt >= mRecBuf.capacity())
                          mWcnt = 0;
                      mRecBuf.put(mWcnt, buf[i]);
                      mWcnt++;
                      if (mWcnt == mRcnt)
                      {
                          mOver++;
                          Log.d(TAG,"mOver = "+ String.format("%d", mOver));
                      }
                  }
                  if (num > nMaxR)
                      nMaxR = num;
                  if (num == 0)
                      Thread.sleep(10);
                }
              }
              catch(IOException e){
                e.printStackTrace();
              }
              catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          }).start();
        }

2014年9月13日土曜日

Eclipse Android 無関係なプロジェクトを閉じる

Android Private Librariesにある android-support-v7-appcompat.jar はライブラリなのだけれどもこれはプロジェクトインポートしている。AndroidDependenciesにも表示されている。

しかし、Eclipiseは『無関係なプロジェクトを閉じる』を行うとappcompat_v7_5.jarのあるプロジェクトを閉じるので、コンパイルエラーが発生することになるようだ。

このappcompat_v7はプロジェクトインポートなので不便極まりない。何とかならないのかな。

以下に代表的なエラーを示す。

ActionBarActivity <==これが未定義になってしまう。

#import android.support.v7.app.xxxxxx   <==これらが全てエラーになる。

もともとはEclipseのプロジェクトの自動生成機能で作ったのに、一旦全てのプロジェクトを閉じて、アプリケーションプロジェクトを開くとエラーのオンパレードになってしまうなんて。。

修正方法は、
  Android Private Libraries
     ここにv7が現れていないなら、、、、
  自分のWorkSpaceのandroid_v7_X を順に開いてみれば良い。
  どれかを開くと、上記にv7が現れるので、そのプロジェクトを
  閉じないようにすればエラーは無くなるが、、、不便極まりない。

Min SDKを4.0以降にすればv7は要らない

MinSDKが3.2以下だとv7が必要のようだ。

2014年9月7日日曜日

Androidのメモリ アロケート量

知らないことが多いんだな-、と反省。

Dalvik VMはメモリサイズ量の管理が特殊なのかな。大容量をAllocateできない。JNI内でAllocateすると大量のメモリを確保できる。プロセスが終われば解放されるのであれば、それで良いのではないかと思う。

DalvikVM(JVM)は一定量以下のJAVAで利用するメモリを操作するのに向いていて、GCも効率よく出来ているようだが、メガバイト単位の領域を確保するようにはなっていないようだ。メガバイトを確保すると、他のアプリに迷惑がかかるだろうが、業務で利用することを考えたら、そんなことは関係無い。速く動く方が良いに決まっているし、機種も限定される。

JNIはVMの外側でアロケートできるようで、VMが管理している全メモリ量くらいまでアロケート可能なようだ。VMはBitmapをこの外部メモリにアロケートするようだが、Bitmap以外でもアロケートして欲しいものだ。

しかし、Javaの処理速度から考えれば、現在のメモリ管理量は妥当なのかもしれない。

16MBのデータファイルを5個開こうとしている事に無理があるのかな。それでも80MBなんだが。メインメモリは2GBもあるのに。

C言語(JNI側)

for (int i = 0; i < 5; i++)
  K[i].pDataBuffer = (char *)malloc(1024 * 1024 * 16);

同じバッファをJava側で確保しようとしたら、3個目でOutOfMemoryした。

変な考えを起こさないで最初からC言語で確保すれば良かった。この領域、プログラム終了まで解放しないので、問題ないみたい。最初、JNIで確保するとリークするのかと思っていた。そんなことは無い。JNIは単にNativeなだけで直接Linuxを呼び出しているだけのようだ。

android 端末のgoogle drive の不思議

nexus7でgoogleDriveを使っている。

abc.XXXXzというファイルと130716A.XXXXzというファイルがある。

abcはタップしても『ファイル形式abc.XXXXzは非対応です』と表示される。130716Aはアプリが起動される。この違いは何だろうか。拡張子が同じなのに片方だけがアプリ起動されるのは何故だろう。

-----------------------------

検証1:アプリからそれぞれのファイルを開けば、正常に開くことができる。

検証2:グーグルドライブ上のアイコンが異なる。abcは横棒3本の下に▼、130716aはドキュメントページのような青いアイコン。

検証3:プロパティに違ったところは見受けられない。種類は共に不明な種類

-----------------------------

abc.XXXXzをGmailで自分宛に送った。

受信したメールの添付ファイルabc.XXXXzをタップ=>アプリが起動される。

ドライブ上のabc.XXXXzを削除。

受信したメールの添付ファイルabc.XXXXzをドライブに保存。

-----------------------------

グーグルドライブ上のアイコンが青いアイコンになった。

グーグルドライブでタップするとアプリが起動されるようになった。もう一つのファイルと動きが同じになった。

-----------------------------------------------------------------

結果の推測

・google driveに格納する際に、何かしらのMimeTypeが付けられるのかもしれない。最初にあったabc.XXXXzはUSBのデバッガ経由でコピーしたものを入れたような気がする。コピーの仕方によってはMimeTypeが付加されないのかもしれない。これはGoogleDriveのファイルは格納時にMimeTypeを記述するという前提(推測)。

・XXXXzは 内容はGZ圧縮してあるため、Gmailから起動すると、application/x-gzip-compressed となっているようだ。このMimeTypeが有効ではなかったのか。しかし、driveアプリでファイルの情報を見ても、種類は不明な種類という表示になっている。ここにMimeTypeが表示されていれば判りやすいのに。でもここはGoogle形式以外は全て『不明な種類』という表示になっているようだ

------------------------------------------------------------------

独り言:googleのMimeTypeや拡張子に関する文書は無いのかな。英語でもいいんだけど、、、、探しきれていないだけなのかな?

2014年9月5日金曜日

Android 開発 Uriで受け取ったファイルの元のファイル名とサイズの取り出し方

ContentResolver cr = getContentResolver();
String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE};
Cursor metaCursor = cr.query(uri, projection, null, null, null);
if (metaCursor != null) {
    try {
        if (metaCursor.moveToFirst()) {
            orgFileName = metaCursor.getString(0);
            orgSize = metaCursor.getString(1);
        }
    } finally {
        metaCursor.close();
    }
}

ずっと悩んでいたが解決した。そうだよね、取り出し方が無いなんてことはないでしょ。

2014年7月26日土曜日

android jni bitmapの並び

unsigned int RGB(unsigned char r, unsigned char g, unsigned char b)
{
    return 0xff000000 | (b << 16) + (g << 8) + (r );
}

RGBA_8888はWindowsのビットマップと同様の並びになっている。

unsinged intの 4バイトに収めた時に、右端のバイトからR,G,B,Aの順という意味。

16進数なら0xAABBGGRRという形式ということで、メモリ上に展開されているのはもちろん、インテル方式である。私はリトルエンディアンとビッグエンディアンという言い方が嫌いだ。憶えられないからだ。リトルエンディアンはインテル方式、ビッグエンディアンはモトローラ方式と記憶しているので、どっちがどっちなのか忘れてしまう。インテル方式で良いでしょ。卵を想像して、もともとどちらが上、右とか判らないでしょ。それとも、あの、エッグスタンドには卵の上下があるのでしょうか。誰か教えてください。

今の所、問題は無いけど、モトローラ型のAndroidが出るかもしれませんね。あるのかな?

2014年7月10日木曜日

えー、GZIPInputStreamって

zip = new GZIPInputStream(new BufferedInputStream(fis));

int nLen = 0;
while(true)
{
    int nLen2 = zip.read(babuf, nLen, babuf.length - nLen);
    if (nLen2 <= 0)
        break;
    nLen += nLen2;
    Log.d(TAG, String.format("zip read length = %d this time %d bytes", nLen, nLen2));
}

read時にどんなに大きなバッファを用意していても、Open時のバッファ指定より大きいデータを読み取ってくれないのね。知らんかった。内部バッファと外部バッファの差を吸収してくれないのかよ。

zip = new GZIPInputStream(new BufferedInputStream(fis), 0x10000);

で64kまでは1回で読み取ってくれるね。

あー、気づかなかった。30分は悩んだね。だからJavaは嫌いよ。ライブラリの中身がどうなってるか判らないからね。サンプルも嘘ばっかりだし。愚痴っても仕方ないね。みんなよくやってるね。

2014年6月17日火曜日

ndk, jni 中途半端なメモ

忘れないようにメモしておく。

EclipseとAndroid開発環境を整える。ADTが入っているはず。

 ここは別の資料を見てね。

次に、EclipseでNDKをサポートさせる。

・NDK のダウンロードと解凍
   (フォルダ名は Android/ndk に変えた)
・[Window] → [Preferences] → [Android] → [NDK]
   に、上記パスを設定する。

プロジェクトにndkサポートを入れる方法

http://blog.cnu.jp/2012/07/01/create-ndk-project/

jniフォルダが作られたら、以下の手順を踏む。

http://www.ne.jp/asahi/hishidama/home/tech/java/jni.html

jniについては資料は少ない。本も少ない。頼りはgoogleの文法解説だけ。英語。

2014年6月13日金曜日

Drvie APIの日本語訳ならここ。ここだけでも十分理解できる。

 

http://junsuke.hatenablog.com/entry/2014/02/20/095631

結局このサイトが一番判りやすかった。単なる日本語訳なんだけど、ありがたいですね。だれかGoogleの説明を日本語に訳してくれないかな。どうしても、重要な部分がどこかを判断するまでに時間が掛かってしまい、だんだんと面倒になってきて、別の解説サイトを検索してしまう。これは良くないですね。

日本語が一番わかりやすい。しかもこのサイトは正確に訳していると思う。

追記(2014/09/07)
Android 4.4(KitKat)以降は以下の説明を読んで下さい。もっと簡単なStorage Access Frameworkというものが使えるようになっています。FileOpenDialogが使えるようになりました。但し、今の所、外付けUSBメモリは自動的には対応していない。GoogleDrive(複数アカウントでも可能)と自分のSDカードはドライブ(rootフォルダ)として見えるようになっていてそれを選択できる。ファイル選択をインテント起動して、インテント起動の結果としてUriを受け取ることができる。

https://developer.android.com/guide/topics/providers/document-provider.html

2014年6月12日木曜日

NFCは難しいことをしなければ簡単ダ。

APIレベルの指定は最新版を。あまりに低いと呼び出せない。

昔はもっと難しかったのに、今は簡単。Androidが面倒を見てくれる。

まずはテキストデータをやりとりすることを考える。

NDEF_DISCOVEREDを使うことを考える。これを使えればほとんどをAndroid OSが面倒を見てくれる。

TNF_EXTERNAL_TYPEを使えば、ドメイン名+ファイルタイプ(独自定義)が使える。RTD-TEXTを使うなという記述があるが、TEXTが無難である。

以下に例を示す。ここでのmimeは関係無し。下記の strMをapplication-manifestのintent-filterに利用できる。

intentはonCreate()で保存しておく。mIntent。


 

-----------------------------
private void writeTag(Intent intent, String text, String mime) throws IOException, FormatException {
        String action = intent.getAction();
//    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
    // Ndefメッセージの生成 androidが決めているNDEFレコード形式があるので、それを守らないとintent filterと合致しなくなる。
        String strM = "example.com:exampleType";
        NdefRecord mimeRecord = new NdefRecord(
            NdefRecord.TNF_EXTERNAL_TYPE, strM.getBytes(), new byte[0], text.getBytes());

        NdefMessage msg = new NdefMessage(new NdefRecord[] {mimeRecord});
        // Ndefメッセージの書き込み
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag != null)
        {
            Ndef ndef = Ndef.get(tag);
            ndef.connect();
            ndef.writeNdefMessage(msg);
            Log.v("NFC", "write " + text);
            ndef.close();
            Toast.makeText(this,  "wrote " + text + "with TNF_EXTERNL_TYPE(" + strM + ")", Toast.LENGTH_LONG).show();
        }
        else
            Toast.makeText(this,  "no NFC", Toast.LENGTH_LONG).show();
    //}
}
------------------------------

               <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="vnd.android.nfc"
                android:host="ext"
                android:pathPrefix="/example.com:exampleType"/>
            </intent-filter>
--------------------------------

但し、これだけをintent-filterにしておくと空っぽのNFCを読めないので、上手い確認ができない。

そこで、よくある,以下の定義をする。

            <intent-filter>
                    <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
              </intent-filter>
            <intent-filter>
                    <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
              </intent-filter>
                    <meta-data
                android:name="android.nfc.action.TAG_DISCOVERED"
                android:resource="@xml/nfc_filter" />
                    <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_filter" />
--------------------------------------

res\xml\nfc_filter.xmlに

__

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcBarcode</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources>

__

を入れておく。
書込み釦のリスナー
\

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v)
    {
       
        String strMime;
        EditText edit = (EditText)findViewById(R.id.edtMsg);
        String strMsg = edit.getText().toString();
        if (strMsg.length() > 0)
        {
            SpannableStringBuilder sp = (SpannableStringBuilder)edit.getText();
            // ICタグへの書き込み
            try
            {
                writeTag(intent, sp.toString());
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch (FormatException e)
            {
                e.printStackTrace();
            }
        }
    }
});


以下は読み出し部--------------------


if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
    // NDEF検出による呼び出し。
    Parcelable[] raws = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    NdefMessage[] msgs = new NdefMessage[raws.length];
    String str = "";
    EditText edit = (EditText)findViewById(R.id.edtMsg);
    String strMsg = edit.getText().toString();
    for (int i=0; i<raws.length; i++) {
        msgs[i] = (NdefMessage)raws[i];
        for (NdefRecord record : msgs[i].getRecords()) {
            str += "Type : " + new String(record.getType()) + "\n";
            str += "TNF : " + record.getTnf() + "\n";
            byte[] payload = record.getPayload();
            if (payload == null)
                break;
            int idx = 0;
            str += "payload = ";
            str += new String(payload);
            if (strMsg.length() == 0)
            {
                strMsg = new String(payload);
                edit.setText(strMsg);
            }
        }
    }
    text.setText(str);


}

\

==================================

2014年6月8日日曜日

tess-two を Windowsでコンパイル

そうです。Eclipseで、プロジェクトのプロパティで ”Android ツール”、”Add Native Tool….”を選択してビルドするだけ。

その際に、ヘッダーファイルを作って、それをメインのインタフェース用C言語ファイルにインクルードさせるだけ。このヘッダーファイルでリンクされる。

これで終わり。

参照時は、クラス参照をしないとsoがapkにインクルードされないので注意。

それでも、OCRとして使えるレベルではない。

所詮は研究用だね。

2014年6月7日土曜日

WiFi接続その2

Androidの端末のIPを見るのが面倒で、そのIPを間違いなく手入力するのが面倒だなーって、自動的にできないかなと思ってつまらないアプリを作った。

image

再表示釦を押すとWiFi接続のIPアドレスなどが表示される。

その後、

REM set ADB connection to IP 
ChangeAdbConnectionToTcpIp 192.168.13.135


のようなテキストを共有しようとする。IPアドレスは先ほど表示したIPアドレスである。


このとき、共有先をエディタ(Jota+など)にすると、所謂テキストコピーされる。


Jota+でファイル共有させると、ファイル保存(画面有り)して、共有先の問い合わせとなるので、bluetoothを選択して、bluetoothをPCと接続しておけば、そこで保存したファイルをPCに送ることができる。


REM set ADB connection to IP.txt


上記のテキストを受け取ったPCは拡張子を.batにする。


REM set ADB connection to IP.bat


そして、


http://2den.blogspot.jp/2014/06/android-debug-bridge-wifi.html


で作ったバッチファイルを


@echo off
REM ----------------------------
REM ----------------------------
set ADB_IPADR=%1
echo %1
C:
cd C:\Android\android-sdk\platform-tools
set ADBHOST=%ADB_IPADR%
adb kill-server
timeout /T 2
adb start-server
timeout /T 2
adb connect %ADB_IPADR%:55555
timeout /T 10
adb devices
pause


として、


ChangeAdbConnectionToTcpIp.bat として保存しておく。


REM set ADB connection to IP.batを実行すると、WiFiデバッグが設定される。


 


まあ、ここまでやるのなら手で操作すればってことだよね。


まあ、参考のため、アプリのソースの核だけでも。


    WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
    if (wifiManager == null)
    {
        Toast.makeText(this, "WIFIアクセスできませんでした。", Toast.LENGTH_LONG).show();
        return;
    }
    WifiInfo w_info = wifiManager.getConnectionInfo();
    int ip_addr_i = w_info.getIpAddress();
    String ip_addr = ((ip_addr_i >> 0) & 0xFF) + "." + ((ip_addr_i >> 8) & 0xFF) + "." + ((ip_addr_i >> 16) & 0xFF) + "." + ((ip_addr_i >> 24) & 0xFF);


    ((TextView)findViewById(R.id.txtIP)).setText(ip_addr);
    ((TextView)findViewById(R.id.txtSsid)).setText(w_info.getSSID());
    ((TextView)findViewById(R.id.txtMac)).setText(w_info.getMacAddress());
    String netid = "";
    netid = String.format("%d", w_info.getNetworkId());
    ((TextView)findViewById(R.id.txtNetId)).setText(netid);
    Toast toast = Toast.makeText(this, "表示を更新しました。", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.TOP, 0, 0);
    toast.show();
    String strADBcmd = "";
    strADBcmd = String.format("REM set ADB connection to IP \r\nChangeAdbConnectionToTcpIp %s\r\n", ip_addr);
    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, strADBcmd);
    sendIntent.setType("text/txt");
    startActivity(sendIntent);


 


でも、うまく行かない時がある。結局、USB接続しなおして、 adb tcpip 55555をやらないとうまくいかないな。

android ndkを使おう

http://note.chiebukuro.yahoo.co.jp/detail/n191253

ここを参照して、適当にやってみた。できた。

eclipseで外部コマンドを作るとき、うまく行かなければ、コンソールでやってみよう。

javah は ProgramFilesのJava\jdk1.7.0_03\binにある。

カレントをworkspace\ndksample1のようなプロジェクトのルートに置いておく。

G:\workspace\ndksample1>"c:\Program Files (x86)\Java\jdk1.7.0_03\bin\javah.exe"
-d jni -classpath bin/classes;C:\Android\android-sdk\platforms\android-19\androi
d.jar mobi.shiokubo.ndksample1.MainActivity

という感じで一度動作させてみれば結果がわかる。

私は結局、外部コマンドの実行部を

c:\Program Files (x86)\Java\jdk1.7.0_03\bin\javah.exe

と書き直した。変数指定ではうまく動作しなかった。

ここを見た。

http://tharas.files.wordpress.com/2011/08/javah_externaltool.jpg

それから初心者がミスるところ。 MainActivity.javaを開いた状態でそれにフォーカスが入っている時に、外部コマンドを使うと変数に正しい値が入る。フォーカスしていないとダメでした。${java_type_name}これが正しい値にならないようだ。

2014年6月6日金曜日

Android Debug Bridge を WiFi経由で接続する。

Android Debug Bridge を WiFi経由で接続する。

    Nexus7 2013で確認済み。PCはThinkpadT520 8GB

 

    Android端末の 開発者設定、USBデバッグ接続はチェックONしておくこと。
    バッチファイルで説明
C:\Android\android-sdk\platform-toolsにADBがあるので、カレントにします。
ADB_IPADRは私の場合のAndroid端末のIPアドレスです。
接続中のWiFiをタップすると表示されます。
 以下にバッチファイルを示します。


 この後、eclipseを立ち上げればWiFi経由でデバッグできます。
 アンドロイド端末がスリープすると繋がらなくなります。
 何度起動しても大丈夫です。うまくいかなくなったら、Eclipseを再起動します。
 端末を再起動してもいいです。
   
@echo off
REM ----------------------------
REM ----------------------------
set ADB_IPADR=192.168.2.201
C:
cd C:\Android\android-sdk\platform-tools
set ADBHOST=%ADB_IPADR%
adb kill-server
timeout /T 2
adb start-server
timeout /T 2
adb connect %ADB_IPADR%:55555
timeout /T 10
adb devices
pause
    こんな感じ。

iDisplay アンドロイドアプリ

Windows7とNexus7でプレゼンを行いたいと思っていた。特にT520を客先に持ち込んで、プレゼンしたいときに、第2ディスプレイを用意するのは困難だった。Nexus7を入手したので、これを第2ディスプレイにすれば、便利だろうということで、早速インストールして接続してみた。

WiFiは簡単に接続できた。しかしミラーモードが無い。

USB接続が何故かできない。画面に訳の分からないメッセージが出る。『設定』『開発者』『USBデバッグ接続』が有効になるのに対処しました?

グーグル先生に聞いてみた。

なるほど、Android4.2以降はUSBデバッグモードで接続するという指定をしないと認識しないらしい。ついでに、認証PCに対して、毎回接続するたびに認証画面を出さないというチェックボックスにチェックを入れておけば、USB接続できるようになる。なんと難しいことか。まあ、メッセージが日本語として満足ではないためのようだが。

とりあえず、OKだろう。しかしミラーモードでは繋がらない。

第2ディスプレイとして接続する。PCに本来ある複数スクリーン制御(解像度の設定)には第2ディスプレイは表示されない。しかし、プレゼン用ツールにはセカンドディスプレイと表示されるので、それを使って、2つのスクリーンでプレゼンすることを選択すれば問題ない。

まあ、良かった。

iDisplay 450円

2014年6月5日木曜日

Nexus7 2013 がキターってか

MTPモードで接続できない、USBデバッグモードもダメ。

タスクバーの右のデバイスを安全に外すという欄にはNexus7が表示されるが、デバイスマネージャーには

Android ADB Interfaceとしか表示されない。

んー、、、もちろんメディアプレーヤーにもファイルエクスプローラーにも表示されない。

USBデバッグモードも、、、同じで、デバイスマネージャーに

Android Composite ADB Interface とした表示されない。

グーグル先生でも、新しいドライバを入れ直せとしか書いてないが、入れ直そうとすると、最新が入っているのでダメと言われるだけ。

三時間くらいグーグル先生とやりとりして、、、、

もしかして、、、、

Nexus7をMTPモードにしてUSB接続する。

Android ADB Interfaceを右クリック、このドライバを削除(プログラムも削除にチェックを入れる)。

USBケーブルを抜く。

しばらく待って、

Nexus7をMTPモードのままUSB接続する。

あ、繋がって、メディアプレーヤーも認識した。

USB デバッグモードでつなぎ直す。

Android Composite ADB Interface をデバイスマネージャーから削除。

一旦抜いて、もう一度接続。

デバイスマネージャにて !Nexus7 としてエラーになる。

グーグル先生のいうところのドライバを更新する。

なんと動くようになった。

 

一度でも他のAndroid(古いやつ)でデバッグした人は最新のドライバをダウンロードしておいて、上記操作を行うとうまくいくようですね。

あー、疲れた。良かった。

折角開発用に購入したのに繋がらないなんてね、バカ見たいでしょ。

さー、根性入れて開発しましょ。

 

ちなみに、正常認識したNexus7はデバイスマネージャー上にこのように現れた。

image

2014年6月2日月曜日

SQLExpress money型が通貨記号とカンマを編集して返す。

古いシステムをWin7に移行した。

 一部のデータベースの値が0表示されると言われた。そう、money型である。

ODBCを使っていて、MFCのCRecordSetを使っている。SQLEXPRESS2005である。VisualStudio2010で再コンパイル済み。

クレームが入って、金額入力したのに表示されないと。

自分のPCで確認したら、money型の読取りにてCStringに \5,800と入っていた。

通貨記号とカンマが編集されている。それを旧来のソースではatolで数値に戻していた。もちろん、0になる。

いろいろ触ってみたが、治らないので、仕方なく、通貨記号とカンマを外すロジックを入れて動かした。

誰が互換性を無くしたのか。Microsoftを信じてはいけない。これからは
SQLServerを使わないか、money型を使わないことにしよう。MySQLにした方が良いかも。Microsoftはそろそろヤバイかもね。

long atol_v(const char *pStr)
{
    //// 2014/06/02 本当にこんなことってあるの?
    //// money型は文字列で貰うと¥と,が編修済みなの。
    char szWk[256];
    char *pszWk = szWk;
    while(*pStr)
    {
        if ((*pStr == '-') ||
            ((*pStr >= '0') && (*pStr <= '9')))
            *pszWk ++ = *pStr;
        pStr++;
    }
    *pszWk = 0;
    return atol(szWk);
   
}

2014年3月27日木曜日

JavaScript ボタンの押しっぱなしを検出する。


<html>
<head>
<script>
window.onload = function(){
var sts = 0;
i = function(id){ return document.getElementById(id) };
/// これが押し始め
i('o').onmousedown = function(){i('o').innerHTML='[down]';
                                i('s').innerHTML='STS=1';
                                sts=1; }
//// ここで押し終わり
i('o').onmouseup = function(){ i('o').innerHTML='[up]';
                                i('s').innerHTML='STS=0';
                                sts=0;}
//// ボタンからマウスが押されたまま放れるとUPが通知されないので、ここで押し終わりとして、内部ではキャンセルする。
i('o').onmouseout = function(){ i('o').innerHTML='[up]';
                                if (sts == 1)
                                {
                                    i('s').innerHTML='STS=-1';
                                     sts=-1;
                                }
                             }
}
</script>
<button id="o">[up]</button>
<p>
<div id="s">STS=0</div>
</p>
</body>
</html>

画面の [UP]をクリックすると、DOWNに変わり、DOWNから抜けるとUPになる。もちろん、クリックを放すとUPになる。STSは状況表示で、0は初期または正常終了状態、1は押されている状態、-1は押されたままマウスが離れた場合。
setCaptureを使わない。IEはバージョン毎のコンパチ性が全くない。chromeに期待する。どんな良いものでも、コンパチ性が無ければ意味がない。せめてダウングレード状態を宣言できるようにしなければ、ブラウザとしての価値が疑われる。次期バージョンはどうなるのか。WindowsUpdateで勝手に更新されるし。そもそも、WindowsのOSがIEのモジュールを使っていること自体に問題がある。IEのバージョンによりOSの動作が変わるなんてことは本末転倒である。

(2015/12/17)追記
 OSがIEのモジュールを使っている==>ファイルエクスプローラ(OSのシェル)がIEのモジュールを使っているという意味。Windowsはシェルの変更ができないので、ファイルエクスプローラはOSの一部だという認識。