2014年11月27日木曜日

【Android】アカウントマネジャーから取得するアカウント情報はGoogleのもの以外のもの含むらしい

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

//アカウントの一覧を取得
AccountManager account_manager = AccountManager.get(getApplicationContext());
Account[] google_accounts = account_manager.getAccounts();

for(Account google_account : google_accounts){
    if(google_account.name.matches(".*@gmail.com")){
        System.out.println("gmail : " + google_account.name);
    }else{
        System.out.println("gmailではない : " + google_account.name);
    }//if
}//for
--------------------------------------------

Androidで、上記のような処理によって、端末からアカウント情報の一覧を取得するとする。
配列「google_accounts」には、Googleのアカウント(@gmail.com)だけが入るかと思ったら、実はそうでもない。

「SkyDrive」「au ID」のような文字列もまじる。

グーグルアカウントだけを抜き出したい場合は注意する。

--------------
追記:
getAccountsByType("com.google")
というメソッドを使えば Googleのアカウントだけ取れるらしい。

2014年11月26日水曜日

【ECキューブ】ECcube雑多メモ

仕事でECcubeを触ることになったのでいくつか細かいことをメモ。
前職でもECキューブは多少触ったのですが今の仕事ではよりプログラミング的な場所を扱っています。

【テンプレートで、配列のサイズを表示する】
<!--{配列|@count}-->
モディファイラ「count」を使い、さらに、その頭に「@」を付ける。


【独自プラグインを作る】
 \data\module\Smarty\libs\plugins のディレクトリに、「function.任意の関数名.php」の名前でファイルを作る。
ファイルの中身は、

-----------------------------
function smarty_function_任意の名前($params, &$smarty){
    //任意の処理
     return 任意の値;
}//function
-----------------------------
こういう感じ。

サンプルプラグインをGitHubにおいてみました。
https://github.com/ishiitakeru/Eccube_plugins/blob/master/function.dump.php


【プラグイン側からテンプレート変数を作る】
$smarty->assign("変数名", 値);

のように書くと、テンプレート側で
<!--{$変数名}-->
という変数になる


【繰り返し処理】
for($i = 0; $i<5; $i++){}//for

の書式をECキューブで表現する。

繰り返しにはsectionタグを使う
<!--{section name="count" loop=4 start=0 step=1 }-->
<!--{/section}-->

<!--{section
    name = "識別子" ループ内で「<!--{配列名[識別子]}-->」と書くと、ループ中のインデックス番号が入る。$は不要。クオーテーション忘れずに。単独では出力できず、配列のインデックスとして使う。
    start= スタート番号
    loop = ループの終わりインデックス番号(または配列のテンプレート変数)
    step = インデックス番号の増分
}-->


ループ回数のインデックス番号は「<!--{$smarty.section.name属性値.index}-->」となる。
<!--{section
    name="CheckedItems"
    loop=10
}-->
    <p><!--{$smarty.section.CheckedItems.index}--></p>
<!--{/section}-->


【データベースをいじらないと使えない変数】
ECキューブが使ってるのに自分が書くと使えない、ECキューブの関数について。
こういうやつ
■<!--{$arrCartList}-->
■<!--{$tpl_login}-->

どうもこれらを使うには、データベースをいじらないといけないらしい。
該当テーブル「dtb_bloc」
該当コラム「php_path」


【$arrTree】
商品カテゴリの連想配列。
$arrTree を使うには frontparts/bloc/category.php がdtb_blocテーブルでこのブロックに関連付けられている必要がある。

$arrTree[0].level
$arrTree[0].category_id
$arrTree[0].category_name|h
$arrTree[0].product_count|default:0
みたいにつかう。


【クッキーの使い方】
<!--{$smarty.cookies.クッキー名}-->

【配列】
<!--{$配列名[インデックス番号]}-->

【連想配列】
<!--{$連想配列名.キー名}-->

【HOMEのURL】
<!--{$smarty.const.TOP_URL}-->

【選択中のデザインテンプレートのディレクトリ】
<!--{$TPL_URLPATH}-->
「/user_data/packages/default/」みたいな文字列

【サイトのルートディレクトリ】
<!--{$smarty.const.ROOT_URLPATH}-->
「/」みたいな文字列

【商品画像の保存パス】
<!--{$smarty.const.IMAGE_SAVE_URLPATH}-->

【商品の詳細ページ】
<!--{$smarty.const.P_DETAIL_URLPATH}-->

【ログイン状態を調べる】
ログイン状態を調べるプラグインを作成しました。
ログインブロックなどが使っている変数はデータベースをいじらないと他のブロックで使えないので。
https://github.com/ishiitakeru/Eccube_plugins/blob/master/function.getter_login_condition.php

2014年11月18日火曜日

【Android】Google Analyticsが動かない → analytics.setDryRun(true); に注意

開発中のアプリ、数カ月前に一度問題なく実装していたGoogle Analyticsのロジックを修正しないといけなくなり、久しぶりに触る。

なんと、トラッキングされない。
色々修正したり動いていた頃のコードを見なおしたりしてみても原因が判らず、半日費やしてしまった。

原因がわかった。

【Dry Run フラグ】
この SDK に備わっている dryRun フラグをセットすると、Google アナリティクスにデータが送られなくなります。
https://developers.google.com/analytics/devguides/collection/android/v4/advanced?hl=ja

コードを見ると
analytics.setDryRun(true);

自分でトラッキング無効の設定にしていたのだ!!!

AndroidのGoogle Analyticsが、コードは正しいはずなのにトラッキングが取れないという場合、ここに注意しましょうねという話でした。

2014年11月7日金曜日

【Android】アセットフォルダの中身を端末にコピーする

