@blog.justoneplanet.info

日々勉強

androidでビデオを再生する

■概要

プロジェクト名
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>

androidで音楽を再生する

■概要

プロジェクト名
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が再生されなかった。

Eclipse3.4でインデントにスペースを使用する

まず、「ウィンドウ > 設定」で設定パネルを開く。

■テキスト・エディタの設定

「一般 > エディター > テキストエディター」の「タブでスペースを挿入」にチェックを入れる。

テキスト・エディタの設定

■フォーマッターの設定

「Java > コードスタイル > フォーマッタ―」の「編集」をクリックすると、画像の様なウィンドウが出現するので「タブポリシー」を「スペースのみ」にする。この過程でデフォルトの設定は上書きできないと言われるので、適当な名前を付けて設定を保存する。

フォーマッターの設定

設定箇所は多いが好みのスタイルに勝手になるように調整すると俄然やる気があがる。

Drupalをインストールしてみた

なんでもDrupalのSNSモジュールはすごいらしい。

■言語の選択

インストールに使用する言語を設定するらしい。

言語の選択

■インストール必要条件

インストールできる状態かチェックしてくれる。自分はファイル(ディレクトリ)のアクセス権の設定をするように注意された。

インストール必要条件

■データベースの設定

インストールするデータベースを選択する。1つのデータベースで複数のアプリケーションをインストールする場合は、高度なオプションのテーブルプリフィクスに適切な文字列を指定して、テーブルの名前に任意の文字列を付加することを勧める。これにより他のアプリケーションがテーブルに変更を加えてしまうことを防げる。

データベースの設定

■サイトの環境設定

「サイトの名前」「管理者名」「管理者パスワード」などを設定する。下の方の「クリーンURL」というのはクエリ形式のURL(?q=about&p=123)を検索エンジンフレンドリーなもの(/about/123)にするというものだ。ちなみに前述の変更したアクセス権をこのフェーズで戻してあげる。

サイトの環境設定

■インストール完了

インストール完了

Joomla!をインストールしてみた

永遠のテーマ!?、CMSは何を選ぶべきなのか?という問題を考えるために今回Joomlaをインストールしてみることにした。

■言語選択

はじめに言語を選択する。ここでは普通に日本語を選択することにする。

言語選択画面

■インストール前の準備

サーバの設定がJoomla!のインストールに適しているか確認してくれる。自分の場合は、「configureファイルの書き込み」と「mbstring.language」の設定でエラーが出た。素晴らしいのはphp_value mbstring.language neutralと,htaccessに記述するように教えてくれるところなのだが、サーバによってはphp.iniを変更する必要があることにまで触れてくれればパーフェクトであった。

インストール前の準備

■ライセンス

Joomla! is Free Software released under the GNU/GPL License.要はGNU/GPLライセンスの下で配布されているということ。GPLでライセンスされた著作物は、その派生的著作物に関してもGPLでライセンスされなければならないということだけ覚えておけば問題になることはないだろう。

ライセンス

■データベースの設定

ユーザ名とパスワード、DB名を入力する必要がある。但し、いくつものアプリケーションを1つのデータベースで運用している場合は、拡張設定をクリックしテーブルプリフィクスを設定し、生成される各テーブル名に特異な文字列を付加した方がイイかもしれない。

データベースの設定

■FTPの設定

Joomla自体がFTPアクセスを使用する場合には設定する必要がある。今は必要ないので「いいえ」を選択した。

ftpの設定

■全般の設定

基本的には「サイト名」「E-mailアドレス」「管理者パスワード」の設定でOKだ。

全般の設定

■インストール完了

これで基本的にはインストールが完了である。数々見てきたCMSの中でも、かなり良くできているグループに入るっといえる。

インストール完了

androidで位置情報を取得する

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

■コード

package info.justoneplanet.android.sample.location;

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 LocationActivity extends Activity implements LocationListener {
    private LocationManager locationManager;
    private String provider;
    private Criteria criteria;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        criteria = new Criteria();
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    }
    
    @Override
    public void onResume() {
        super.onResume();
        // "gps"とか"network"とか選んでくれる
        provider = locationManager.getBestProvider(criteria, true);

        // 位置情報の更新間隔を時間と移動距離で設定できる
        locationManager.requestLocationUpdates(provider, 1000, 1, this);
        
        ((TextView) findViewById(R.id.provider)).setText(provider);
        displayProvider(locationManager.getProvider(provider));
    }
    
    @Override
    public void onPause() {
        super.onPause();
        // 位置情報の取得には電力を使うのでactiveでなくなったら更新しない
        locationManager.removeUpdates(this);
    }

    /**
     * 位置情報が変更されたとき
     */
    @Override
    public void onLocationChanged(Location location) {
        ((TextView) findViewById(R.id.altitude)).setText(String.valueOf(location.getAltitude()));
        ((TextView) findViewById(R.id.longitude)).setText(String.valueOf(location.getLongitude()));
        ((TextView) findViewById(R.id.latitude)).setText(String.valueOf(location.getLatitude()));
    }

    /**
     * 機器が使えなくなった時
     */
    @Override
    public void onProviderDisabled(String provider) {
        ((TextView) findViewById(R.id.provider)).setText(provider + "::disable");
        provider = locationManager.getBestProvider(criteria, true);
    }

    @Override
    public void onProviderEnabled(String provider) {
        ((TextView) findViewById(R.id.provider)).setText(provider + "::enable");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        ((TextView) findViewById(R.id.provider)).setText(provider + "(" + status + ")");
    }
    
    private void displayProvider(LocationProvider locationProvider) {
        ((TextView) findViewById(R.id.information)).setText(locationProvider.getName());
    }
}

コード

昔のコード。汚いけど残しておく。

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と異なっててどうもしっくりこないな。

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のデータ

JavaScript Comments and Whitespace

人が読みやすいように挿入される注釈。

■行コメント

コメント開始の記号から改行コードまでがコメントとなる。

//これはコメントです

■ブロックコメント

コメント開始の記号からコメント終了の記号までがコメントとなる。

/*
 * これはコメントです
 */

■空白文字

プログラム内のトークンを区切る空白、タブ、改行コードを無視する。また、これらを使用してプログラムを見やすく整形することができる。但し、改行は整形のために使用できない位置がある。

Firefox3.5

インストールしました。ほとんど見た目は変わらないのですが、タブをドラッグしたときの挙動が少しだけ異なってますね。あと、新しいタブを追加するボタンが追加されてますが、個人的にはありがたくないボタンです。ただし、ほとんどのユーザには使いやすいと思われます。

credit

噂の通りJavaScriptの速度が半端なく早いですね。Google Chromeも早いんですが、使い慣れている+性能となるとFirefoxしかない、というのが個人的な結論です。Gmailもすぐに立ち上がります。

gmailスタンバイ

Firefox3.5ダウンロード