
Androidの勉強中。
xmlの処理&Web上の画像の読み込みの練習。
Flickrから画像を取ってきて表示してます。
今回はエミュレータ上だけでの動作確認。
実機でテストはしてません。
以下、今回のソースです。
Main.javaのソース。
package jp.sakef;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
public class Main extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(new MainView(this));
}
}
MainView.javaのソース。
package jp.sakef;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainView extends SurfaceView implements SurfaceHolder.Callback
{
public MainView(Context context)
{
super(context);
getHolder().addCallback(this);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
// サーバーに保存
String imgURL = null;
Bitmap bitmap = null;
try
{
// Flickr接続用。APIのkeyとか検索タグとか。下のAPI keyは適当です。
String API_KEY="api_key=00000000000000000000000000000000";
String API_URL="http://api.flickr.com/services/rest/?method=flickr.photos.search";
String API_TAG="tags=cat";
String PER_PAGE="per_page=2";
// APIに接続
URL url = new URL(API_URL + "&" + API_KEY + "&" + API_TAG + "&" + PER_PAGE);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setUseCaches(false);
conn.connect();
// 結果を受信
InputStream in = new BufferedInputStream(conn.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// XMLをパース
final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
final XmlPullParser parser = factory.newPullParser();
parser.setInput(reader);
for(int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next())
{
if(type == XmlPullParser.START_TAG)
{
String tagName = parser.getName();
if (tagName.equals("photo"))
{
String id = parser.getAttributeValue(0);
String secret = parser.getAttributeValue(2);
String server = parser.getAttributeValue(3);
String farm = parser.getAttributeValue(4);
imgURL = "http://farm" + farm + ".static.flickr.com/" + server + "/" + id + "_" + secret + ".jpg";
break;
}
}
}
// close
reader.close();
in.close();
conn.disconnect();
// 画像の読み込み
if(imgURL != null)
{
url = new URL(imgURL);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
in = new BufferedInputStream(conn.getInputStream());
bitmap = BitmapFactory.decodeStream(in);
in.close();
conn.disconnect();
// 描画
Canvas canvas = holder.lockCanvas();
if(bitmap != null)
{
float scale = (float)(width) / (float)bitmap.getWidth();
canvas.scale(scale, scale);
canvas.drawBitmap(bitmap, 0, 0, null);
}
else
{
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
canvas.scale(2, 2);
canvas.drawText("Image load error.", 10, 10, paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
catch(Exception e)
{
Log.d("Program Error", e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder){}
public void surfaceCreated(SurfaceHolder holder){}
}