2013年8月21日水曜日

【Android】日時の取得でミリ秒までとりたい時【メモ】

積極的にメモをとろうキャンペーン実施中(超個人的)

【本題】Androidで自分の好きなフォーマットで日時を取得しようとした
ちなみにこんなフォーマット→「時:分:秒.ミリ秒」

【問題発生】以下のようなコードにした時
String date = DateFormat.format("kk:mm:ss.SSS", Calendar.getInstance()).toString();
結果が「09:30:25.SSS」(←例)のようにと取れてしまった… =ミリ秒部分がとれない 【解決策】コードを以下のように修正
SimpleDateFormat DF = new SimpleDateFormat("HH:mm:ss.SSS", Locale.JAPAN);
String date = DF.format(new Date());
DateFormatクラスとSimpleDateFormatクラスとで 扱えるフォーマットが結構違うのでしょうか? Locale 指定うんたらが面倒そうなのでDateFormatクラスの方を使いたかったのですが… 今回はLocale.JAPANで固定.うーんわからん. (気になる記事→「Locale.getDefault()が期待した値を返さない?」) 参考サイト様:Y.A.M の 雑記帳 様 SimpleDateFormatではなくandroid.text.format.DateFormatを使おう 等

AndroidのOTAがふってこない時に試す事【メモ】

OTAがなかなかふって来ない時に試す事柄を
毎度ぐぐっているので自分用にメモです

①「設定」を使った方法 1.設定→アプリ→すべて→Googleサービスフレームワーク→強制停止→データを消去 2.設定→端末情報→システムアップデート→今すぐ確認

②「ダイヤルパッド」を使った方法 1.ダイヤルパッドを起動して*#*#checkin#*#*(実際は*#*#2432546#*#*)を入力 2.通知で「checkin succeeded」(または「checkin failed」)と出るまで待つ 3.通知が出たら設定→端末情報→システムアップデート→今すぐ確認

③↑の①・②のあわせ技 ①の1.をやってから②をやる

上記の方法を何度も繰り返す …Nexus4(4.2.2)で上記の方法を合計20回くらいやりましたが 4.3がふってきません…orz

2013年8月9日金曜日

【Android】サービスが起動しているか確認する方法【メモ】

指定のサービスが起動しているか確認する方法
String mServiceName = MyService.getSimpleName();

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  List<runningserviceinfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
  if(services!=null){
   for(RunningServiceInfo info : services){
    if(info.service.getClassName().endsWith(mServiceName)){
     Log.i(TAG, mServiceName + " Running!!");
     break;
    }
   }
  }


参考元:Androidプログラマへの道 様 「起動中のサービス一覧を取得する」

2013年8月7日水曜日

Android版 Bluetooth Low Energy (メモ:途中)

まずはAndroidDeveloperのBLEページの訳から…英語ワカラナイネ
(間違いだらけだと思うのでご指摘いただけると幸いです…)

【Bluetooth Low Energy】
Android 4.3(APIレベル18)からBLEをサポートした組込みプラットフォームが登場しました。Central Roleとして機能し、デバイスの探索やサービスの要求、キャラクタリスティックの読み込み/書き込みを行えるAPIが配給されています。

Classic Bluetoothとは対照的に、BLEは省電力消費で提供するように設計されています。これによって、Androidアプリは近接センサーといったBLE端末(心拍計、フィットネス端末等…)と低電力なやり取りを行えます。



【Key Terms and Concepts(主な用語と概念)】
以下、BLEの重要な用語や概念の要約になります

■Generic Attribute Profile(GATT) 
GATTプロファイルとは、BLEリンク層において「属性」と称した小さな情報の欠片の送受信に関する一般仕様となります。現在全てのBLEアプリケーションのプロファイルはこのGATTに基づきます
BluetoothSIG(Bluetoothの規格策定や認証を行う団体)はBLEに対して多くのプロファイルを定義しています。プロファイルとは特定のアプリケーション内で端末がどのように働くかの仕様を指します。 ここで留意すべき点は、デバイスは1つ以上のプロファイルを持てる事です。たとえば1つの端末が心拍計や電池残量計の両方を兼ねることができます

