ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2020年6月13日土曜日

Rakuten miniでiBeacon受信

わー、Androidの記事何年ぶりだろー。

Googleの聴覚障害支援アプリを試したいけどお金がない……と思っていたところに楽天ミニが1円だったので買ってみました(貧乏人の発想ですね)。

聴覚障害支援アプリ、ヘッドホン繋げないので補聴器っぽいアプリはまだ試せていないんですが、音声書き起こしアプリは精度高いし英語と日本語切り替えワンタッチだし、素晴らしい。なにせ無料(貧乏人の限界ですね)。

もうこれだけで1円の元は取れましたが(この先も1円とは言ってない)、それだけではもったいないので、マイコンとの連携で遊んでみようと思います。お題はBeaconの受信です。ちゃんと通信するならBLEでガツガツ書けばいいんですが、Beaconはペアリングも不要で32bitのペイロードがあるのでマイコンからのちょっとした通知が非常に簡単です。

それはともかく、Android Studio最高ですね。

■参考にしたサイト■

とはいえAndroidに触るのは2.3以来、さくっと動かすだけで勉強するのは面倒くさい(金持ちになれない人の発想)ってんで、とっかかりが必要です。こちらの記事が大変参考/勉強になりました。

サクッとコピペします。ただ、ほんの2年前の記事ですがいろいろ変わっています。

「プロジェクト構造」からだとbeacon libraryが見えなくなってしまっているので、Dependencyは以下の2つを追加します。
    implementation 'org.altbeacon:android-beacon-library:2.17.1'
    implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
マニュフェストには以下を追加します。
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true" />
    <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
onCreateでビーコン関連を生成する前には以下のようにロケーションアクセスの確認が必要です。この辺iOSと同じっすね。
これでビルドして実機で起動するとBeacon使っていいか?とダイアログが出てきます。

テスト用のビーコンとしては、Macのターミナルからビーコンの発信停止ができるmbeaconを使いました。

これを初期設定
$ defaults write mbeacon uuid -string "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$ defaults write mbeacon measuredPower -integer -45
したあとに
$ mbeacon -major 0 -minor 0

でビーコンを出すとわりとすぐに「D/iBeacon: Enter Region」、ctrl+Cで止めると数秒後に「D/iBeacon: Exit Region」が表示されます。

よかったよかった。

■余談■

このところ、玄関に来客を検知したらAppleWatchに通知飛ばせないかと、アプリを書かない範囲でいろいろ調べてました。IFTTTからslack, twitterまでは瞬時に通知が届くんですが、その先がどうも不安定でお客さん待たせてしまう、ってんでボツ。

だったのですが、楽天ミニならポケットに入れっぱなしでも気にならないので、Androidで作ろうかなと思ってます。iOSこういうのをサクッと作れないからね(コーディングは簡単。MFiなど周辺の縛りが面倒くさい)。

2013年2月14日木曜日

AndroidのソフトキーボードでEditViewが隠れる場合

AndroidでEditTextがソフトキーボードに隠れてしまう件。

シングルラインであれば、AndroidManifest.xmlの該当するactivityの中に
    
    android:windowSoftInputMode="adjustPan"

を追加すれば解決することが多いですが、マルチラインの場合には
   
    android:windowSoftInputMode="stateVisible | adjustPan"

と書かないと最初の1行目しか見えません。よくある「ScrollViewを使う」等のwork aroundも試したのですが、結局、これが一番よく効きました。上記はScrollViewなしでも効いてます。

ただ機種依存やその他の設定による影響もいろいろあるようなので(この記事が参考になりました→「Android キーボードの出現と同時に画面がスクロールしないときに」)、あくまでも私のところでは…という話です。

ってかデフォルトをadjustPanにしといてくれよ>Google

DDMS post-create initでフリーズ

何か今日は沢山のBad Know-howが収集できて嬉しいorz

ADT/Eclipseを普通に終了してからMac(Lion)を再起動、再度ADTを起動したらstatusに

  DDMS post-create init

という表示が出てそのままフリーズしてしまった。Eclipseを強制終了して再起動してもダメ。

ググったら、StackOverflowでwork aroundが見つかりました。ありがたやありがたや。Eclipseがしっかり終了しているのを確認し(生き残っている場合には強制終了)、ターミナルでWorkspaceへ移動し、以下のコマンドを実行します。

  rm .metadata/.lock

これでEclipseは起動しました。いやはや。

2013年2月1日金曜日

Android:今日ハマったこと

■layout.xmlが壊れる■ 

Graphical Layoutでの作業。画面の最上部にRelativeLayoutを置きます。

その中に「左端にボタンA、真ん中にTextView、右端にボタンB」を配置しました。ボタンAは左寄せ、ボタンBは右寄せ、TextViewはAの右かつBの左を指定します。

