StaticVoid放浪記
Amebaでブログを始めよう!

AndroidアプリとTwitterの連携

時代はソーシャルネットワーク。
Androidアプリで引き籠ってましたが、外に出よう!Twitterだ!

ということで、Twitterと連携させるためにTwitter4Jを導入しました。
ちなみに私が使用したのはバージョン2.2.3

Twitterのほうで許可は出したのですが、どうもTwitterの仕様がコロコロ変わっているらしく。
既存の接続方法だとエラー吐いたりコンパイルできなかったりが続き・・・

Basic認証は廃止され、OAuth認証をしなければならない為、設定も四苦八苦
とりあえずTwitterの設定は以下サイトを参考にしました。
http://www.atmarkit.co.jp/fsmart/articles/keitaiweb02/01.html

ただし、この接続方法だと上手くいかない為、その部分だけは以下のフォーラムを参照。
http://groups.google.com/group/twitter4j/browse_thread/thread/d18c179ba0d85351

まぁ、早い話がTwitter4Jをビルドパスに追加して、Twitterのほうでとりあえず許可だして、
アプリの方で
ConfigurationBuilder confbuilder = new ConfigurationBuilder();
confbuilder.setOAuthAccessToken(accessToken).setOAuthAccessTokenSecret(accessTokenSecret).setOAuthConsumerKey(consumerKey).setOAuthConsumerSecret(consumerSecret);
Twitter twitter = new TwitterFactory(confbuilder.build()).getInstance();
twitter.updateStatus("届け僕の想い!");

こうすればいいだけです。
とりあえずこれでPOSTは確認できました。
あとはユーザーが任意でOAuth認証をする為の誘導が必要になるので、
上記サイトも参考にしつつ、その辺はまた今度掘り下げていこうと思います。

自宅サーバーの構築

今日は趣味で建てている自宅サーバーについてお話したいと思います。

ハードスペック:
CPU : Intel Core2Duo E8500
M/B : MSI P35-Platinum Combo
Mem : DDR2-PC6400 4GB
HDD : 1TB

という一世代前の構成になっています。
以前から使ってたPCの払い下げといった所でしょうか。
特に重い処理は行わない為、CPUもCore2Duoを流用しています。

サーバーを構築しているソフト:
AN HTTPD:
http://www.st.rim.or.jp/~nakata/
DropBox:
https://www.dropbox.com/

HTTPサーバーは当初CentOSにてApacheを使おうと思っていたのですが、
自宅のルーターにブリッジで接続すると不具合が起こった為、Windowsでサーバーを建てることに。
すると、Apacheがちゃんと機能してくれなかったので(既にサービスは開始していますとメッセージが出て起動できない)
上記のAN HTTPDを使わせていただいています。
設定が非常に簡単で、Windowsで気軽にHTTPサーバーを建てるには良いソフトだと思います。

次にDropBoxですが、直接サーバーとは関係ありません。
が、自宅に居ることが少ないので、出先等でDropBoxを導入し、サイトを更新しています。
FTPサーバー等を用意しなくてもいい点や、サイトに関係のないファイルを共有するのにも便利なので
非常に重宝しています。

Dropboxを導入しました

オンラインストレージをこの度初めて導入してみたのですが、
使い勝手が思ったより良好で、サーバーに設置してあるデータの更新等がしやすくなりました。

DropBox
https://www.dropbox.com/referrals/NTUyNjU5NTk?src=ab_global8

更新に数秒のタイムラグがありますので、リアルタイムでの監視は別途ツールやセキュリティソフトを
使ったほうがいいと思いますが、作業用フォルダをインターネットで共有したいなら、是非おすすめ。



「家のマイドキュメントを会社で開きたい」「バックアップを作成したい」
そんな人に是非。 容量が2GBまでなら無料みたいです。

Androidのウィジェットを動的に生成する

お疲れ様です。俺です。

随分前の記事で、Android端末にインストールされているアプリ群を取得するプログラムを掲載しましたが、
取得した後、それぞれのアプリに対して一個ずつImageViewを与えてみようと思いました。
が、人によってインストールされているアプリの数なんてまちまちですので定数のウィジェットを定義しても汎用性にかけますし、
かといって1000個も定義をするわけにはいきません。

ということで、動的に(アプリの数に応じて)ウィジェットを定義したいと思います。

以下ソース