■Attribute Protocol(ATT)
 GATTはAttribute Protocolの頂点に組み込まれています。これらはよくGATT/ATTと呼ばれます。 ATTはBLE端末上で動作するよう最適化されています。その為に、できる限り少ないバイト数で使用します。 各属性はUUID(Universally Unique Identifier)によって独自に識別されます、UUIDは一意の情報を識別するための文字列で、128bitの標準化されたフォーマットとなっています。 ATTによって送信された属性はCharacteristicとServiceで形成されています。

■Characteristic 
Characteristicは単一値(Characteristic値)と0-n個の記述子を含んでいます、記述子はCharacteristic値を説明します。 Characteristicはクラスと類似したタイプとして考えることができます。(※個人的見解:オブジェクト指向のクラスのように継承することができる,といった特性の事を指しているのだと思います…たぶん)

■Descriptor
 DescriptorはCharacteristic値を表すAttributeによって定義されます。例えば、Descriptorは人間が読める説明やCharacteristic値の許容範囲、Characteristic値の仕様を表す大きさの単位を明記します。 

■Service 
ServiceはCharacteristicの集合です。例えば、心拍計と呼ばれるサービスを持っているとしたら、それは「心拍数の測定」というCharacteristicを内包したサービスになります。既存のGATTベースプロファイルやサービスのリストはbluetooth.orgで見ることができます。



【Roles and Responsibilities (役割と責務)】
ここではBLEデバイスとAndroid端末との相互作用による 役割と責務について説明します。
■Central vs Peripheral これらはBLEの接続自体に適応されます。Central Roleの端末はアドバタイズメントを見つけて、そしてアドバタイズメントを生成しているPeripheral Roleの端末をスキャンします。
■GATTサービス vs GATTクライエント 接続を確立した2つの端末間でお互いどのように話をするかを決定する。

これらの特徴を理解するためには、Android電話と活動追跡装置であるBLE端末を持っている事を想像してみてください。電話はCentralRoleをサポートします、活動追跡装置はPeripheralRoleをサポートします(BLEコネクションをはる為には2つの装置が必要です、Peripheralのみサポート/Centralのみサポートする同士では話す事ができません)。

一度電話と追跡装置が接続すると、それらは一度だけGATTのメタデータを互いに送信します。送信データの種類によって、いずれかの端末はサーバとして振舞うかもしれません。例えば、活動追跡装置が電話に対してセンサーレポートを送信したくなった場合、活動追跡装置はサーバとして振舞うというのは理に叶っている。もし追跡装置が電話から更新情報を受信したい場合、電話がサーバとして振舞うというのは理に叶っている。

本ドキュメントの例(サンプルコード)では、Androidアプリ(Android上で動作している)がGATTクライエントになります。このアプリケーションはGATTサーバ、この場合はHeartRateProfileをサポートしたBLE心拍計からデータを取得します。しかしあなたはGATTのServerRoleを担うアプリケーションを構築する事ができます。 詳しくはBluetoothGattServerをご覧ください。



【BLE Permissions (BLEのパーミッション)】
Bluetooth機能をあなたのアプリケーションで使用するには。BLUETOOTHパーミッションを宣言する必要があります。 このパーミッションはBluetoothのコミュニケーション…接続の要求や受諾、データの送信等に必要になります。

もしもあなたのアプリケーションにデバイスの探索を開始させたい、またはBluetoothの設定を操作させたい場合はBLUETOOTH_ADMINも宣言する必要があります。勿論、BLUETOOTHパーミッションも宣言する必要があります。

〈uses-permission android:name="android.permission.BLUETOOTH"/〉
 〈uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/〉 

もしもBLE対応端末のみ使用できるようにしたい場合は、マニフェストに以下の文を追加します
 〈uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/〉 

しかし、もしもあなたのアプリケーションをBLE非対応の端末でも使用できるようにしたい場合でも、あなたは先の要素をマニフェストに入れるべきです。ただし「required=“false”」と記載します。 この時、ランタイムはPackageManager.hasSystemFeature()を使ってBLEが利用可能かを判定することができます。



【Setting Up BLE (BLEの構成)】
あなたのアプリケーションがBLEを介して通信をする前に、端末がBLEをサポートしているか検証する必要があります。対応している場合は、次にBluetoothが有効になっているかの確認も必要になります。ここでの注意点は、 がある場合「false」にセットする必要があります

もしBLEがサポートされていない場合、潔く全てのBLEの機能を無効にする必要があります。