ソースを保存してもエラーなし。


で、実行しようとするとエラー。TextViewのandroid:layout_toLeftOfで「そんなidない」って言われる。

原因は…xml上で、ボタンA,TextView,ボタンBの順番で並んでいるのにTextViewが後にあるボタンBを参照しているから…でした。


そりゃそうなんですけどね…Graphical Layout上で作業しているとエラーが出ない、でも一度エラーになるとXMLのソースを見ても手動でIDを付け替えてみても、どうにもなりません。現象だけ見ると、開発ツールがバグっててID管理テーブルが壊れているような感じなもので「+id/buttonA」と定数を対応付けているのはどこだろう、なんて無駄な探索をしてしまいました…。いやはや…。


■Activityが見つからないエラー■

またやってしまった>マニュフェストへの登録忘れ。

1日1回、忘れたころにやってしまう…。

今日はいくつもREST APIコールを書いたので、おかげさまでthreadとかrunnableとかhandler.postなんてのがソラで書けるようになりました。でもListViewのAdapterについては原理は何とか理解したものの、コードは覚えられない。

2013年1月31日木曜日

ACS Android SDKでハマる

ACSでググっても化学とか冠状動脈とかばっかりで、なかなか情報にたどり着けないのが困ったもんです。Appcelerator Cluod ServicesだとTitaniumばっかりだし(当たり前だけど)。ということで、ACS Android SDKでのハマりねた。

■Whereをどう書けば?■

Titanium mobileのSDKと違って、Android SDKはほとんど素のREST API SDKです。iOS SDKだと、あまり便利とはいえないけどCCWhereなんてクラスもあって、それなりにラップしてくれます。でもAndroidだと、こんな感じで書く必要があります。

    Map<String, Object> q = new HashMap<String, Object>();
    q.put("order", "-updated_at");
    q.put("where", "{\"email\":\"" + strEmail + "\"}");
    CCResponse r = sdk.sendRequest("users/query.json", 
                                   CCRequestMethod.GET, q);


…なんかperlでも書いている気分だ…書いたことないけど…。

まぁでも「ほぼREST」だと思ってしまえば、ある意味気は楽です。

ところで、Android 4以降はネットワークアクセスを別スレッドにしないと動いてくれません。

    public void acsThread() {
        listFriendsRequest = null;
            
        new Thread(new Runnable() {
            @Override
            public void run() {
                acsProcess();
            }
        }).start();
    }

そして終了後に画面切り替えたりするにはHandlerを使う必要があります。

以上をひとまとめにしてACSへのログインをActivity上に書くとこんな感じ。会社で使っているコードを貼るわけにはいかないので、記憶などを頼りにADT上で書いたもの。実働ソースではないので、もし不具合が出たらすみません。

    public void acsLogin(String inEmail, String inPassword) {
        final String email    = inEmail;
        final String password = inPassword;
        final Handler handler = new Handler();
        
        final JSONObject result = null;
        
        new Thread(new Runnable() {

            @Override
            public void run() {
                CCResponse r = null;
                
                Map<String, Object> q = new HashMap<String, Object>();
                q.put("login",    email);
                q.put("password", password);
        
                try {
                    r = sdk.sendRequest("users/login.json", 
                                        CCRequestMethod.POST, q);
                    CCMeta m = r.getMeta();
                    if ("ok".equals(m.getStatus()) 
                            && m.getCode() == 200 
                            && "loginUser".equals(m.getMethod())) 
                    {
                        result = r.getResponseData()
                                  .getJSONArray("users")
                                  .getJSONObject(0);
                    }
                }
                catch (CocoafishError e) {
                    e.getMessage();
                }
                catch (IOException e) {
                    e.getMessage();
                }
                catch (Exception ex) {}

                if (result != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            jsonUser = result;
                            Intent intent = new Intent(MainActivity.this, 
                                                       NextActivity.class);
                            startActivity(intent);
                        }
                    });
                }
            }
        }).start();
    }

何かもう1歩あるくたびにつまずいてググらないと進めない。

まぁiOSアプリ書いている時もそうですけどねorz

2013年1月25日金曜日

Xcode 4.5でiOS 5.1対応プロジェクトを作る

サマリー:

  • Xcode 4.5で作ったアプリがiOS 5.1上でクラッシュ
  • Deployment TargetをSDK 5.1にしたけどそれでもクラッシュ
  • Autolayoutが原因じゃった
  • 余談:Android開発は辛いよ

■いきなりクラッシュ■

Xcode 4.5移行後に作ったプロジェクトをまだiOS 6でしか動かしていないことに気づき、iOS 5.1 SDKを入れて試したところ、即死しました。iOS 6なら動きます。iOS 6固有の機能なんて何も追加した覚えがないのになーと真っ青になりました。

■原因■

