2009年7月8日

androidで位置情報を取得する

カテゴリー: Java, android — admin @ 6:34 PM

7/10にHT-03Aの発売が決まってにわかに活気づいてきました。但し、まだまだ日本語文献が少ないですな。特にリファレンスは厳しいな。

■ソースコード

package org.example.locationtest;

import java.util.List;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;

public class LocationTest extends Activity implements LocationListener {
    private static final String[] A = {
        "n/a",
        "fine",
        "coarse"
    };
    private static final String[] P = {
        "n/a",
        "low",
        "medium",
        "high"
    };
    private static final String[] S = {
        "out of service",
        "temporarily unavailable",
        "available"
    };
    private LocationManager mgr;
    private TextView output;
    private String best;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        output = (TextView) findViewById(R.id.output);

        log("Location providers:");
        dumpProviders();

        Criteria criteria = new Criteria();
        best = mgr.getBestProvider(criteria, true);
        log("\nBest Provider is: " + best);

        log("\nLocations (starting with last known):");
        Location location = mgr.getLastKnownLocation(best);
        dumpLocation(location);
    }

    @Override
    protected void onResume(){
    	super.onResume();
    	mgr.requestLocationUpdates(best, 15000, 1, this);
    }
    @Override
    protected void onPause(){
    	super.onPause();
    	mgr.removeUpdates(this);
    }

    public void onLocationChanged(Location location){
    	dumpLocation(location);
    }
    @Override
    public void onProviderDisabled(String provider) {
        log("\nProvider disabled:" + provider);
    }
    @Override
	public void onProviderEnabled(String provider) {
    	log("\nProvider enabled:" + provider);
	}
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        log("\nProvider status changed:" + provider + ", status=" + S[status] + ", extras=" + extras);
    }

    private void log(String string) {
        output.append(string + "\n");
    }
    private void dumpLocation(Location location) {
        if(location == null){
            log("\nLocation[unknown]");
        }
        else{
            log("\n" + location.toString().replace(",", ",\n\t").replace("[", "[\n\t").replace("]", "\n]"));
        }
    }
    private void dumpProviders() {
        List<String> providers = mgr.getAllProviders();
        for (String provider : providers) {
            dumpProvider(provider);
        }
    }
    private void dumpProvider(String provider) {
        LocationProvider info = mgr.getProvider(provider);
        StringBuilder builder = new StringBuilder();
        builder.append("LocationProvider[")
            .append("\n\tname=")
            .append(info.getName())
            .append(",\n\tenabled=")
            .append(mgr.isProviderEnabled(provider))
            .append(",\n\tgetAccuracy=")
            .append(A[info.getAccuracy()])
            .append(",\n\tgetPowerRequirement=")
            .append(P[info.getPowerRequirement()])
            .append(",\n\thasMonetaryCost=")
            .append(info.hasMonetaryCost())
            .append(",\n\trequiresCell=")
            .append(info.requiresCell())
            .append(",\n\trequiresNetwork=")
            .append(info.requiresNetwork())
            .append(",\n\trequiresSatellite=")
            .append(info.requiresSatellite())
            .append(",\n\tsupportsAltitude=")
            .append(info.supportsAltitude())
            .append(",\n\tsupportsBearing=")
            .append(info.supportsBearing())
            .append(",\n\tsupportsSpeed=")
            .append(info.supportsSpeed())
            .append("\n]");
        log(builder.toString());
    }
}

Javaの配列宣言がPHPやJavaScriptと異なっててどうもしっくりこないな。

■解説

@Overrideしているもので、アプリケーションの状態に合わせた挙動の定義をしてる感じですな。今回は、アプリがスタートした時の動作がほとんどなので、結果的にonCreateがメインです。+privateメソッドでクラス内で必要なメソッドを実装。

void org.example.locationtest.LocationTest.onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);

スーパークラスのメソッドをコール。

setContentView(R.layout.main);

androidのView Wigetを使ってActivityの画面を生成する。

mgr = (LocationManager) getSystemService(LOCATION_SERVICE);

LocationManagerオブジェクトを取得し変数に格納。

output = (TextView) findViewById(R.id.output);

Resource IDに基づいてAndroid Viewを探す。

Criteria criteria = new Criteria();

Criteriaオブジェクトの生成。location providerの選択のためにapplicationの尺度を示すらしい。

best = mgr.getBestProvider(criteria, true);

状況に応じた最良のセンサー名をbest変数に格納する。

Location location = mgr.getLastKnownLocation(best);

センサーによっては位置を取得するのに時間がかかるので最後に取得した値を利用する。

void org.example.locationtest.LocationTest.onResume()

アプリがforegroundに復活した時の挙動を定義。

super.onResume();
mgr.requestLocationUpdates(best, 15000, 1, this);

スーパークラスのメソッドをコール。位置情報の定期更新を設定する。

void org.example.locationtest.LocationTest.onPause()

アプリがbackgroundにある時の挙動を定義。

super.onPause();
mgr.removeUpdates(this);

スーパークラスのメソッドをコール。アップデートを休止する(位置情報の更新を無効にする)。

void org.example.locationtest.LocationTest.dumpProviders()

for (String provider : providers) {
    dumpProvider(provider);
}

JDK5.0からできるようになった記法らしい。コロンの右側に配列(もしくはコレクション)を配置しループをぶん回せる。ちなみにこの記法はJavaScriptでは使えない。

void org.example.locationtest.LocationTest.log(String string)

output.append(string + "\n");

引数のstringが出力に追加されるイメージですな。

■画面

こんな風に表示されます。

gpsのデータ

2009年6月6日

Android入門

カテゴリー: Java, android — admin @ 10:47 PM

