「Android」タグアーカイブ

Nexus5x,6P のカメラ reverse landscapに対応

Nexus5x及び6Pで、QRコード読み取り,3D 行先コンパス ARでカメラ画像が、180度回転表示するバグを修正しました。

Nexus 5Xのイメージセンサーは設計上の部品配置の都合で、他のAndroid端末と異なり逆(reverse landscape)に取り付けられているとのことで、rotationが未設定のアプリはpreviewが反転するようになった。
http://qiita.com/tomoima525/items/f59d345ea40c36244f9b

当アプリも180度回転表示してしまいました。

元々は、
camera.setDisplayOrientation(90)
で90度回転させて縦表示するようにしていたのですが、
Nexus5xだと、
camera.setDisplayOrientation(90 + 180)
にしないとだめで、

camera2 APIを利用すれば全自動ですが、
最終、以下のコードを追加して対応致しました。

    int numCameras = Camera.getNumberOfCameras();
    int cameraID;
    int back_camera_flg = 0;

    int index = 0;
    Camera.CameraInfo cameraInfo;
    int result = 0;

    while (index < numCameras) {
      cameraInfo = new Camera.CameraInfo();
      Camera.getCameraInfo(index, cameraInfo);
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && back_camera_flg == 0){
        result = (cameraInfo.orientation) % 360;
        result = (360 - result) % 360;
        Log.w(TAG,"----- CAMERA INFO FRONT " + result );
      }
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
        back_camera_flg = 1;
        result = (cameraInfo.orientation + 360) % 360;
        Log.w(TAG,"----- CAMERA INFO BACK " + result );
        break;
      }
      index++;
    }
     //camera.setDisplayOrientation(90);
    camera.setDisplayOrientation(result);
    //
    camera.setParameters(parameters);
  }

QRコード読み取り バージョンアップしました。 ズームイン、ズームアウト 1.3.0

QRコード読み取り バージョンアップしました。

・カメラのズーム機能を実装しました。

15m先のバーコードが読めるというバーコードリーダを見て、それならということで、ズームイン、ズームアウトを実行しました。
ポスターに近寄らなくても、ズームインでQRコードが読み取れます。
(android 2.3.3の旧機種でも動作します!)

https://play.google.com/store/apps/details?id=jp.co.seiwa.zxing.client.android

※ついでに、開発ツールをEclipseからAndroid Stadio 2.1.2に移行しました。

B_2016-06-12-12-08-48
<ズームイン↓>
B_2016-06-12-12-08-56

Android 3D行先コンパス AR 修正 ver1.11

3D行先コンパス AR

バグ修正
1)NECの10インチタブレット LifeTouch(LT-TLX5W1AB)X,Y,Z軸がおかしいバグ修正

device_angle = getWindowManager().getDefaultDisplay().getRotation();
device_angle がSurface.ROTATION_270でした。通常のスマホだと、Surface.ROTATION_0です。
とういうことは、タブレットによっては、Surface.ROTATION_90やSurface.ROTATION_180があるかも。

「メモ」
remapCoordinateSystemの第二、第三引数は、いまいち、机上(思考)と端末座標、OPENGL座標が結びつかないので、例によって総当たり(24通りの中から)でピックアップしました。

AXIS_X, AXIS_Y
AXIS_X, AXIS_Z
AXIS_X, AXIS_MINUS_Y
AXIS_X, AXIS_MINUS_Z

AXIS_Y, AXIS_X
AXIS_Y, AXIS_Z
AXIS_Y, AXIS_MINUS_X
AXIS_Y, AXIS_MINUS_Z

AXIS_Z, AXIS_X
AXIS_Z, AXIS_Y
AXIS_Z, AXIS_MINUS_X
AXIS_Z, AXIS_MINUS_Y

AXIS_MINUS_X, AXIS_Y
AXIS_MINUS_X, AXIS_Z
AXIS_MINUS_X, AXIS_MINUS_Y
AXIS_MINUS_X, AXIS_MINUS_Z  Surface.ROTATION_270

AXIS_MINUS_Y, AXIS_X
AXIS_MINUS_Y, AXIS_Z
AXIS_MINUS_Y, AXIS_MINUS_X
AXIS_MINUS_Y, AXIS_MINUS_Z

AXIS_MINUS_Z, AXIS_X     Surface.ROTATION_0
AXIS_MINUS_Z, AXIS_Y
AXIS_MINUS_Z, AXIS_MINUS_X
AXIS_MINUS_Z, AXIS_MINUS_Y

