T104_API_LocationService_SQLite
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>