たぼさんの部屋

いちょぼとのんびり

T103 API_LocationService

f:id:donsuka_kk:20121205123859p:plain

Main.java

package com.example.t103_api_locationservice;

import java.util.LinkedList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class Main extends Activity implements LocationListener{

	Context context;
	LinearLayout base;
	LinearLayout lHeader, lMain, lFooter;
	Button btn0, btn1;
	TextView tvFooter;
	View mView;

	Paint paint;
	LinkedList<GeoPoint> geoPoints = new LinkedList<GeoPoint>();	//addFirstを使うため

	// locationManager
	LocationManager mLocationManager;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// requestWindowFeature(Window.FEATURE_NO_TITLE);

		context = getApplicationContext();
		base = new LinearLayout(context);
		setContentView(base);
		base.setOrientation(LinearLayout.VERTICAL);

		// Layout
		lHeader = new LinearLayout(context);
		lMain = new LinearLayout(context);
		lFooter = new LinearLayout(context);

		// base addView
		base.addView(lHeader);
		base.addView(lMain, new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, 0, 1.0f));
		base.addView(lFooter);

		// Paint
		paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.BLUE);
		paint.setTextSize(20);
		// View
		mView = new View(context) {

			@Override
			protected void onDraw(Canvas canvas) {
				Log.v("Main", "canvas" + canvas.getHeight());

				if (geoPoints.size() == 0) {
					canvas.drawText("データありません", 10, 50, paint);
				} else {
					canvas.drawText("最新の10件のデータ", 10, 50, paint);
					for(int i = 0;i<geoPoints.size();i++){
						// 緯度の取得
						double lat = geoPoints.get(i).getLatitudeE6() / 1E6;
						// 経度の取得
						double lng = geoPoints.get(i).getLongitudeE6() / 1E6;
						canvas.drawText(i+":"+ "経度="+lng+",緯度="+lat, 10, 100 + 24 * i, paint);
					}
				}
			}
		};

		// Controller
		btn0 = new Button(context);
		btn1 = new Button(context);
		btn0.setWidth(100);
		btn1.setWidth(100);
		btn0.setText("?");
		btn1.setText("??");
		tvFooter = new TextView(context);
		tvFooter.setText("FOOTER");

		// Layout addView
		lHeader.addView(btn0);
		lHeader.addView(btn1);
		lMain.addView(mView, new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
		lFooter.addView(tvFooter);

		// LocationManager instance
		mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

	}

	@Override
	protected void onResume() {
		// 位置情報更新の設定:更新時間:60秒、更新距離10m
		mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
				1000, 1, this);
		super.onResume();
	}

	public void onLocationChanged(Location location) {
		// 位置情報が更新された場合
		Log.v("LocationListener", "onLocationChanged");
		try {
			//XXX このGeoPointの取得には Manifest.xmlのパーミッションが必要なようだ。
			/*
			 * ??まだmapも使ってないのに・・
			 * <uses-permission android:name="android.permission.INTERNET" />
			 * <uses-library android:name="com.google.android.maps" />
			 */
			GeoPoint gp = new GeoPoint(
					(int) (location.getLatitude() * 1E6),
					(int) (location.getLongitude() * 1E6));
			geoPoints.addFirst(gp);

			// 緯度の取得
			double lat = gp.getLatitudeE6() / 1E6;
			// 経度の取得
			double lng = gp.getLongitudeE6() / 1E6;
			// 地図の中心位置を移動する
			// mMapController.animateTo(gp);
			// tFooter set
			tvFooter.setText("経度=" + lng+",緯度=" + lat + "データ件数=" + geoPoints.size());
		} catch (Exception e) {
			Log.e("LocationListener", "ERROR:" + e);
		}
		mView.invalidate();

	}

	public void onProviderDisabled(String provider) {
		// TODO 自動生成されたメソッド・スタブ

	}

	public void onProviderEnabled(String provider) {
		// TODO 自動生成されたメソッド・スタブ

	}

	public void onStatusChanged(String provider, int status, Bundle extras) {
		// TODO 自動生成されたメソッド・スタブ

	}

}

Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.t103_api_locationservice"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name="Main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <uses-library android:name="com.google.android.maps" />
    </application>

</manifest>