昨日まではPHP漬けでしたが、今日からはモバイル漬けになります。だってそんな時代だもん。

■Android SDKのダウンロード

http://developer.android.com/sdk/

170MBもありますな。

■Android Development Toolkit(ADT)をインストール

ヘルプ>ソフトウェアの更新>Available Softwareのタブをクリックする。そして「サイトの追加」のボタンを押す。するとURLを入力できる。

文献によっては以下のURLが指定してあるが、実は現在このURLを指定すると「Not Repository」みたいな事を言われてしまう。


https://dl-ssl.google.com/android/eclipse/

正しいURL


https://dl-ssl.google.com/android/eclipse/site.xml

サイトの追加

■SDKとEclipseの紐付け

Eclipse側からSDKが「どこにあるのか?」を分かるようにしてあげる作業。個人的な趣味によりCドライブ直下にする。

パス

以下のように配置したとする。

C:\android-sdk-windows-1.5_r2

Eclipseの設定

「ウィンドウ>設定>Android」の順でメニューをたどると「参照」のボタンがあるのでクリックし、上述のパス(ディレクトリ)を指定する。

Eclipseの設定

以上で開発環境の構築は終了。これが長過ぎると人間やる気を無くすってもんだ。今回はサクッと片付いた。

■Hello, Androidアプリケーション

新規でAndroidプロジェクトを開始し以下のように入力するだけで完成する!

プロジェクト名
Hello
パッケージ名
org.example.hello
アクティビティ名
Hello
アプリケーション名
Hello, Android

ソースコード

今回は全くソースコードを触らないが一応ファイルを見てみると以下のような感じになってた。

package org.example.hello;

import android.app.Activity;
import android.os.Bundle;

public class Hello extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

エミュレータで実行

※初めてエミュレータを起動すると設定画面が出る(適当な名前とターゲットSDKのバージョンを指定する)。

なんかAndroidの携帯が欲しくなった。

2008年10月21日

Javaを書いてみよう!入門ソースコード

カテゴリー: Java — admin @ 12:55 AM

■ソースコード

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class samplewindows {
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        JFrame frame = new JFrame("リスト表示");
        AddListPanel panel1 = new AddListPanel();
        Container cont = frame.getContentPane();
        cont.add(panel1);
        //set up frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, 300, 500);
        frame.setVisible(true);
    }
}
class AddListPanel extends JPanel implements ActionListener{
    private final long serialVersionUID = 1L;
    JButton button1, button2;
    JList list1;
    JTextField text1;
    DefaultListModel listModel;
    JLabel label1;
    AddListPanel(){
        button1 = new JButton("選択");
        button1.addActionListener(this);
        listModel = new DefaultListModel();
        listModel.addElement("りんご");
        list1 = new JList(listModel);
        list1.setFixedCellWidth(100);
        button2 = new JButton("追加");
        button2.addActionListener(this);
        JScrollPane scroll1 = new JScrollPane(list1);
        scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scroll1.setPreferredSize(new Dimension(240, 100));
        scroll1.setBorder(BorderFactory.createEtchedBorder());
        scroll1.setBorder(BorderFactory.createTitledBorder("果物"));
        text1 = new JTextField(12);
        label1 = new JLabel("ここに新しい項目を入力してください");
        JPanel p1  = new JPanel();
        p1.add(scroll1);
        p1.add(button1);
        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(2, 1));
        p2.add(label1);
        p2.add(text1);
        JPanel p3 = new JPanel();
        p3.add(button2);
        this.setLayout(new GridLayout(3, 1));
        this.add(p1);
        this.add(p2);
        this.add(p3);
    }
    public void actionPerformed(ActionEvent el){
        if(el.getSource() == button1){
            JOptionPane.showMessageDialog(
                null,
                list1.getSelectedValue() + "が選択されました",
                "選択項目の表示",
                JOptionPane.INFORMATION_MESSAGE
            );
        }
        else if(el.getSource() == button2){
            if(text1.getText().compareTo("") != 0){
                listModel.addElement(text1.getText());
            }
            else{
                JOptionPane.showMessageDialog(
                    null,
                    "設定する項目が入力されていません",
                    "入力エラー",
                    JOptionPane.INFORMATION_MESSAGE
                );
            }
        }
    }
}

病み上がりだし、夜も遅いしで解説はマタ明日。。。

2008年10月20日

Javaを書いてみよう

カテゴリー: Java — admin @ 12:03 AM

■経緯

Web系言語以外にも手を出してみようと思った。Rubyとかも興味がある。AS3も極めたい。でもJavaにした。

■購入教材

実践マスターJava
基礎的な言語使用の解説と実践でのアプリ作成があるのでこれを選んだ。eclipseの使い方とか日本語化の仕方とかの解説があるのも嬉しい!なんといっても独学系プログラマは誰も周囲にSEが居ないから、開発環境の構築も解説してくれないと困るし。。。そんな理由もあってこの書籍を購入。

■サンプルコード

public class Chapter523 {
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        int answer;
        answer = 5 * 10;
        System.out.print("答えは" + answer + "です");
    }
}
//出力結果「答えは50です」

変数宣言時に変数の型を指定しなくちゃいけないわけですな!これはJavaScriptとかPHPとは違うわけよ!

■さらに

public class Chapter531 {
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        double answer = 0;
        answer = 10.0 / 3.0;
        System.out.print(answer);
    }
}
//出力結果「3.3333333333333335」

int型は整数しか代入できないので、double(倍精度浮動小数点型)で指定し、10/3でなく10.0/3.0と記述する。double answer = 0;で変数の初期化をする(変数の中身を確実にリセットしプログラムのバグが発生するのを防ぐ)