もしBLEがサポートしているけれど無効にされている場合、アプリケーションを離れずにBluetoothを有効にするよう要求することができます。この設定はBluetoothAdapterを利用して2ステップの処理を遂行する必要があります。
1.BluetoothAdapterを取得する
2.Bluetoothを有効にする
(省略:原文のページを参照)



【Finding BLE Devices (BLE端末の発見)】
BLE端末を発見するには、startLeScan(BluetoothAdapter.LeScanCallback)メソッドを使います。このメソッドはパラメータとしてBluetoothAdapter.LeScanCallbackを取得します。あなたはこのコールバックをimplementしなければいけません、なぜならそれはスキャン結果を返す方法だからです。スキャンはバッテリーを消耗しますから、あなたはガイドラインを遵守すべきです:
・目的のデバイスを発見したら、即座にスキャンを停止してください
・スキャンをループさせないでください、また、スキャンにはタイムリミットを設けてください。デバイスが範囲から外れることをあらかじめ可能にしておきます

もしも特定のタイプのペリフェラルのみをスキャンしたい場合、startLeScan(UUID[], BluetoothAdapter.LeScanCallback)を代わりに使うことができます。あなたがサポートしたいGATTサービスを指すUUIDの配列を提供してください。

※注意:ここでスキャンできるのはBluetooth LE端末 又はClassic Bluetooth端末のどちらかのBluetoothです。同時にBluetooth LE端末とClassic Bluetooth端末の両方をスキャンすることはできません。



【Connecting to a GATT Server (GATTサーバとの接続)】
はじめに、接続していて相互作用を持っているBLEデバイスに対し、さらにGATTサーバーとの接続を行います。BLE端末上でGATTサーバーとの接続をするには、connectGatt()メソッドを使います。 このデバイスは3つのパラメータを取得します:Contextオブジェクト、autoConnect(できるだけ早く利用可能になったBLE端末と自動で接続したかをBooleanで示す)、そしてBluetoothGattCallbackとの関連:

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

このGATTサーバーとの接続はBLE端末が主催となっている、そしてBluetoothGattインスタンスを返しています。これはGATTクライアントの操作に使用できます。呼び出し側(Androidアプリ側)がGATTクライアントになります。 BluetoothGattCallbackはクライアントに結果を配達するのに用いられます。 例えば接続状態、ならびにこれ以上のGATTクライアントの操作が配達されます。

例では、BLEアプリケーションが接続のためのDeviceControllActivityを提供しています、ここでデータの表示、サポートしているGATTサービスとCharacteristicの表示をしています。ユーザからの入力に基づいて、このActivityはBluetoothLeServiceで呼び出したServiceとコミュニケーションします、このやりとりはAndroid BLE APIを経由してBLEデバイスと行われます。

特定のコールバックが発動した時、それは適切なbroadcastUpdate()ヘルパーメソッドを呼び、アクションを渡します。※このセクションでのデータ解析はBluetoothの心拍計測定のプロファイルの仕様に従っている事に注意してください。
 DeviceControlActivityの裏では、ブロードキャストによっていくつかのイベントが処理されています。
一度GATTサーバーとサービスに接続できれば、サポートされている属性の読み込み/書き込みができるようになります.



【Receiving GATT Notifications (GATT通知の受信)】
デバイス上で特定のCharacteristicが変化した際に通知するようにお願いする事はBLEアプリケーションでは一般的です。 通知してほしいCharacteristicに対し、setCharacteristicNotification()メソッドを使って通知をセットします。

一度通知が使用可能になると、遠隔端末上でCharacteristicが変化した際にonCharacteristicChanged()コールバックが発動します。



【Closing the Client App(クライアントアプリを終了する)】
あなたのアプリケーションがBLE端末の使用を終了する時点で、システムが適切にリソースを開放するようにclose()メソッドを呼ぶべきです。


※※サンプルコードについては省略(後日追記予定)※※

2013年4月5日金曜日

ロリポップ!でHTML中に埋め込んだPHPがうまく動かなかった時の対処法メモ

PHPを使った事が無く、「Hello PHP!!」といわせるという出だしから
躓いて相当あせりました…:(;゙゚'ω゚'):

①ユーザ管理画面の左メニュ-で
「webツール>php設定」⇒対象のドメインの右横「設定変更へ」
⇒「php_value, php_flagを利用可能にする」をONにする