Autolayout機能を使ったことが原因でした。エラーメッセージの中に出てきたNSLayoutConstraintでググって判明しました。いやはや…。



■SDK 5.1の組み込み方■

一応書いておきます。iOS SDK 5.1はXcode 4.4に含まれていますので、
  • developer.apple.comのdownloadsからXcode 4.4をダウンロード
  • xcode_4.4.1_xxxxxxx.dmgをマウントし、Xcode.appを右クリック「パッケージの内容を表示」を選び、 Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKsにあるiPhoneOS5.1.sdkを /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs にコピーします。ディレクトリ深いわ。
  • Xcodeを再起動
これでiOS Deployment Targetとして「5.1」を選べるようになります。ProjectのPROJECTとTARGETSにある「iOS Deployment Target」を5.1にセットしてください。エミュレータで5.1を選べるようになります。


■対策 - Autolayoutを切る■

Storyboardをクリックし、Identity and Typeの「Interface Builder Document」にある「Use Autolayout」のチェックボックスをoffにします。


これで、Xcode 4.5で作ったプロジェクトをiOS 5.1で起動しても落ちなくなります。

なお、MainStoryboard_iPhone.storyboardだけでなくMainStoryboard_iPad.storyboardも直しておくことをお忘れなく(と経験者は語る…)

■Autolayout■

Autolayoutがonだと余計な補助線が出てきてウザいです。これ、Androidの開発ツールにも似たような機能があるんですが…ご安心ください、Androidのはもっとウザいです。縦横比の異なるiPhone5をサポートするにはリキッドレイアウトが一番無難ではあるわけですが…

■余談■

最近気づいて驚いたのですが。Androidってソフトキーボードが出た/引っ込んだを検出するイベントがないのね…。ソフトキーボードが出てくると、真ん中辺に置いたEditTextは自動的に縮むんだけど、移動はしてくれない。移動はプログラマがやらないといけないんだけど、「キーボード出たよ」ってイベントがない。「viewが縮んだ」ってイベントを使って間接的に検知するしかない。間接的だから副作用を避けるためにはいろいろ小細工しなければならない。iOSならこんなにイベントあるのに。


  • UIKeyboardWillChangeFrameNotification
  • UIKeyboardWillHideNotification
  • UIKeyboardDidChangeFrameNotification
  • UIKeyboardDidHideNotification
  • UIKeyboardWillChangeFrameNotification
  • UIKeyboardWillShowNotification
  • UIKeyboardDidChangeFrameNotification
  • UIKeyboardDidShowNotification


Android開発、しんどいです…。優しい上司は「難しければ、iPhone版を先に出して、Android版外注にしようかねぇ」と言ってくださるのですが…社内にiPhoneユーザが少ないので、iPhoneだと十分なテストが出来ないです。困った…。

2013年1月19日土曜日

Titanium mobile、どうも困った…

記事に要約つけることにしました。
  • TitaniumアプリのAndroid版でフラグメントに遭遇
  • Titaniumあかんか…という気配
  • 次はNative+jQuery。いや、いっそNative+Airでw

■iPhoneでは問題ない…■

会社でTitaniumを使ってちょっとしたアプリを書いてます。iPhoneでテストしてひと通り動くようになったところでAndroidエミュレータでテスト、画面の差異などを吸収したりソース分けたりして社内テスターにリリース。

そこで問題発生、Android OSバージョン:
  • 2.3.3では問題なし
  • 2.3.4では動くヒトと動かないヒト
  • 2.3.5では起動すらしない
  • 4以降は今のところ問題なし
いろいろ追いかけてみたところ、スマートフォンなのにisTabletがtrueで返ってきてしまってあちこち矛盾するのが原因らしいと判明。2.3.5のエミュレータなんて無いからテストできないですよorz

今回Titaniumを使うことになったのは、クロスプラットフォーム性を最重視、であればPhoneGap+jQueryより少しはサクサク動くTitaniumの方が良いか…という判断でした。Androidのフラグメントについては皆さん了解済だったんですが、0.0.1の違いでバラついてしまい、同じバージョンでも差異が出てしまうというのはさすがにアウトだなぁという空気になりまして。まぁそりゃそうですわな。

それなりにwork aroundもあるとは思うんですが、Titanium SDK 3.0.0も出たばかりでそのバグフィックスリストを見ると、ちょっとこれはシンドいかなという気分に。「JavaScriptからブラウザを経由しないでネイティブのAPIを叩くからjQueryより少し軽い」というのはメリットなんですが…ランタイム上のネイティブなオブジェクトを参照する辺りの処理がイマイチ書き切れてない感じです。以前もviewのframeサイズを拾ってこようとしたら何やっても0しか返って来ないってこともあったっけ。ごく基本的なAPIがreferenceに書いてある通りに動かないのはイカンよなぁ…。

