たぼさんの部屋

いちょぼとのんびり

T104_API_LocationService_SQLite

f:id:donsuka_kk:20121206004541p:plainf:id:donsuka_kk:20121206004547p:plain

Main.java

package com.example.t103_api_locationservice;

import java.util.LinkedList;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
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.view.View.OnClickListener;
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;

	// SQLite
	DatabaseHelper dbHelper;

	@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("SQLiteのデータを見る");
		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);
		/*
		 * DatabaseHelper インスタンス
		 */
		// データベースヘルパーのインスタンスを作成する(まだデータベースはできない)
		dbHelper = new DatabaseHelper(context, DatabaseHelper.DBNAME, null, DatabaseHelper.DBVER);

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

		/*
		 * listener
		 */
		btn0.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Intent newIntent = new Intent(context, MyDataActivity.class);
				// context.startActivity(newIntent); //ERROR
				// ->PendingIntentを使うべし
				PendingIntent pendingIntent = PendingIntent.getActivity(
						context, 0, newIntent, 0);
				try {
					pendingIntent.send();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

	}

	@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);

			/*
			 * lFooterへ表示するための
			 */
			// 緯度の取得
			double lat = gp.getLatitudeE6() / 1E6;
			// 経度の取得
			double lng = gp.getLongitudeE6() / 1E6;
			// 地図の中心位置を移動する
			// mMapController.animateTo(gp);
			// tFooter set
			tvFooter.setText("経度=" + lng + ",緯度=" + lat + "データ件数="
					+ geoPoints.size());

			/*
			 * SQLiteへ書き込む処理
			 */
			SQLiteDatabase db = dbHelper.getWritableDatabase();
			// sql
			String sql = "";
			sql += "insert into t_latlng 	";
			sql += "(lat , lng ) values ";
			sql += "(" + lat + "," + lng + ");";

			// test
			Log.v("Main", "sql=" + sql);

			db.execSQL(sql);
			// close
			db.close();

		} catch (Exception e) {
			Log.e("LocationListener", "ERROR:" + e);
		}

		// invalidate
		mView.invalidate();

	}

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

	}

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

	}

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

	}

}

DatabaseHelper

package com.example.t103_api_locationservice;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {
	public static final int DBVER = 2;
	public static final String DBNAME = "geo.db";
	public DatabaseHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		
		//test
		Log.v("DatabaseHelper","constractor start");
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//GeoPoint用のテーブルを生成する
		Log.v("DatabaseHelper","onCreate");
		String sql = "";
		sql += "create table t_latlng (";
		sql += " no INTEGER primary key autoincrement";
		sql += ",lat REAL not null";
		sql += ",lng REAL not null";
		sql += ",send_flg integer DEFAULT 0";
		sql += ",del_flg integer DEFAULT 0";
		sql += ")";
		
		Log.v("DatabaseHelper","sql="+sql);
		
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//GeoPoint用のテーブルを生成する
		Log.v("DatabaseHelper","onCreate");
		String sql = "";
		sql += "create table t_latlng (";
		sql += " no INTEGER primary key autoincrement";
		sql += ",lat REAL not null";
		sql += ",lng REAL not null";
		sql += ",send_flg integer DEFAULT 0";
		sql += ",del_flg integer DEFAULT 0";
		sql += ")";
		
		Log.v("DatabaseHelper","sql="+sql);
		
		db.execSQL(sql);
	}

}

MyDataActivity.java

package com.example.t103_api_locationservice;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class MyDataActivity extends Activity {
	Context context;
	Activity activity;
	LinearLayout base;
	View mView;
	Paint paint;
	
	DatabaseHelper dbHelper;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		context = getApplicationContext();
		base = new LinearLayout(context);
		base.setOrientation(LinearLayout.VERTICAL);
		setContentView(base);
		
		//activity
		activity = (Activity)this;	//castしてactivityを保持しておく(finish())するため
		
		/*
		 * db instance
		 */
		dbHelper = new DatabaseHelper(context, DatabaseHelper.DBNAME, null, DatabaseHelper.DBVER);
		
		//paint
		paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.RED);
		//View
		mView = new View(context){
			@Override
			protected void onDraw(Canvas canvas){
				canvas.drawText("SQLiteのデータは", 10, 100, paint);
				
				/*
				 * dbから抽出
				 */
				SQLiteDatabase db = dbHelper.getReadableDatabase();
				String sql = "";
				sql += "select * from t_latlng ;";
				Cursor c = db.rawQuery(sql, null);
				c.moveToFirst();
				for(int i=0;i<c.getCount();i++){
					int no = c.getInt(0);
					Double lat = c.getDouble(1);
					Double lng = c.getDouble(2);
					String str = ""+no+"件目:"+"経度="+lat+",緯度="+lng;
					
					canvas.drawText(str, 10, 150 + 12 * i, paint);
					
					c.moveToNext();
				}
				c.close();
				db.close();
			}
		};
		base.addView(mView, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT , 0 , 1.0F));
		
		//button
		Button btn = new Button(context);
		btn.setText("もどる");
		base.addView(btn);
		
		//listener
		btn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// TODO Auto-generated method stub
				activity.finish();
			}
		});
		
	}
	

}

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" />
        <activity android:name="MyDataActivity"></activity>
    </application>

</manifest>