switch (device_angle){
case Surface.ROTATION_0:
//スマートフォン(縦)
SensorManager.remapCoordinateSystem( inR, SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X, outR );
break;
case Surface.ROTATION_270:
//タブレット横にセンサーが設定されているもの 10インチタブレット縦
SensorManager.remapCoordinateSystem( inR, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Z, outR );
break;
default:
SensorManager.remapCoordinateSystem( inR, SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X, outR );
break;
}

もし、Surface.ROTATION_90やSurface.ROTATION_180場合は崩れます。
zahyou2
2)N,S,E,Wのテクスチャーが正しく表示されないバグ修正

OpenGL ES1.0では、テクスチャーの1辺のサイズは2のn乗でなければならない。
96 x 96にしていました。(Nexus5,7 ,Xperiaだと、これでも正しく表示できますが、NECの10インチタブレット LifeTouch Android 4.0.1は仕様どおり表示できません。)

3)カメラSurfaceViewがGoogleMapのViewより下に隠れて表示されないバグ修正。

NECの10インチタブレット LifeTouchで発生。
OpenGLのSurfaceViewは、mOpenglView.setZOrderOnTop(true)でトップに持ってきているのですが、
カメラSurfaceViewが端末およびアプリのタイミングにより中途半端になるようで、mCameraview.setZOrderMediaOverlay(true) を設定しました。

もし、SurfaceViewを3つ以上使う場合は対処不明です。

 

Android 3D行先コンパス AR リリースしました。

3D行先コンパス AR

icon

info-2

・カメラ上に3Dのコンパスを表示しています。
・Google Mapで行先を設定すると、目的地への方角、距離、天気を表示します。
・天気予報は、OpenWeather APIを使用。 精度はあまりよくありませんが、world wideです。
http://openweathermap.org/
・コンパスがずれていると思われる時は8の字(メビウスの輪)キャリブレーションを行って下さい。
http://www.s3sensor.com/s3/calibration/
これでほぼ直ります。(iPhone,Android)
※これでほぼ直ります。機械を信用しすぎてはダメです。最終自分の勘を信じましょう。。。
5月に会社でシンガポール旅行があるので、これで迷わずにキャンパス内を歩けるかと。
http://www.nus.edu.sg/campusmap/pdf/nus_kent_ridge_coloured.pdf

================================
2.3.4 / 4.1.2 / 4.4.4 Xperia,Nexus 5,Nexus 7(タブレット)で動作確認済みですが、
NECの10インチタブレット LifeTouch(LT-TLX5W1AB)では、X,Y,Z軸がなぜかおかしく
今のところ正しく動作しません。

表示は端末を縦固定、カメラも90度回転して使用してします。その関係か
remapCoordinateSystem()の第二、第三引数は、デバイスのX軸、Y軸がそれぞれ指している世界座標系の
方向を指定するのですが、机上で思った設定をしてもどうもうまく定まらず、トライ&エラーで
最終 remapCoordinateSystem( inR, SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X, outR );
で動作するようになりました。

もしかして、getRotation()でチェックして、それぞれの端末環境によって、第二、第三引数
を替えないといけないのかもしれません。
https://github.com/kvirair/Compass-View-Library/blob/master/src/garin/artemiy/compassview/library/CompassSensorsActivity.java
(NECの10インチタブレットが正しいのかも。今後の検討)

【追記】
http://d.hatena.ne.jp/yellow_73/20110815
にあるように、Androidのタブレット機では横長基準でセンサを仕掛けているものがあります。携帯電話機なら縦長基準。
そういうことですか。。また、改修しておきます。(4/14)

参考:
remapCoordinateSystem() の第二、第三引数の決定
http://blogs.yahoo.co.jp/count_zero_blog/62278295.html
モーションセンサー その3
http://into.cocolog-nifty.com/pulog/2011/10/android029-3-se.html
三次元コンパスを作ってみた
http://android20092009.blog67.fc2.com/blog-entry-41.html
ソースコード参照させて頂きました。OPENGLの部分
Androidでテキストをマーキー表示するカスタムビューの作り方
http://d.hatena.ne.jp/mingos/20110215/1297788794
ソースコード参照させて頂きました。

iBeacon CentOS 7で受信

iBeaconは、iOS7で追加された近距離無線を利用した通信機能です。
Estimote社がBeaconセンサーを開発し、iPhone 5sに搭載されています。
認識範囲はNFCよりも広範囲で50m程度あり、ビーコン発信側は、
UUID:128ビット文字列(RFC4122で規)
Major値:16ビット整数
Minor値:16ビット整数
です。
受信端末側は、電場強度の情報を使って、数m単位で距離を認識でき、メジャーコードやマイナーコードから任意に定義づけられた情報からそれぞれの応答・動作をします。