今回Titaniumの評価も兼ねたプロジェクトだったわけですが…とりあえずACS(Appcelerator Cloud Service)はそのまま使うけど、Titaniumについてはしばらくペンディング…ということになりそうです。

個人的にはUIエディタのないツールでプロトタイプを作るのはイヤなので、ちょっと助かったとです。リキッドレイアウトが協力ならまだ良いんだけどねぇ。

ホントならここでSenchaへ行きたいところなんですが、ツールを買い揃える予算がないのでMonaca方面で試行錯誤中。

しかし…jQuery mobileについて勉強してた当時はある程度ソラで書けるようになっていたのに、また「えーと、画面と画面を区切るのはなんだっけ…(ググり中)そうそう <div data-role="page" id="foo"></div> だった」なんてところまで退化していて困ったもんだ。

個人的には「そんなにクロスプラットフォームが良いなら、iPhone版はNativeで書くとしてもAndroid版を含めて残り全部Adobe Airで良いんじゃね?」と鬼のようなことを考えていたりもするのですがw

2012年7月12日木曜日

ADT 20でプロジェクトが作れない

会社のLionにAndroid開発キットをインストールしました。EclipseはForce.com IDE用にすでに入れてあったので、adnからインストールし、SDK ManagerからAPI 8, 10, 15、それにIntel HAXを選択。

さて、Hello worldを…と思ったら、Android Application Projectで、最後のFinishが押せません。いや、押してもすぐに戻ってきてしまって終わらない。

ググってみると、どうもADT 20の問題みたいで、いろいろwork aroundが出ている。

  • android-sdk-macosx/extras/compatibility -> supportにrename
    • すでにsupportだった
  • sdk managerからsupport libraryを削除してもう一度create new project、ライブラリがないって言われたらそこでinstallをクリック
    • 変化なし
でも、結局、症状は同じでした…。ADT 20よりも古いツールからインストールしていたマシンでは問題ありません。

とりあえず、当面Androidいじる予定ないから良いんですが…何とか早く解決してほしいものです。また何か思いついたら対策してみます。

2012年6月17日日曜日

Dreamweaver CS6 + PhoneGap 1.7

表題の通り、DW CS6を使い始めています。まぁ無料評価版ですが。なんかものすごい重いけど、それはまぁ最新のMacなら問題ないのでしょう。

で、今日はさくっと簡単にアプリをiPhoneの上で走らせて、そこまでの紆余曲折なんかも公開して、「いやー、ちょっとハマりましたけど、簡単ですね。はははははは」とか書こうと思っていたのですが、最後の最後、iPhoneにインストールするところで失敗してしまいます。

Androidはエミュレータ上で普通に起動するんですが。

というわけで、表題のDreamweaver CS6 + PhoneGap 1.7>iPhone4については、また今度の週末チャレンジ致します。

それにしても、これまでPhoneGap苦手ってかJavaScript苦手なんであんまり触っていなかったんですが…覚えることがたくさんあり過ぎて涙目です。

いや、まだ別にPhoneGapで行くと決めたわけではないのですが。

2012年4月7日土曜日

Androidアプリを書いて見た。



会社でAndroidアプリを書いてみました。PhoneGapなどに頼らないで、nativeなforce.com対応アプリ。書いたと言っても、Force.comのテンプレートをベースにして、Chatterとコメントを表示するだけですが。環境を整えるのに2時間、Chatterとコメントが出るようになるまで1時間。

で、感想:

  • エミュレータが超重い
  • APIなどが単純でわかりやすい
  • エミュレータが糞重い
  • やっぱりEclipseはJavaで使う分には開発環境だな
  • エミュレータが馬鹿重い
  • iPhoneのInterfaceBuilder最強(今はXcodeに統合されてるけど)
  • エミュレータが劇重い
ってところですかね。「また別のAPI習得するのは私の脳には無理だからPhoneGapにしとこう」と思ってたんですが、いつまでも好きになれないJavaScriptよりも手に馴染んだJavaで単純なAPIを相手にしている方がラクかなとも思ってます。

ツールの圧倒的な操作性の良さとAPIの美しいiOS、単純なAPIとクラッシュしても必ずエラーが出てくれるAndroid。自宅ではiPhone、会社ではAndroid…まぁ良い感じかな。

で、問題のAndroidのエミュレータですが…会社のPC(Core i2, 2GB,HD)が終了しなくなってしまうのは何故。

とにかくエミュレータには困ったもんです。Android x86入れたくても会社のPC(しつこいが今時Core i2, 2GB,HD)じゃ無理す。7980円の有線LAN仕様Android買うかなw

追記(2012/04/10):
在宅勤務用のCore i5, 3GB, Windows7だとエミュレータは何事もなかったかのように無事終了してくれます。今後Android開発はこっちでやろうっと。