Android演習

8-3 ネットワーク関連
1.メールの送信
暗黙的インテントでメーラを起動
mailto:<メールアドレス>
をインテントで渡してアプリを起動。
B.プログラム例(その1)
package jp.mail;
import android.app.*;
import android.os.*;
import android.content.Intent;
import android.net.Uri;
import android.view.*;
import android.view.View.*;
import android.webkit.*;
import android.widget.*;
import android.media.*;
public class MailActivity extends Activity {
Button button; TextView[] textV=new TextView[3];
EditText[] editT=new EditText[3];
プログラム例(その2)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
int i;
super.onCreate(savedInstanceState);
TableLayout TL=new TableLayout(this);
setContentView(TL);
button=new Button(this);button.setText("送信");
for(i=0;i<textV.length;i++) textV[i]=new TextView(this);
for(i=0;i<editT.length;i++) textV[i]=new TextView(this);
textV[0].setText("宛先");
textV[1].setText("表題");
textV[2].setText("本文");
for(i=0; i<textV.length;i++)TL.addView(textV[i]);
for(i=0; i<editT.length;i++)TL.addView(editT[i]);
TL.addView(button);
button.setOnClickListener(new mailClickListener());
}
B.プログラム例(その3)
class mailClickListener implements OnClickListener{
public void onClick(View v){
Intent intent=new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"+
editT[0].getText().toString()));
intent.putExtra(Intent.EXTRA_SUBJECT,
editT[1].getText().toString());
intent.putExtra(Intent.EXTRA_TEXT,
editT[2].getText());
startActivity(intent);
}
}
}
2.Webページの表示
A. パーミッションの指定
【AndroidManifest.xml】
・・・
</application>
<uses-permission android.name="android.permission.INTERNET" />
</manifest>
B.プログラム例(その1)
package jp.web;
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.webkit.*;
import android.widget.*;
public class WebActivity extends Activity {
Button[] button=new Button[4]; WebView webV;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
int i;
super.onCreate(savedInstanceState);
TableLayout TL=new TableLayout(this);
setContentView(TL);
プログラム例(その2)
webV=new WebView(this);
webV.setWebViewClient(new WebViewClient());
webV.loadUrl("http://souzousha.iinaa.net");
TableRow tableR=new TableRow(this);
for(i=0;i<button.length;i++){
button[i]=new Button(this);
tableR.addView(button[i]);
}
button[0].setText("←");
button[1].setText("→");
button[2].setText("+");
button[3].setText("‐");
for(i=0;i<button.length;i++)
button[i].setOnClickListener(new webClickListener());
TL.addView(tableR);
TL.addView(webV);
}
プログラム例(その3)
class webClickListener implements OnClickListener{
public void onClick(View v){
if(v==button[0]){
if(webV.canGoBack())webV.goBack();
}
else if(v==button[1]){
if(webV.canGoForward())webV.goForward();
}
else if(v==button[2])webV.zoomIn();
else if(v==button[3])webV.zoomOut();
}
}
}
C.実行例
指定されたWebページ
3. 訪問Webの記録
A.マニフェストに追加
【AndroidManifest.xmlへの追加】
…
</activity>
<activity android:name=".Rss"
android:label="@string/app_name">"
</activity>
</application>
<uses-permission android:name=
"android.permission.INTERNET" />
</manifest>
RSS収集のときに便利なので,
RSSとは…
ニュースやブログなど,各種のウェブサイトの更新情報をま
とめて配信するための文書フォーマットの総称。以下の規格
がある。
① RDF site summary(RSS 0.9, RSS 1.0)
② rich site summary(RSS 0.91)
③ really simple syndication(RSS 2.0)
B.プログラム例
RssActivity クラス(その1)
package jp.rss;
import java.io.*;
import android.app.*;
import android.os.*;
import android.content.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import android.webkit.*;
import android.widget.AdapterView.*;
public class RssActivity extends Activity {
public static int RSS_ACT=1;
Button[] button=new Button[4];
WebView webV;
RssActivity クラス(その2)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
int i;
super.onCreate(savedInstanceState);
TableLayout TL=new TableLayout(this);
setContentView(TL);
webV=new WebView(this);
webV.setWebViewClient(new WebViewClient());
webV.loadUrl("http://souzousha.iinaa.net");
TableRow tableR=new TableRow(this);
for(i=0; i<button.length;i++){
button[i]=new Button(this);
tableR.addView(button[i]);
}
RssActivity クラス(その3)
button[0].setText("←");
button[1].setText("→");
button[2].setText("URL取出");
button[3].setText("URL表示");
for(i=0;i<button.length;i++)
button[i].setOnClickListener(new rssActClickListener());
TL.addView(tableR);
TL.addView(webV);
}
RssActivity クラス(その4)
class rssActClickListener implements OnClickListener{
public void onClick(View v){
if(v==button[0]){
if(webV.canGoBack())webV.goBack();
}else if(v==button[1]){
if(webV.canGoForward())webV.goForward();
}else if(v==button[2]){
try{ FileOutputStream fout=
openFileOutput("SampleRSS.txt",Context.MODE_APPEND);
BufferedWriter buff =
new BufferedWriter(new OutputStreamWriter(fout));
buff.write(webV.getUrl() + "\n");
buff.flush();
fout.close();
}catch(Exception e){}
RssActivity クラス(その5)
}else if(v==button[3]){
Intent intent=new Intent(getApplicationContext(),Rss.class);
startActivityForResult(intent,RSS_ACT);
}
}
}
public void onActivityResult(int reqcode, int result, Intent intent){
if(reqcode==RSS_ACT && result==RESULT_OK){
String r =intent.getStringExtra("URL");
webV.loadUrl(r);
}
}
}
Rss クラス(その1)
package jp.rss;
import java.io.*;
import java.util.*;
import android.app.*;
import android.os.*;
import android.content.*;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;
public class Rss extends Activity {
public static int RSS_ACT=1; ListView listV; Intent intent;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout LL=new LinearLayout(this);
setContentView(LL);
Rss クラス(その2)
intent = getIntent();
listV=new ListView(this);
ArrayList<String> list=new ArrayList<String>();
try{
FileInputStream finput=openFileInput("SampleRSS.txt");
BufferedReader buff=
new BufferedReader(new InputStreamReader(finput));
String str;
while((str=buff.readLine())!=null) list.add(str);
}catch(Exception e){};
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1,list);
listV.setAdapter(adapter);
LL.addView(listV);
listV.setOnItemClickListener(new rssItemClickListener());
}
Rss クラス(その3)
class rssItemClickListener implements OnItemClickListener{
public void onItemClick(AdapterView<?> av, View v,
int pos, long id){
TextView temp=(TextView) v;
String str=(String) temp.getText();
intent.putExtra("URL",str);
setResult(RESULT_OK,intent);
finish();
}
}
}
D.実行例
【指定されたWebの表示】
4. RSSをXMLとして扱う
A.マニフェストに追加
【AndroidManifest.xmlへの追加】
…
</application>
<uses-permission android:name=
"android.permission.INTERNET" />
</manifest>
B.関連クラス
(その1)
クラス
説明
org.apache.http.client.HttpClient インターフェース
HttpResponse execute(HttpUriRequest r) リクエストからレスポンスを取得
org.apache.http.DefaultHttpClient クラス
DefaultHttpClient()
HTTPクライアントを作成
org.apache.http.HttpGet クラス
HttpGet()
GETリクエストを作成
org.apache.http.HttpResponse インターフェース
HttpEntity getEntity()
エンティティを取得
org.apache.http.HttpEntity インターフェース
InputStream getContent()
コンテンツを取得
関連クラス
(その2)
クラス
説明
org.xmlpull.v1.XmlPullParserFactory クラス
static XmlPullParserFactory newinstance() XMLパーサファクトリを取得
XmlPullParser newPullParser()
XMLパーサを取得
org.xmlpull.v1.XmlPullParser インターフェース
void setInput(StreamReader s)
入力ストリームから読み込む
int getEventType()
イベントタイプを取得
String nextText()
次のテキストを取得
int next()
次に進む
C.イベントタイプ
(XmlPullPaser クラス)
タイプ
START_DOCUMENT
END_DOCUMENT
START_TAG
END_TAG
TEXT
説明
文書の開始
文書の終了
タグの開始
タグの終了
テキスト
D.プログラム例
(その1)
package jp.web;
import java.io.*;
import java.net.*;
import java.util.*;
import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.xmlpull.v1.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
(その2)
public class WebActivity extends Activity {
EditText editT; Button button; ListView listV;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout LL =new LinearLayout(this);
LL.setOrientation(LinearLayout.VERTICAL);
setContentView(LL);
editT=new EditText(this);
button=new Button(this); button.setText("読込");
listV=new ListView(this);
LL.addView(editT);
LL.addView(button);
LL.addView(listV);
button.setOnClickListener(new webClickListener());
}
(その3)
class webClickListener implements OnClickListener{
public void onClick(View v){
try{
ArrayList<Map<String,String>> list =
new ArrayList<Map<String,String>>();
// ① HTTPクライアントの作成
HttpClient hClient = new DefaultHttpClient();
HttpGet
hGet
= new HttpGet();
// ② URIを設定
String uri = editT.getText().toString();
hGet.setURI(new URI(uri));
// ③ レスポンスを取得
HttpResponse hResp = hClient.execute(hGet);
// ④ XMLの内容を取得
InputStream inputS =
hResp.getEntity().getContent();
BufferedReader buff =
new BufferedReader(new InputStreamReader(inputS));
(その3)
// ⑤ XMLパーサを取得
XmlPullParserFactory xpf =
XmlPullParserFactory.newInstance();
XmlPullParser xpp = xpf.newPullParser();
// ⑥ XMLを入力
xpp.setInput(buff);
// ⑦ 入力開始の初期処理
int type = 0;
type = xpp.getEventType();
HashMap<String,String> hMap = null;
String title
= ""
;
String description = ""
;
boolean isItem
= false ;
(その4)
// ⑧ 各開始タグごとの処理
while(type !=XmlPullParser.END_DOCUMENT){
if(type == XmlPullParser.START_TAG){
if(xpp.getName().equals("item")){
hMap=new HashMap<String,String>(); isItem=true;
}else if(xpp.getName().equals("title")){
if(isItem){ title=xpp.nextText();
hMap.put("title", title);
}
}else if(xpp.getName().equals("description")){
if(isItem){ description = xpp.nextText();
hMap.put("description", description);
}
}
}else if(type == XmlPullParser.END_TAG){
list.add(hMap); isItem = false;
}
type = xpp.next();
}
(その5)
String[] keys ={"title","description"};
int[] idS ={android.R.id.text1, android.R.id.text2};
SimpleAdapter ad = new SimpleAdapter
(getApplicationContext(), list,
android.R.layout.simple_list_item_2, keys, idS);
listV.setAdapter(ad);
}catch(Exception e){
Toast.makeText(getBaseContext(), "URLを確認してください",
Toast.LENGTH_LONG).show();
}
}
}
}
E.実行例
【指定されたWebの表示】
①URL入力
②「読込」ボタンを押す
④スクロール
③消して…