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もお願いします。

2012年11月14日水曜日

getIntent()で取得する値を更新する

AのActivityに留まったままAlarmManagerからAへの新しいIntentを複数回 投げたところ、getIntet()で取得するIntentがActivity起動時のものから変わらない。
という事象が発生した。

BroadcastReceiverからはFLAG_ACTIVITY_NEW_TASKでstartIntent()しているので 更新すると思っていたが出来ないようだ。 
PendingIntentはPendingIntent.FLAG_CANCEL_CURRENTで作成しているので BroadcastReceiverの段階では更新されたIntentが来ているのは確認済み。

 GoogleのドキュメントによるとgetIntent()はActivity起動時の値を取得するためのもの であり、そのまま使用しても都度更新されるような作りではないよう。 

困り果てたとき、onNewIntet()なるActivityクラスのメソッドを発見。
onNewIntent()はFLAG_ACTIVITY_NEW_TASKでActivityを起動した際に onResume()の前に実行されるもののよう。
onCreate()からライフサイクルが始まる際には呼ばれない。 
このonNewIntentにはActivity起動時のIntentじゃなく更新されたIntentが 入ってくるのでsetIntent()にそれを引数に渡すことでgetIntent()の値を更新できる。


 @Override
 protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //画面表示時に再度起動された際にgetIntent()を更新する。
  setIntent(intent);
 }

はじめまして

はじめまして、わらふじです。
ここではAndroidの情報をメモ代わりに残していきます。

わらふじ