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しているだけです。

Android4.0でタッチフォーカス(マニュアルフォーカス)実装

Androidのカメラアプリでのオートフォーカス実装は何度もやったけど マニュアルフォーカス(MF)は未経験でした。
デフォルトカメラアプリには往々にしてMFがありますが マーケットアプリにはほとんどない現状。
カメラアプリを貪っていると唯一lgcameraが実装してました(他にもいっぱいあると思うんですが見つけられなかった。。。)

でも2.XシリーズだとMFが動かずICSだとMFが効く。
ということはネイティブでMFやるにはICSが必要ということか。
勉強不足を実感しました。。。

調べたところCAMERAクラスのsetFocusAreasを利用することでcamera#autofocusのfocusのエリアを変えられる模様。

touchイベントからとったview座標をプレビューの座標に変換。

座標をRectに変換。
weight(よく分からないけど1000で良い感じになった)と一緒にList<Camera.Area>型でCamera.ParametersのsetFocusAreasに渡してやればフォーカスエリアの変更完了。

Viewには何の変化もないけど、同じタイミングでautofocus(null)を呼んであげると
フォーカスエリアが変化していることが分かり易いはず。

ただし、端末のカメラが対応していないと落ちるので
Camera#getParameters().getMaxNumFocusAreas()>0
のときだけ使うようにしましょう。

ちなみに同じ方法で測光を行うsetMeteringAreasも使えます。

2012年11月20日火曜日

AndroidからInstagramへの連携2

先日のInstagramへの連携が非公式過ぎるので考えなおしました。
あんざいさんの http://y-anz-m.blogspot.jp/2010/03/android-action.html を参考に暗黙的Intentで呼ばれるアプリ一覧を取得し そこからパッケージ名、クラス名を取得してInstagramを起動しています。
 

  Intent intent = new Intent();
  intent.setAction(Intent.ACTION_SEND);
  intent.setData(imageUri);
  intent.setType("image/jpg");
  intent.addCategory(Intent.CATEGORY_DEFAULT);
  PackageManager pm = getPackageManager();
  List resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
  String className = null;
  String packegeName = null;
  for(ResolveInfo info :resolveInfos){
   if("Instagram".equals(info.loadLabel(pm)) || "instagram".equals(info.loadLabel(pm))){
    className = info.activityInfo.name;
    packegeName = info.activityInfo.packageName;
    break;
   }
  }
  if(className != null && packegeName != null){
   intent.setClassName(packegeName, className);
   intent.setAction(Intent.ACTION_SEND);
   intent.setType("image/jpg");
   intent.putExtra(Intent.EXTRA_STREAM, imageUri);
   startActivity(intent);
  }else{
   //Instagramがない場合の処理
  }

これなら堂々と使えるかな。

2012年11月16日金曜日

AndroidからInstagramへの連携

InstagramにOauth認証して写真をアップロードするアプリを作ろうとしたんですが Instagram DeveloperによるとアップロードのAPIは 提供されていない模様。
(見つけてないだけ?知っている方いれば教えてください) 

やむなく暗黙的Intentで投げるしかなくなったわけですが、Intent.ACTION_SENDでstartActivityしたら 出るわ出るわ違うアプリがww
2〜3個ならまだしもスクロールしないとInstagramが出てこないのは問題なのでいろいろと試したところ


 
   Intent intent = new Intent();
  intent.setClassName("com.instagram.android", "com.instagram.android.activity.MainTabActivity");
  intent.setAction(Intent.ACTION_SEND);
  intent.setType("image/jpg");
  intent.putExtra(Intent.EXTRA_STREAM, imageUri);
  //例外処理は省略してます
  startActivity(intent);

でInstagramを直接起動して画像をUriで渡せました。
ただし、トリミングから始まります。

これしかないのか。。。非公式だからいつ使えなくなるかも分かりません。。。

 iOSだとURLスキーマで良い感じに呼べるんですが、InstagramさんAndroidもお願いします。