2014年10月31日金曜日

VolleyのImageLoaderを使ったListViewでの画像ちらつき制御

ListView内のImageViewでURLから画像を取得する際
Viewの再利用時にImageViewがちらつくことがあります。

ImageViewにURL文字列をタグ付けしてgetView()内でURL比較、URLが異なる場合だけ画像取得する、なんて手法が取られてました。

VolleyのImageLoaderを利用した際も同じようなことができますが更にスマートに実現できました。

ListViewとImageLoaderといえば、この記事にてImageContainerをImageViewにタグ付けしてView再利用時にImageLoaderのcancelを行うのが出ていますがこれを利用します。


ImageContainer mContainer = (ImageContainer)holder.imageView.getTag();
if(mContainer != null && mContainer.getBitmap() != null && mContainer.getRequestUrl().equals(url)){
holder.imageView.setImageBitmap(mContainer.getBitmap());
}else{
ImageListener imageListener = ImageLoader.getImageListener(holder.imageView, 0, 0);
ImageContainer mContainer = mImageLoader.get(url, imageListener);
holder.imageView.setTag(mContainer);
}

ImageContainerは前回取得した画像のBitmapとURLを持っています。
あとは単純にBitmapを持っていてURLが一緒だったらそのBitmapをImageViewに設定。
異なっていたらいつも通りの処理。ってだけです。
※ImageLoaderのget時に都度newされているためBitmapとURLの整合性は取れていると思っていいです。


2014年10月30日木曜日

GenymotionのFailed to import OVAエラー

久しぶりにGenymotionを使おうとしたら起動しなくなってしまっていました。
原因は不明ですがGenymotionの更新かOS更新が原因だったのでは、と思ってます。

苦肉の策でGenymotion及びVirtualBoxをAppCleanerで削除して
再インストールしたところ今度は端末登録できなくなってしまいました。
エラー内容は

Failed to import OVA

これとかこれとか見たのですが解決せず。。。

ダメ元でGenymotion Shellを実行したらアプリの認証(ダイアログのやつ)を
してなくて、これが原因で端末追加できていませんでした。

Genymotionを更新したらGenymotion Shell起動は必須のよう。

2013年12月24日火曜日

Android開発環境をAdt Bundle からIntelliJ CE に変更しました。

エンジニアの知人からイケてるエンジニアはIntelliJを使うと聞き
試しがてらIntelliJ CE(無料版)を使ってみたところなかなか良い感触だったので
本格的に乗り換えをしました。

ちなみにAndroidStudioはまだプレビュー版ということなので手はつけていません。
IntelliJ最新版の13はAndroidStudioからAndroid周りの機能を逆輸入したものらしく
Android関連は無料版でも十分とのことです(真意不明)。

1周間ほど使った感触は

・eclipse互換はありがたい
 →eclipseで作成してたプロジェクトをすんなり読み込んでくれる

・ライブラリ参照で理解に手こずる
 →コード上では参照できてるのにビルドで見つかれないとなる。
 →IntelliJのモジュールの仕組みを理解する必要あり。

・レイアウトはxmlエディターのとなりにプレビューあるのは有難い。
 →eclipseでの切り替えは地味にローディングしてしまうので。

・プログラムはコード補完はeclipseより優れてます。
 →こっちが求めてる候補が最上位に出てくる気がしてます。
 →あと地味に余分な()を入れないのでBSする手間が省けます。

・ターミナルは付属してますがFinderでファイルをコピーしてもフルパスでクリップボードに登録されないので不便。
 →adb install {フルパス} ができない。
 →adbコマンドは簡単なもののみintelliJで叩いてinstallは本家ターミナルで叩いてます。

・DDMSは別途Tool起動
 →1つのTool内で簡潔したい人は不便でしょう。
 →intelliJで出来るのはlogcatくらいです。
  ただしアプリでのフィルターは自分で検索窓に打ち込む必要があります。

・デバッグは慣れが必要な気がします。
 →僕はF6, F8でずっとやってきたのでどうしても未だにF6してしまう。
 →あと、インスペクタはどれですか?

