Android: 現在動いているアプリ名を取得する

ちょっと今調べものをしているので、忘れないようにメモっておきます。

現在、稼働中のアプリ一覧を取得するにはどうしたらいいのかなと。
本当は稼働中のアプリのメモリ使用量も取得したいのですが、
まだ取得方法がわかってないです。ウーム、どうしたらいいんだろう?

とりあえず、稼働中のアプリ名の取得方法は以下の通り。

ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
// 現在稼働中のプロセスを取得
List<RunningAppProcessInfo> rapis= am.getRunningAppProcesses();
PackageManager pm = getPackageManager();
for(RunningAppProcessInfo rapi : rapis) {
	try {
		// processNameはパッケージ名…と思う
		ApplicationInfo ai = pm.getApplicationInfo(rapi.processName, 0);
		// アプリ名を取得
		Log.d("rapi", "AppName = " + pm.getApplicationLabel(ai));
	} catch (NameNotFoundException e) {
		e.printStackTrace();
	}
}

また追記するかもです。


Java: ArrayListから配列へ変換

忘れないようにメモっておきます。
Listから配列にデータを変換するのには、toArrayメソッドを使えばできるのですが、引数を与えないとClassCastExceptionが発生します。引数には、変換先の配列の1つめのデータとか。

参照したURLはこちら。
http://www.dab.hi-ho.ne.jp/sasa/biboroku/java/toArray.html

class ListCastTest {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        Integer[] array = (Integer[])list.toArray(new Integer[0]);
    }
}

Javaだと単なる配列だと動的に要素数が増やせないので、こういう型変換のときによく躓きますね(^_^;)


日記:BatteryCrystalのDL数が5,000オーバー!

ようやく、BatteryCrystalのDL数が5,000を超えました!
DLして使って下さっている皆様、ありがとうございます!!
このアプリは不具合があって星1つをたくさんもらってしまい、平均評価が低かったのですが、修正に時間をかけてじわじわと星の数も増えて、ようやく平均で星3.5個になりました。

これから各キャリア(ドコモ、AU、ソフトバンク)からバンバンAndroidケータイが出るので、それに合わせて別バージョンも作ろうかなと考えています。Androidのホームを華やかに彩るようなものを作っていきたいと思ってます。他にも色んな案はあるのですが、勉強もしながら、他の人達との協業もしながら、代表作と言えるようなアプリを作っていきたいと思います!

あ、Android開発の受託開発もやっていきたいと思っていますので、もしお仕事を依頼してみようかなと思われる方がいらっしゃいましたら、お声をかけてくださーい(笑)お願いします!!


日記:Android送別会

土曜日の話。
日本Androidの会 四国支部 元支部長のLionasさんが転職で東京に行かれるということだったので、四国支部の皆さんで送別会をすることになり、それに参加してきました。場所は徳島。ちなみにLionasさんとはtwitter上での交流はありましたが、会うのは初めてです(^-^;)それで送別会に参加することにしたのだから、twitterとAndroidの交流って不思議!!

まぁ普通のオフ会とは違い(そもそも普通のオフ会には参加したことはないが)、技術者同士・Android関連という共通の項目があるから心の障壁が低いのです。少なくとも自分にとっては。

今回は四国支部の支部長のxnpoさんの車に同行させてもらいました。

高速に乗っている時に話をしていたら、間違えて徳島道ではなく高松道に!!
結果的に高松道を通る事になりましたが、時間には間に合いました(^o^;)

飲み会1時間前に集合し、四国支部ミーティングが行われました。
そこで初めてLionasさん夫妻にお会いしました。
お二人ともとても話しやすい感じで、よかったです!
ミーティングの様子をUStreamで放送。ちなみに自分のDesireを使って放送しました。

その後、送別会が始まりいろいろな話で盛り上がってました。
僕は酒2杯飲んだら勝手にオチてました…。
酒飲んでも眠くならんかったらいいのに。
相変わらず弱過ぎる…。噂ではその姿を写真に撮られているとか(>_<)

それにしても、地方からの人材流出がやっぱり多いなぁと感じますね。まぁ都会に仕事が集中するのと、都会で勉強会なども活発に行われることを考えると仕方がないのかもしれません。やっぱり刺激の多いところ、やりがいのあるところに身を置きたいというのは絶対にありますし。