iはあらかじめ取得したアプリの数
アプリのパッケージはAppName[]に格納済

ImageView[] Images = new ImageView[i];

PackageManager pm2 = this.getPackageManager();

int x = 0;
Drawable icon;
for(x = 0 ; x < i ; x++){
icon = pm2.getApplicationIcon(AppName[x]);
Images[x] = new ImageView(this);
Images[x].setScaleType(ScaleType.FIT_CENTER);
Images[x].setImageDrawable(icon);


と、こうなります。
ウィジェットも配列で宣言でき、XMLに宣言してあるLinearLayoutにAddViewすればいいだけです。
配列が使えるという事に気づければ、あとはなんとでもなるのではないでしょうか

Clay導入のススメ

外部にデータベースを設置したので、視覚的な管理が難しくなりました。
もちろん操作は可能なのですが、設計はしにくくなってしまいました

そこでEclipseに導入できるプラグイン「Clay」を教えて貰いました。
http://www.azzurri.co.jp/

大きなデータベースを処理しようと思うとどうしてもプロンプト上だけではやりにくくなります。

しかし、このプラグインを導入すると、Eclipse上でデータベースの基本的な設計。
SQL文の実行などが可能となり、データベースの操作性が向上します。

また、処理をEclipse上で行う事が出来る為、デバッグもしやすくなり
非常に助かっています。
CREATE TABLEなどある程度の処理はセミオートで行ってくれるため、
作業効率も向上します。

無課金状態でもなかなか役にたって貰えるのですが、ライセンス購入をすることにより
リバースエンジニアリングや、HTMLドキュメントの生成も可能となります。
使いたい方も多いのではないのでしょうか。

CMS導入してみました

どうも、俺です。

Webサーバーを試験的に立ち上げてみたのですが、ただHTML置くだけでは味気ない。
そんなこんなでCMSを導入してみることにしました。

CMSとは
テキストや画像を作成するだけでなく、HTMLやCSSなどの言語でレイアウトや装飾を行い、ページ間にハイパーリンクを設定するなどの作業も行う必要がある。これらの要素を分離してデータベースに保存し、サイト構築をソフトウェアで自動的に行うようにしたものがCMSである。

・・・だそうです。

前々から立てていたMySQLのサーバー機についでにCMSもいれてみました。
CentOSでの導入方法となりますが、簡単に説明

・・・したかったのですが、説明量がとんでもない量になってしまいました為
参考サイト様へのリンクのみとさせていただきます

Apache導入
http://centossrv.com/apache.shtml

Apacheが正しく導入できたら、あとはCMSソフトを入れるだけです。
Joomla!じゃぱん
http://joomla.jp/

さて、サーバー内にJoomlaを入れなければならないのですがFTPは(都合により)使えません。
そしてサーバー機自体は(都合により)手元にない状態。さて困った。
そんなとき救いの手を差し伸べてくれたのが

WinSCP
http://winscp.net/eng/docs/lang:jp

これを使えばサーバー機にファイルを放り込む事ができます。使う方は是非参考にしてください。

そして件のJoomla!ですが、何せ私はCMSを扱ったことがないのでちんぷんかんぷんに。
これから弄って改造していく予定なのですが、果たして大丈夫なのか・・・
以下参考サイト様です。

Joomlaでポン
http://www.joomladepon.com/

Joomla!の道しるべ
http://www.joomlaway.net/

で、肝心のサイト自体は(都合により)リンクを貼れません。
といってもまだテンプレートを弄っただけなので見ても余り意味はない物かと。

個人的にJoomlaを弄って勉強する為にも自宅サーバーを作るかも知れませんが、それはまた別のお話

アプリからマーケット検索を利用する

お疲れ様です。俺です。

今作っているアプリで、アプリ内でマーケット検索する必要が出てきたので
ちょっと調べた所、案外簡単だったのでついでにここに載せたいと思います。


以下を使う前に、とりあえずWebViewをxmlで作っておいてください。


private WebView webView;
webView = (WebView) findViewById(R.id.webview);
webView.setVerticalScrollbarOverlay(true);
webView.setWebViewClient(new WebViewClient());

WebSettings settings = webView.getSettings();
settings.setSupportMultipleWindows(true);
settings.setLoadsImagesAutomatically(true);
settings.setBuiltInZoomControls(true);
settings.setSupportZoom(true);
settings.setLightTouchEnabled(true);

webView.loadUrl("market://search?q=検索するアプリ名");

以上です。
アプリ名を何処からか取得してきて、変数を上記文に投げ込めば、任意のアプリを検索する事が出来ます。
ただ、このWebViewは画面操作的な機能をたくさん入れているので、画面の一部で使うというより
専用のアクティビティを用意したほうがいいかも知れません。

アプリ内でのメニュー表示

お疲れ様です。俺です。

開発に本腰が入り始め、現在設計を改めて始めているところです。
UIの作成にも手が回り始めたので、昨日弄ったメニュー回りのソースを載せたいと思います。

まずパッケージ内のlayoutディレクトリと同じ階層にmenuという別のディレクトリを作成します。
menu内に新たにメニュー設定用のxmlファイルを作成します。名前はとりあえずmenu.xmlにします。

XML内には表示するメニューのアイテムを定義します。以下がテンプレ

menu.xml内









こんな感じです。
これで3つのアイテムを持ったメニューがxml上で定義できました。
次にソースコードです。

main.java内

import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}