・apk書き出しは簡単
 →一度keystoreとパスワード×2を登録してしまえば次からはクリックのみで署名付きapkにしてくれます。たまにマスターPass訊かれるけどそれでも簡単になります。

・Draw9patchはintelliJ内で起動。
 →地味に便利だけどDDMSもやってほしかった。。。

・ソース管理
 →Git、SVNはデフォルトで使える。

・DB管理
 →有料版にはViewerがあるとか。

とりあえずこれくらい。他にもあった気しますが。。。


総じてメリットデメリットありますが、個人的にはメリットが上回ってます。
なのでとりあえずこれからも使っていきます。

2013年9月27日金曜日

Jenkins導入①

Androidのテストをある程度自動化したいためJenkinsを導入することにしました。

将来的にはサーバーを立ててメンバーで共用する予定ですが とりあえず練習がてら自端末に導入してみます。

オフィシャルサイトからパッケージがDLして楽々インストールしようと思ったのですが、Mac版がDLできなかったので先人たちの知恵を借りてターミナルからインストールすることに。

Homebrew導入
http://qiita.com/skinoshita/items/fd146ac223bab433b348

Jenkins導入
http://tech.hazi.jp/2012-08/13/

おおー動いてるー!!



これから設定に入ります。

2013年3月8日金曜日

HTC J(butterfly)のメニューバー(…)を消す

HTC Jの端末で2.X系のアプリを使ったときに画面下部に出る・・・の黒いバー。 自分でも邪魔だと思ってたんですが、カメラ系を開発したときにあいつのせいで プレビューサイズと誤差が現れます。 2.X系のアプリでも消す方法を探していたのですが マニフェストのターゲットSDKバージョンを14に変える。 プロパティのbuild targetは9のまま。 で解決しました。 僕も勘違いしてたのですが、↑のふたつの要素はまったく別ものだったんですね。 ターゲットSDKは14〜の端末で14のスタイルとか振る舞いをするってだけ。 なんて簡単!!

2013年2月8日金曜日

Androidで国番号の取得

仕事でSimの電話番号と国コード(よく見る+81とか)を取得する必要があって そこそこ悩んだのでメモ。

  TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
  String number = telephonyManager.getLine1Number();
  String iccid = telephonyManager.getSimSerialNumber();
  Log.d(getClass().getSimpleName(), "TelephoneNumber " + number);
  Log.d(getClass().getSimpleName(), "ICCID " + iccid);
  
  //R.string.tel_formatの中身は+%1$s %2$s-%3$s-%4$s
  String internationalTelephoneNumber = 
    getString(R.string.tel_format, 
      iccid.substring(2, 4), 
      number.substring(1, 3),
      number.substring(3, 7),
      number.substring(7, 11));
  Log.d(getClass().getSimpleName(), "InternationalTelephoneNumber " + internationalTelephoneNumber);
良い感じに取得できた。

2012年12月19日水曜日

Facebook graph Apiで写真URLつき投稿

Facebookへの写真URLつき投稿。
自分のFeedに流れるやつです。

 写真をクリックすると写真が貼ってある外部ページに飛びます。
 link要素を付与するとシェア扱い。
pictureを無効にすると普通のFeedに。 
この内容だと写真が外部にあるものになりますが、Facebook上のアルバムにUPするためには別途画像データをバイナリで渡す必要があります。

			Builder urlBuilder = new Builder();
			urlBuilder.scheme("https");
			urlBuilder.authority("graph.facebook.com");
			urlBuilder.path("/me/feed");
			urlBuilder.appendQueryParameter("format", "json");
			urlBuilder.appendQueryParameter("method", "POST");
			urlBuilder.appendQueryParameter("message", message);
			urlBuilder.appendQueryParameter("link", params.url);
			urlBuilder.appendQueryParameter("picture", imageUrl);
			urlBuilder.appendQueryParameter("access_token", facebookToken);
			String url = urlBuilder.toString();
			String contents = getContentsByGet(url);

getContentsByGet部分は省略しました。内容はHttpClientでPostしているだけです。