今後、いろんなシーンで使われていくと思われます。
「国内iBeaconサービス、続々登場!」
http://smartphone.r25.jp/news/114338
10/31リリース!「京都の市バスはiBeaconで次のバスの到着時間」
http://www.aplix.co.jp/?p=11330
当社は京都:烏丸通りに面した場所にありますので、もしかしてデータを受信できるかも?(これについてはまた別の機会に)

さて、今回は手持ちの機器でiBeaconの送信、受信を体験してみたいと思います。
まず、iBeaconは、Bluetooth Low Energy 対応の機器がないとダメです。
デバイスはBluetooth 4.0であればAndroidでも使えます、ただしAndroid端末の場合はOSが4.3以降でないとだめです。
また、Androidは今のところiBeaconの送信はライブラリーがないのでできません。受信だけとなります。

手落ちのNexus 7は2012モデルでBluetooth 3.0ですので、残念ながら受信できません。(2013モデルだとOKです。)
Screenshot_2014-11-01-22-44-51

最終的に以下の組み合わせで送受信できました。
I)iPhone同士(iPhone5sとiPhone5c) ::当然ですが。
Estimote (free) をインストール
https://itunes.apple.com/us/app/estimote-virtual-beacon/id686915066

iPhone5sをビーコン発信
iPhone5cでレーダ受信  (受信できたら小さな端末アイコンが表示されます。)
20141101_223239

受信した端末のアイコンをタップするとUUID,major,minorが分かります。
20141101_223300

II)iPhone5s ビーコン発信 / CentOS 7で受信
(CentOS 7はVmwareで動かしています。ホストPCはWindows8.1 DELL Inspiron 15 7000でBluetoothは4.0です)

CentOS 7で動かす為に必要なモジュールをインストールします。
1)BlueZ パッケージ(bleaconをインストールに必要)
#yum install bluez-libs-devel

2)#yum install npm*
#npm -v
1.3.6

3)#yum install node*
#node -v
v0.10.30

4)#npm install bleacon
エラーがなければOK

https://www.npmjs.org/package/bleacon

5)#hciconfig

hci0: Type: BR/EDR Bus: USB
BD Address: 80:86:F2:D3:00:F8 ACL MTU: 1021:5 SCO MTU: 96:5
DOWN
RX bytes:568 acl:0 sco:0 events:29 errors:0
TX bytes:390 acl:0 sco:0 commands:29 errors:0

DOWNの場合UPさせる。

  #hciconfig hci0 up

hci0: Type: BR/EDR Bus: USB
BD Address: 80:86:F2:D3:00:F8 ACL MTU: 1021:5 SCO MTU: 96:5
UP RUNNING
RX bytes:1115 acl:0 sco:0 events:56 errors:0
TX bytes:774 acl:0 sco:0 commands:56 errors:0

7)iBeacon受信プログラム

recv.js

//—————————————-
var Bleacon = require(‘bleacon’);
Bleacon.startScanning();
Bleacon.on(‘discover’, function(bleacon) {
console.dir(bleacon);
});
//—————————————-

#node recv.js で受信待ち。

8)iPhone5s Estimote ツールでビーコン発信
9)CentOS7受信結果

{ uuid: ‘xxxxxxxxxxxxxxxxxxxxx43fe94921d8’,
major: 11305,
minor: 17710,
measuredPower: -57,
rssi: -47,
accuracy: 0.5200019057155468,
proximity: ‘near’ }
{ uuid: ‘xxxxxxxxxxxxxxxxxxxxx43fe94921d8’,
major: 11305,
minor: 17710,
measuredPower: -57,
rssi: -44,
accuracy: 0.4273723450154846,
proximity: ‘immediate’ }

距離情報
近接度(proximity) [接近(Immediate),近い(Near),遠い(Far),不明(Unknown)]
精度(accuracy)

で受信できることが分かりました。
CentOS7で送信を試しましたがこちらはうまく動作しませんでしいた。
デバイスが悪いのか、モジュールが悪いのか不明です。

以前、NFCで非接触ICカードを使いログインアプリを組んだことがありますが、AndroidでBluetooth 4.0端末が入手できたら何かアプリを作成したいと思います。
iPhone iOS7から標準搭載されたiBeaconですが、O2Oは「Online to Offline」の要となっていくかと思います。