質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

3417閲覧

Androidで現在地を取ることについて

kokawa2003

総合スコア217

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/10/28 00:35

編集2016/10/28 04:05

やりたいことはANDROIDで定期的に現在地を取得したい(画面なしで)。
さらにそれを常駐させたい。
ということなのです。
まず常駐は
http://language-and-engineering.hatenablog.jp/entry/20120724/AndroidAutoStartingResidentServiceBatch
をみてサービスとして常駐させることができました。
そこでこのサービス開始の時点で以下のように
ざっくり10秒毎に位置取得してみましたが
これではAPP終了時位置が取れなくなります。
これ多分
locationManager = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
のところで画面context=(MainActivity.this)を渡しているせいなのだろうと考えますがどうやって克服すべきかわかりません。
あるいは全くGUIなしでGPSにアクセスする手法があるのでしょうか?
お教えください

lang

1public SamplePeriodicService startResident(Context context) { 2 3 SamplePeriodicService ret = (SamplePeriodicService) super.startResident(context); 4 5 locationManager = (LocationManager) 6 context.getSystemService(Context.LOCATION_SERVICE); 7 8 locationListener = new MyLocationListener(); 9 PackageManager pm=context.getPackageManager(); 10 if (pm.checkPermission( Manifest.permission.ACCESS_FINE_LOCATION,context.getPackageName()) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 11 // TODO: Consider calling 12 // ActivityCompat#requestPermissions 13 // here to request the missing permissions, and then overriding 14 // public void onRequestPermissionsResult(int requestCode, String[] permissions, 15 // int[] grantResults) 16 // to handle the case where the user grants the permission. See the documentation 17 // for ActivityCompat#requestPermissions for more details. 18 return ret; 19 } 20 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, locationListener); 21 22 23 return ret; 24 25 26 27 }

MaiinActivity

lang

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 9 10 { 11 Button button = (Button) findViewById(R.id.button); 12 // ボタンがクリックされた時に呼び出されるコールバックリスナーを登録します 13 button.setOnClickListener(new View.OnClickListener() { 14 @Override 15 public void onClick(View v) { 16 // ボタンがクリックされた時に呼び出されます 17 Button button = (Button) v; 18 Toast.makeText(MainActivity.this, "start", 19 Toast.LENGTH_SHORT).show(); 20 new SamplePeriodicService().startResident(MainActivity.this); 21 } 22 }); 23 24 } 25 { 26 Button button = (Button) findViewById(R.id.button2); 27 // ボタンがクリックされた時に呼び出されるコールバックリスナーを登録します 28 button.setOnClickListener(new View.OnClickListener() { 29 @Override 30 public void onClick(View v) { 31 // ボタンがクリックされた時に呼び出されます 32 Button button = (Button) v; 33 Toast.makeText(MainActivity.this, "stop", 34 Toast.LENGTH_SHORT).show(); 35 SamplePeriodicService.stopResidentIfActive(MainActivity.this); 36 } 37 }); 38 39 } 40 } 41}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

結論
サービスを見直しこれに変更

java

1public class MyService extends Service 2{ 3 private static final String TAG = "BOOMBOOMTESTGPS"; 4 private LocationManager mLocationManager = null; 5 private static final int LOCATION_INTERVAL = 1000; 6 private static final float LOCATION_DISTANCE = 0; 7 8 private class LocationListener implements android.location.LocationListener{ 9 Location mLastLocation; 10 public LocationListener(String provider) 11 { 12 Log.e(TAG, "LocationListener " + provider); 13 mLastLocation = new Location(provider); 14 } 15 @Override 16 public void onLocationChanged(Location location) 17 { 18 Log.e(TAG, "onLocationChanged: " + location); 19 mLastLocation.set(location); 20 } 21 @Override 22 public void onProviderDisabled(String provider) 23 { 24 Log.e(TAG, "onProviderDisabled: " + provider); 25 } 26 @Override 27 public void onProviderEnabled(String provider) 28 { 29 Log.e(TAG, "onProviderEnabled: " + provider); 30 } 31 @Override 32 public void onStatusChanged(String provider, int status, Bundle extras) 33 { 34 Log.e(TAG, "onStatusChanged: " + provider); 35 } 36 } 37 LocationListener[] mLocationListeners = new LocationListener[] { 38 new LocationListener(LocationManager.GPS_PROVIDER), 39 new LocationListener(LocationManager.NETWORK_PROVIDER) 40 }; 41 @Override 42 public IBinder onBind(Intent arg0) 43 { 44 return null; 45 } 46 @Override 47 public int onStartCommand(Intent intent, int flags, int startId) 48 { 49 Log.e(TAG, "onStartCommand"); 50 super.onStartCommand(intent, flags, startId); 51 return START_STICKY; 52 } 53 @Override 54 public void onCreate() 55 { 56 Log.e(TAG, "onCreate"); 57 initializeLocationManager(); 58 try { 59 mLocationManager.requestLocationUpdates( 60 LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 61 mLocationListeners[1]); 62 } catch (java.lang.SecurityException ex) { 63 Log.i(TAG, "fail to request location update, ignore", ex); 64 } catch (IllegalArgumentException ex) { 65 Log.d(TAG, "network provider does not exist, " + ex.getMessage()); 66 } 67 try { 68 mLocationManager.requestLocationUpdates( 69 LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 70 mLocationListeners[0]); 71 } catch (java.lang.SecurityException ex) { 72 Log.i(TAG, "fail to request location update, ignore", ex); 73 } catch (IllegalArgumentException ex) { 74 Log.d(TAG, "gps provider does not exist " + ex.getMessage()); 75 } 76 } 77 @Override 78 public void onDestroy() 79 { 80 Log.e(TAG, "onDestroy"); 81 super.onDestroy(); 82 if (mLocationManager != null) { 83 for (int i = 0; i < mLocationListeners.length; i++) { 84 try { 85 mLocationManager.removeUpdates(mLocationListeners[i]); 86 } catch (SecurityException ex) { 87 Log.i(TAG, "fail to remove location listners, ignore", ex); 88 } 89 } 90 } 91 } 92 private void initializeLocationManager() { 93 Log.e(TAG, "initializeLocationManager"); 94 if (mLocationManager == null) { 95 mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 96 } 97 } 98}

投稿2016/10/28 04:52

kokawa2003

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ActivityからこのServiceを起動していると思うのですが、
単純にActivityを終了する時にこのServiceをストップさせてしまっているしまっていませんか?

参考のために、全体のコードを貼れませんか?

投稿2016/10/28 01:45

ueno

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2016/10/28 03:48

すみませんサービス自体は止まってませんが、gpsのリクエストが止まって座標が取れなくなります
kokawa2003

2016/10/28 04:02

あとMainActivityのコードはボタン押したらサービススタート、違うボタンでストップのみです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問