IT系の仕事は地方でもできるけれど、地方で活性化させるのはまだ厳しいのでしょうか?都会は圧倒的に人材数が違うから、積極的に勉強会に参加する人数もそれに比例して多いし、そういう機会も多いし。やはり地方でもそういう機会をどんどん作って活性化していく必要があると思います。都会に勉強会があるからといってそこに参加するのは交通費かかりまくってしんどいですからねー…、地方の人間は。年に数回のイベントとかだったら都会でも参加したいですが。

とりあえず、僕が今できることは、Android勉強会@愛媛を継続して開催すること。そして、どこかのタイミングでそれをもっとオープンな形にできればいいかなと思います。今は家でやってますからね…。できれば、他の勉強会も開催したい。でも、その前に収入源を確保せんといかんし、やるべきこと・やりたいことはいっぱいある!!


Android: C2DMは登録制!!

ここ数日、ずっと頭を悩ませていた問題が、前に進みました。
現在、C2DMに関する調査を行っていて、とりあえずC2DM経由でHelloくらい出そうぜ!と思って色々とやっていたのですが、出ないと…。何故?と…。

C2DMというのは、Cloud to Device Messageの略で、Android2.2から加わった新しい機能の1つ。クラウド上からDevice(携帯とか)に対してpush型で情報を配信できるのです。アプリによっては、クラウドからのpushを引き金にして、アプリを起動したり、通知したりできるので、色んな可能性のある機能ですね。サンプルアプリとして有名なのは、ChromeのextensionであるChrome2Phoneです。2.2端末持ってる人は試してみてもいいかもですね。

まぁ利用するには色々と制約があるのですが(Android Market必須とか、Googleが承認済みの端末に限られるなど)。

C2DMの説明はまぁこれくらいにして、詳しい実装方法はドキュメントみてくださいと。そういうのも投げなりなので、日本語ドキュメントへのリンクだけ貼っときます(←投げやり)。
http://www.techdoctranslator.com/code-google-com/android-c2dm

簡単な流れとしては、

  1. C2DMアプリを端末にインストール
  2. アプリと端末をC2DMサーバに登録する(RegistrationIDの取得)
  3. RegistrationIDをサードパーティのサーバに保存する(要は自分で準備するサーバ)
  4. サードバーティのサーバからRegistrationIDと認証トークンとその他の情報を付けてC2DMサーバにPOST
  5. C2DMサーバがRegistrationIDから端末を見つけてその他の情報をpush
  6. 端末のレシーバがIntentを受け取って、それを元にやりたい処理する

という感じ。

前半は適当にやりつつもなんとかなったのですが、4番目のサードパーティのサーバ(今回はGAEを採用)からC2DMサーバへのPOSTがうまくいっていませんでした。ちゃんとClientLogin APIを使ってAuthTokenを取得してPOSTしているのにも関わらず、401 Unauthorized を受け取り続けて、原因が全く不明でネットで調べまくっても出てこないし、英語のサイトを読んでいてもなかなか出てこない…。(探し方がヘタなのかもしれないけど)

コードのほうに原因があると思っていたので、そっちばかりを検索していたのですが、原因は違いました。

なんと、C2DMアプリは登録制でした。
C2DMアプリであることを登録しておかないと、サードパーティのサーバからのPOSTをC2DMサーバは受け取ってくれません。コードが原因じゃなかったのかよっ!確かに、Chrome2Phoneのソースを元に、ほぼ同じようなことを書いているにも関わらず、なぜかうまくいかなかったので、「なんかミスしてるんだろう…。俺ってJavaもAndroidも才能がないんだろうな、トホホ…(ToT)」と完全に思ってました。
ちなみに登録制であることを発見したのはここの中盤辺りでした。
Google Group の android-c2dm の No, not 401 again!

C2DMのサインアップはここ→ C2DM SignUp

これってみんな知っていることなんだろうか?
全然知らなかったんだけど…。

登録後は、ソースを全くいじらないでC2DMできるかテストしたら、すんなりと成功しました!!できた時の感激ったらないですね!!(そら10時間以上悩んでいたからな…)

C2DMサーバから401喰らいまくって心折れそうになっている人を助けることができたら幸いです。