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

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

ただいまの
回答率

88.09%

Serviceが途中で停止している気がするのですが、何が原因でしょうか?どうぞよろしくお願いします。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 972

score 13

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

String check =intent.getStringExtra("start/stop"); の部分をデバッグして確認してみてください。 start か stop 以外の値が入っていませんか? であれば呼ばれないのは正しい動作です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/30 03:50

    ありがとうございます。確認して見ます。

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • Serviceが途中で停止している気がするのですが、何が原因でしょうか?どうぞよろしくお願いします。