Serviceが途中で停止している気がするのですが、何が原因でしょうか?どうぞよろしくお願いします。
- 評価
- クリップ 0
- VIEW 972
Serviceで、位置情報を取得して、変更されたら、firebaseに書き込むコードを書いたのですが、
public int onStartCommand(Intent intent, int flags, int startId) {
の中で、startLocation()を呼び出そうとしても呼び出せません。
Serviceが途中で停止している気がするのですが、何が原因でしょうか?
package com.google.android.exoplayer2.demo;
import android.app.Service;
import android.content.Intent;
import android.location.Criteria;
import android.location.LocationManager;
import android.os.Binder;
import android.os.IBinder;
import android.location.LocationListener;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.v4.app.ActivityCompat;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.auth.FirebaseAuth;
public class GpsService extends Service implements LocationListener{
private boolean mResolvingError = false;
final FirebaseDatabase database = FirebaseDatabase.getInstance();
private LocationListener sensorEventListener; // onPause()
public class GpsServiceBinder extends Binder {
public GpsService getService() {
return GpsService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d("onCreate()","呼ばれた");
}
public GpsService() {
}
//serviceだからいらないかも removeupdatesは必要
// @Override
// protected void onPause(){
// super.onPause();
// locationManager.removeUpdates(this);
// mLocationManager.removeUpdates(listener);
// }
protected void initLocationService() {
Log.v("initLocationService()", "呼ばれた");
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //setAccuracyは内部では、https://stackoverflow.com/a/17874592/1709287の用にHorizontalAccuracyの設定に変換されている。
criteria.setPowerRequirement(Criteria.POWER_HIGH);
criteria.setAltitudeRequired(false);
criteria.setSpeedRequired(true);
criteria.setCostAllowed(true);
criteria.setBearingRequired(false);
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);
// locationManager.registerGnssStatusCallback()
// locationManager.requestLocationUpdates(gpsFreqInMillis, gpsFreqInDistance, criteria, this, null);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
String bestProvider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(bestProvider, 6000, 1, this);
}
@Override
public void onLocationChanged(Location location) {
Log.v("onLocationChanged", "呼ばれた");
refreshGeoLocation(location);
}
//LocationListenerのメソッド
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
//ここまで
// 位置情報のリスナーを取得して登録する
//sensorEventListener = new GpsLocationListener(sensorValueTextView);
// public class LocationServiceBinder extends Binder {
// public com.google.android.exoplayer2.demo.GpsService getService() {
// return com.google.android.exoplayer2.demo.GpsService.this;
// }
// }
protected void refreshGeoLocation(Location location){
Log.v("refreshGeoLocation","呼ばれた");
String user = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference ref = database.getReference().child("users").child(user);
DatabaseReference latitudeRef = ref.child("latitude");
DatabaseReference longitudeRef = ref.child("longitude");
latitudeRef.setValue(location.getLatitude());
longitudeRef.setValue(location.getLongitude());
}
@Override
public IBinder onBind(Intent intent) {
Log.v("onBind","呼ばれた");
throw new UnsupportedOperationException("Not yet implemented");
}
private void startLocation() {
Log.d("StartLocation","呼ばれた");
initLocationService();
}
private void stopLocation() {
Log.d("stopLocation","呼ばれた");
//firebase.auth().signOut();これでログアウトはできるが、ログアウトはしない
database.goOffline();
}
//private final LocationListener listener = new LocationListener() {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("onStartCommand","呼ばれた");
String check =intent.getStringExtra("start/stop");
if(check.equals("start")){
startLocation();
Log.d("StartLocation","呼ぶ");
}else if(check.equals("stop")){
stopLocation();
Log.d("StopLocation","呼ぶ");
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
public void movieAdapter(DatabaseReference ref) {
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
//ここで、firebaseの変化を取得して、Toastを表示する
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
//```
Log.v("onChildChanged()","呼ばれた");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.v("onChildRemoved()","呼ばれた");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.v("onChildMoved()","呼ばれた");
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.v("onCancelled()","呼ばれた");
}
};
ref.addChildEventListener(childEventListener);
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
String check =intent.getStringExtra("start/stop");
の部分をデバッグして確認してみてください。 start
か stop
以外の値が入っていませんか? であれば呼ばれないのは正しい動作です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/07/30 03:50