2009年8月13日

androidで証明書のフィンガープリントを表示する

Filed under: android — admin @ 3:09 AM

開発用のフィンガープリントを表示する方法。備忘録。

■環境

Windows Vista

■方法

JDKのインストールディレクトリでkeytoolコマンドを実行する。

C:\Program Files\Java\%JDKのバージョン%\bin>keytool -list -alias androiddebugkey -keystore C:\Users\%ユーザ名%\.android\debug.keystore -storepass android -keypass android

オプションについて

-keystore
デバッグ用証明書の格納場所を指定

参考

大抵の参考書ではルートディレクトリで実行していたりするが、ちゃんと言ってくれなくちゃ分からない。

2009年8月9日

android端末の実機でデバッグ

Filed under: android — admin @ 11:36 PM

備忘録。

■デバッグモードに設定

「設定>開発>USBデバッグ」のチェックボックスにチェックを入れる。これでUSB接続した時はデバッグモードになる。

USBデバッグ

■接続

USBケーブルで接続すると、デバイスドライバのインストールになる。ドライバは「android-sdk-windows/usb_driver/x86/」の中にある。

■認識

DDMSで端末として認識されるようになる。DDMSはダウンロードしたandroid SDKに含まれている「tools/ddms.bat」をダブルクリックすれば起動する。

DDMS

デバッグモードにせずに接続してしまった場合

この場合、すでにUSB大容量記憶装置として認識されてしまっているので、デバイスマネージャを起動して「USB大容量記憶装置」を削除し、上述の一番最初から行う必要がある。

場合によって

HTCからドライバをダウンロードしてインストールしてみる必要があるようです。

参考

2009年8月9日

android端末で自作アプリを動かす

Filed under: android — admin @ 3:25 AM

■/workspace/project_name/bin/project_name.apk

このファイルがアプリケーション本体になりますので、webサーバの適当な位置にアップします。

■android端末でアプリのファイルにアクセス

ブラウザでURLを入力するとSDカードにダウンロードされる。但し、下のようにインデックスファイルを作った方が便利。

ブラウザでアクセス

■SDカードにダウンロード

上述のリンクをクリックすると、SDカードにファイルがダウンロードされる。

SDカードにダウンロード

■インストールのブロック

自作アプリは通常の端末でインストールできないように設定されている。提供元不明のアプリのインストールをブロックしユーザに害のないようになっているのだ。「setting」を押して設定を変更する。

インストールのブロック

■設定の変更

「提供元不明のアプリ」の項目にチェックを入れる。ここでセキュリティリスクの注意書きが出るがテストなので「OK」を押す。インストール後は元に戻すことを強く勧める。

設定の変更

■インストール

これでインストールができるようになる。「Install」ボタンをクリックだ。

インストール

■インストール完了

自作アプリが自前のandroid端末で動く。「Open」ボタンを押せばアプリが起動する。

インストール完了

自分のアプリが動く瞬間、なんか凄く達成感がある。

2009年7月30日

androidでビデオを再生する

Filed under: android — admin @ 1:18 AM

■概要

プロジェクト名
Video
パッケージ名
org.example.video
アクティビティ
Video
アプリケーション名
Video

■Video.java

package org.example.video;

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

public class Video extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        VideoView video = (VideoView) findViewById(R.id.video);

        video.setVideoPath("/data/samplevideo.mp4");
    }
}

■/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    >
    <VideoView
        android:id="@+id/video"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center" />
</FrameLayout>

2009年7月30日

androidで音楽を再生する

Filed under: android — admin @ 12:05 AM

■概要

プロジェクト名
Audio
パッケージ名
org.example.audio
アクティビティ
Audio
アプリケーション名
Audio

「0」を押すと再生。「1」を押すと停止します。一応、エミュレータ上では動作確認をしてます。

■res/raw/music.wav

eclipseのパッケージエクスプローラを使ってファイルを所定の位置に配置する。ちなみにWindows上でファイルを移動した場合、eclipseにはファイルの存在が知らされない。従って、R.javaにも識別子が追加されず、下のソースコード「R.raw.music」でエラーとなる。

■Audio.java

package org.example.audio;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;

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

        bgMusic = MediaPlayer.create(this, R.raw.music);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event){
        MediaPlayer mp;
        mp = bgMusic;
        mp.seekTo(0);
        switch(keyCode){
        case KeyEvent.KEYCODE_0:
            mp.start();
            break;
        case KeyEvent.KEYCODE_1:
            mp.stop();
            break;
        default:
            return super.onKeyDown(keyCode, event);
        }
        return true;
    }
}

うーむ、再度再生を行うときはどうしたらいいんだろうー

■注意

エミュレータではなぜかWMAが再生されなかった。

2009年7月8日

androidで位置情報を取得する

Filed under: 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入門

Filed under: 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の携帯が欲しくなった。