assetsフォルダの中身を端末にコピーして使うという技がよく登場する。
たとえばCで書かれたライブラリを使わないといけない場合など。AndroidNDKを使っての連携とかごちゃごちゃややこしいことをやらされる。
Cで書かれたコードからはアセットフォルダの中身にアクセス出来ないらしい。だから端末にコピーしたファイルのパスを渡してやる必要が生じる。

ややこしいけど、以下のふたつは別物と考える。
■アセットフォルダの中身(開発している時ローカルにファイルがある)
■端末にコピーされたファイル(インストール後、端末の保存領域に登場する=ローカルの時は存在しない)

WebViewなんかで読み込ませる時、上記ふたつはURLが違う。

アセットフォルダ内
    file:///android_asset/ファイル名
     →これは多分、AndroidにインストールされたAPKファイルの中に存在する。

端末にコピーしたもの
    file:///data/data/パッケージ名/files/ファイル名
    ※URLでなくファイルパスで言うなら「/data/data/パッケージ名/files/ファイル名」



今回のメモの中心の話題。
********
アセットフォルダの中身を、ディレクトリ構造を維持したまま、端末の 「/data/data/パッケージ名/files/」以下にコピーしたい。
********

要点だけいうと、
■ディレクトリだけあらかじめ端末内に作っておく。
■端末へのファイル出力は「/data/data/パッケージ名/files/」直下にしか出来ない。
■ファイルを書き出した直後に、 ここにあってほしいというディレクトリに、書き出したファイルを移動させる。

そのままコピペで使えるソースじゃなくて申し訳ないが、ファイル書き出し直後に次のようにして移動の処理を作ったらうまく行った。
***********
/////////////////////////////////////////
//書き出したファイルを適切なディレクトリに移動
File file_in_old_place    = new File(書き出したばかりのファイルの端末内ファイルパス);
//望ましい保存場所
File file_in_proper_place = new File(ファイルの、そこにあってほしいという端末内ファイルパス);

//リネーム(ディレクトリ変更が出来るメソッド)
file_in_old_place.renameTo(file_in_proper_place);
***********


1メガを超えるファイルを端末内にコピーしたい時、ZIPにしておいて解凍するというテクがあるけど、これにも応用できた。
■アセットフォルダ内に大きなZIPを置いておく。1ファイルで1zip。
■「/data/data/パッケージ名/files/」直下に解凍。
■移動先ディレクトリを作っておく。
■解凍されたファイルをrenameTo()で移動。


【Android】アンドロイドアプリのランチャーアイコン入れ替え

アンドロイドアプリのランチャーアイコンは、リソースの画像フォルダ内の「ic_launcher.png」を上書きすることで入れ替える。
複数のフォルダに入っているので注意が必要。それぞれリサイズして適切な大きさにして保存する。

drawable-xhdpi 96x96
drawable-hdpi  72x72
drawable-mdpi  48x48
drawable-ldpi  36x36

参考
https://sites.google.com/site/startandroidprograming/3-android-sdk-tool/ranchaaikonwo-bian-gengsuru

2014年11月6日木曜日

【Android】「Android NDK でjni下のソースをコンパイル」ってなんだ?

仕事で使おうとしているライブラリのインストールマニュアルを読んでいて、こういうのにぶつかった。

Android NDK でjni下のソースをコンパイルしてください。



この項目のところで詰まった。
Android NDK でjni下のソースをコンパイルってなんだ?

うまく行ったらしいのでやったことをメモ。

AndroidNDKのインストール:
AndroidSDKのインストールされているフォルダに、AndroidNDKのファイルをひと通りダウンロード&解凍済み。
AndroidNDKはまずファイルを一揃いダウンロードして、然るべきディレクトリに解凍することろから。
http://developer.android.com/tools/sdk/ndk/index.html

こういう階層になっていた。「ndk」というのは多分解凍フォルダをリネームしたもの。
C:\Users\takeru\AppData\Local\Android\android-sdk\ndk

環境変数のPathにNDKインストールディレクトリを追加
コントロール パネル\すべてのコントロール パネル項目\システム
システムの詳細設定>環境変数
Pathの項目に
C:\Users\takeru\AppData\Local\Android\android-sdk\ndk;
を追加。「;」が区切り文字

「jni」フォルダが鍵。
■CやC++で書かれたネイティブのソースがここに入っている
■コンパイルの際にコンパイル命令の詳細を定義する「Android.mk」「Application.mk」が入っている。
■コンパイルのコマンドである「ndk-build」は、ウィンドウズのコマンドプロンプトから実行するもの。
■コンパイルのコマンドである「ndk-build」は、この「jni」ディレクトリまでcdコマンドで移動してから、ここで行う。

つまり、CやC++で書いたソースをAndroidで使いたい場合、
■Androidプロジェクト内に「jni」ディレクトリを作成
■「jni」ディレクトリ内に「Android.mk」「Application.mk」を作成(内容の書き方は詳しくはわからないけど)
■AndroidNDKをインストールし、環境変数のPathにNDKディレクトリを通して「ndk-build」コマンドを使用可能にし、「jni」ディレクトリにて実行
→Androidと連携できるようにコンパイルされるということらしい。

【重要】
コマンドプロンプトで「jni」ディレクトリまで現在位置を移動してから「ndk-build」コマンドを実行すること。
CドライブからDドライブに移動するには「cd /d D:」


----------
基礎知識
----------
Android NDKとは?
    Android Native Development Kitの略称である。
    Androidアプリケーションの一部または全部をC/C++言語で開発するためのキットです。
----------
JNI とは
    Java ネイティブインターフェイス ( Java Native Interface ) のこと。
    Java プログラミング言語で書かれたコードに対し、C や C++ で書かれた関数があるネイティブコードと相互にやり取りする手段を定義するもの。
----------