②(.htaccessファイルが無い場合、テキストドキュメントで作成)
.htaccessファイルに「AddHandler phpx.x-script .html」と入れて保存
※x.xのところは使用するPHPのバージョンを入れる
※htaccessの最後に改行入れるの忘れない!!

③ロリポップFTPを開いてルートディレクトリに.htaccessファイルをアップデート
(=指定ドメインのファイル全体に.htaccessの設定が反映される)


これでうまくいきました…ふぅ

(参照:「ロリポップでphpをhtmlファイルで動かすときのhtaccessの設定」
http://webdrawer.net/html/lolipophphtaccess.html)

あ、あと文章の一行目以外にインデント入れる方法、参考にさせていただきました
⇒「ぶら下げインデントしたいときに使うHTML」
http://www.shiyouan.com/copypaste/662.html

2012年11月26日月曜日

WebViewでvideoタグのページを閲覧する

現在HTML5関連のお勉強をしています。
スマートフォンの端末やブラウザソフト毎に対応がバラバラなのがネックですね…。
というわけで、今回の話題はHTML5から動画ファイルの再生を容易にしたvideoタグについて。

ためしに
 <video width="***" height="***" autoplay loop>
 <source src="../movie/movie.mp4"></source>
 <source src="../movie/movie.webm"></source>
 </video>
こんな感じのタグを埋め込んだHTMLファイルをサーバに置き、
Android端末から色々なブラウザで閲覧してみました。

Android(docomo GalaxyNexus OS_4.1.1)
 ・Android標準ブラウザ 4.1.1 ⇒ ○ 
 ・FireFox 17.0 ⇒ ○
 ・Chrome 18.0.1025464 ⇒ ○
オプションの有効無効などの多少の差異はありましたが
ブラウザアプリを立ち上げて見る分には問題無い事を確認。


…で、問題が、AndroidのWebView、でした。


AndroidのWebViewでVideoタグを見ようとすると、
プレイヤーは表示されるのですが再生ボタンを押しても何も表示されない。
カーソルだけが動く、でもそのカーソルも操作しようとすると
謎の挙動を起こす、そして表示は相変わらず何も起こらない。
そんな感じでした。

そんな馬鹿な!!と、なんとかAndroidWebViewでvideoタグを閲覧する方法をググらせて頂くと
ちゃーんと用意してくださっている方がいらっしゃる。ありがたやありがたや…
http://code.google.com/p/html5webview/
http://www.tandroid.org/html5webview

1.ココ
 「Source」タブに記載されているリポジトリからSVNを用いてソースコードを頂く
 ソースコードはhtml5WebViewを用いたサンプルプロジェクトになっている

2.自分のプロジェクトを作成するなりなんなりする
 忘れない内にAndroidManifest.xmlファイルにInternetのパーミッションを指定しておく

3.先程頂いたプロジェクトファイルから複製する
 ・srcの…HTML5WebView.java
 ・リソースフォルダの…
  drawable/default_video_poster.png
  layout/custom_screen.xmlとvideo_loading_progress.xml
  value/colors.xmlとstrings.xml(既に作成されていたらマージする)

4.あとはWebViewを用いるところをHTML5WebViewで作成する
 HTML5WebViewインスタンスの生成はこんな感じで
 HTML5WebView webView ⇒ webView = new HTML5WebView(this)
 (基本サンプル様のやり方をまねればOK!!)

これで動く…はず!!


おまけ:
 上記の方法で普通は動くけれども、
 私の場合はおまけで以下のようなエラーが発生したのでメモです。

Caused by: java.lang.IllegalStateException: The specified child already has a parent.
You must call removeView() on the child's parent first.


HTML5WebViewインスタンスをLinearLayoutに埋め込もうとしたのですが
当のHTML5WebViewインスタンスが
「既に親のオブジェクトを持ってしまっているので、
指定のオブジェクト(今回の場合はLinearLayout)を親にする事が出来ません。
現在の親オブジェクトの指定を取り除いてください」という事らしいです。

ViewGroup parent = (ViewGroup)webView.getParent(); 
if ( parent != null ) { //webViewの親グループを削除しておく
parent.removeView(webView);
}

こんな感じに親オブジェクト(グループ)を削除。
無事、指定のLinearLayoutにaddView()で挿入する事ができましたv
(参照サイト様:http://d.hatena.ne.jp/Kazzz/20100603/p1)

2012年11月1日木曜日

リンゴさんに文句言いたくなるわ。

役に立つか分からないメモ、というより愚痴です。
愚痴、いいたくなりますよ。リンゴさん。

[事のいきさつ=結構どうでもいい]
つい先日からiPhoneの方で物作り、というほどでもないのですが、やり始めまして。
開発PCのOSのバージョンが古かったんです。雪豹ちゃんです。
既存のアプリをこの雪豹ちゃんでいじろうとしましたが、
その既存アプリはもともと山獅子ちゃんで作られていて、xCodeのバージョンも違う。
だからなのか、いじれないなぁ…となりまして。
じゃあ、雪豹ちゃんを山獅子に進化?させてやりましょう、と。
[回想終了]

さて、ここからアンサイクロペディアの「たらいまわし」のごとき
ぐぐる先生をさまよう旅がはじまりました。

まずは自分のAppleIDを作らねば、と作りに行きました。
日本語のまま、ね。
名前も、住所も全てジャパニーズでしっかり登録(フラグ)

はいじゃあ作りましたという事で、次にディベロッパー登録せねばとね。登録しました。
よし、じゃあまずは普通にライオンちゃんに来てもらうかね、とライオンちゃんをクリック。

「あなたのAppleID、iTunesで使われた事ないね。レビュー見てね」
見たいな事言われて、あぁはいすみませんとレビューへ。

iTunesアカウント作ろうとしたらそこで一悶着あったんですけど、忘れました。
(登録できないーって何か暴れていた気がします…何が起こってどうやって解決したやら…)
クレジットカード登録を避ける方法ですが、
一般的な方法(無料アプリを落とす時のアカウント作成画面を利用する)は
既にAppleID作っちゃってたからか出来ませんでした出来ませんよね?
というわけで一旦カード情報登録して、即行で削除しました。面倒クセェ
四苦八苦してなんとかiTunesアカウントゲット。

よしよしじゃあライオンちゃんいらっしゃい、とライオンちゃん購入。
AppleStoreの購入一覧にかわいいライオンちゃんがいたのでクリック、すると…
「この商品、日本じゃサポートしてないよ?」的なメッセージ。
…………は?(゜Д゜#)
いやいや何血迷った事言ってくれるのさ、そんなわきゃねぇだろ、と
AppleIDか、はたまたiTunesアカウントが悪さしているのか。

この理不尽なメッセージは海外の商品を購入する際によく出るメッセージだそうで。
いや、でも、これOS…
とりあえず、iTunesアカウントの国籍を一旦米国にさせていただくかな、と変えようとしたら
「このアカウント、日本じゃねーと使えねぇから!!(お前席ねぇから風」って突き放されちゃいまして。
え、じゃあAppleIDは?とためしにやったら、
こっちはこっちで「無理。あんたの時計が狂ってるか、Appleのクッキー有効にしろや」と怒られた。え、意味分からん。

~ここで半日程無駄にする~

上記のような意味不明状況の解決方法。

AppleStoreで無料のソフトを落とす。

(ここでも雪豹ちゃんが古いせいで「バージョン古いwwwごめん対象外だわwww」って
はじかれまくった。対象スペックの欄が見つからないんですって…)
その時に3つの魔法の言葉ならぬ質問と、
AppleIDに登録したのとは別のメアドを登録ってページになってぽちぽち記入、進む。

そしたら。急に、ライオンちゃんのダウンロードが開始してた。

…(゜Д゜)

…(゜Д゜)

?(゜Д゜)

何事もなかったかのようにダウンロードを終えて、ついでに無料ソフトもばっちり入ってました。
……………………………………………………………
…………………………えぇえええぇえええ!!?
何、が、起こったし…わけがわからない。


そして最初の死亡フラグ、AppleID作成時に日本語入力した項目が
ばっちりバグっとります(現在進行形)
「日本語で登録すると名前が修正できなくなって、厄介な事になるよ!!」と
ぐぐる先生回っている最中に知ったので「え」となって
あわてて修正しにいったのですが時既に遅し。

メンバーページに行くと「Hi,(日本語名前)(英語姓)」となる。
…名前が日本語のままになって直らないらしいですね…
MyInfoってページで直せるという噂があったのですが繋がりませんでした。
これからAppleID作られる方は御気をつけて…。