これでとりあえず実機のMenuボタンを押下すれば先ほどxmlで定義したメニューが表示されます。
しかし、このままだと処理が何も与えられていないので、さらにコードを追加します。

public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.menu1:
//メニュー1選択時の処理
break;
case R.id.menu2:
//メニュー2選択時の処理
break;
case R.id.menu3:
//メニュー3選択時の処理
break;
default:
break;
}
return true;
}

と、これでcase内の処理を各メニュー押下時に実行することができます。
たとえばTextViewの変更でも、Activityの切り替えでも、使い勝手はかなり良好です。

AndroidからMySQLにアクセス

社内でサーバーを建て、Androidからインターネット経由でサーバーのSQLにアクセスできました!

とりあえず通信系はこれでおおよそ確立できたっぽい。
あとは今まで作ってきたパーツパーツを併せて、操作系を作るのみ。

・・・のみと言ってもその操作系が難しい&ややこしいんですが。

今日の所はSQLの接続方法、操作方法を載せます。

まずMySQLの起動とJDBCのインストールが必要になりますが、
そのあたりの前準備はこのブログでは割愛します。長いしね。

ということで以下ソースコードです。

    //接続に必要な変数群を宣言
Connection cn = null;
Statement st = null;
ResultSet rs = null;

//JDBCドライバを指定
try {
Class.forName("com.mysql.jdbc.Driver");
//データベースに接続
cn = DriverManager.getConnection("jdbc:mysql://アドレス/データベース名", "ID", "pass");
st = cn.createStatement();
//SQL実行部分詳細は追記します。
rs = stmt.executeQuery("SQL構文");
st.close();
cn.close();
rs.close();
} catch (ClassNotFoundException e) {
} catch (SQLException e) {
}}

注意点としては、Try Catchで囲むこと。ないとエラーを吐きます。
で、SQL文についてですが、上のソースコードでは万能ではありません。
ResultSet型のrsにStatmentの「executeQuery」を入れていますが、
上は返り値が必要な時だけ記述します。たとえば、SELECT文等ですね。

返り値が特に必要ないINSERTやUPDATE、DELETEなどは

stmt.executeUpdate("SQL構文");

これだけでOKです。

では、executeQueryで返り値を受け取り、ResultSetに代入していますがどのように使うのか
以下のようなコードを ResultSet代入後、ResultSetクローズ前に記述してください。

String tmp="";
While(rs.next()){
tmp=tmp+rs.getString(1)+ ",";
}

こんな感じです。
これでResultSetに代入されたSELECTの結果がカンマ区切りで一覧取得できます。


以上、これから土日ゆっくり休んでUI回りの制作やデータベースの設計に移ります。

Androidで位置情報を取得

今日は位置情報の取得方法を書きます。

大したソースではないので簡潔に

AndroidManifest.xml内に記述




ソースコード本文
private LocationManager locationManager;
locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10000,0,(LocationListener)this);

以上でDDMSのログに位置情報が随時出力されます。

位置情報自体は簡単に取得できるのですが、これを使ったサービスを考えるのが難しい。
なぜなら大体のアプリは作られてしまっているから・・・

位置情報をリアルタイムで使用できるのがスマフォのいい所なので
これを使って何か斬新なアプリを作りたいものですね。