web-dev-qa-db-ja.com

バックグラウンドサービスはサーバー上でGPS位置を送信する必要があります

Androidアプリケーションに問題があります。10分ごとにバックグラウンドGPSロケーションをサーバーに送信するアプリケーションが必要です(ここではWCFサービスが機能しています)。アプリケーションはデータを送信する必要があります。サーバー上で時間を送信するサービスを(テスト目的で)作成しましたが、サービスにGPS位置を取得するためのコードを挿入すると、すべてが失敗します(予期せず停止しました)。

私はあなたがいくつかの受信機か何かを置く必要があることをリードしましたが、今のところ何も機能しません。ですから、誰かが私を助けてくれたらとても嬉しいです。

  <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.biromatik.GPS"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk Android:minSdkVersion="4" />

    <application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name" >
        <activity
            Android:label="@string/app_name"
            Android:name=".ETMGPSServiceActivity" >
            <intent-filter >
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <application
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:name=".MyApplication" >
    <service
        Android:enabled="true"
        Android:name=".MonitorService" >
    </service>
    <receiver
        Android:enabled="true"
        Android:name=".LocationReceiver" >
        <intent-filter >
            <action Android:name="com.biromatik.intent.action.LOCATION" />
        </intent-filter>
    </receiver>
</application>


     <uses-permission Android:name="Android.permission.INTERNET"></uses-permission>
    <uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>
<uses-permission Android:name="Android.permission.SEND_SMS"></uses-permission>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />




</manifest>
13
Mihael Meklav

私はあなたが尋ねたのと同じことをするために私のアプリでこれをしました。

私のサービスでは、これを追加しました:

@Override
public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);
    addLocationListener();
}

private void addLocationListener()
{
    triggerService = new Thread(new Runnable(){
        public void run(){
            try{
                Looper.prepare();//Initialise the current thread as a looper.
                lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

                Criteria c = new Criteria();
                c.setAccuracy(Criteria.ACCURACY_COARSE);

                final String PROVIDER = lm.getBestProvider(c, true);

                MyLocationListener myLocationListener = new MyLocationListener();
                lm.requestLocationUpdates(PROVIDER, 600000, 0, myLocationListener);
                Log.d("LOC_SERVICE", "Service RUNNING!");
                Looper.loop();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }, "LocationThread");
    triggerService.start();
}

public static void updateLocation(Location location)
{
    Context appCtx = MyApplication.getAppContext();

    double latitude, longitude;

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    Intent filterRes = new Intent();
    filterRes.setAction("xxx.yyy.intent.action.LOCATION");
    filterRes.putExtra("latitude", latitude);
    filterRes.putExtra("longitude", longitude);
    appCtx.sendBroadcast(filterRes);
}


class MyLocationListener implements LocationListener
{

    @Override
    public void onLocationChanged(Location location)
    {
        updateLocation(location);
    }
}

注:使用していることを確認してくださいMyApplication.getAppContext();これは、独自のApplicationクラスを使用してコンテキストを追加しているためです。そして私はこれでBroadcastReceiverを持っています:

public class LocationReceiver extends BroadcastReceiver {

    double latitude, longitude;

    @Override
    public void onReceive(final Context context, final Intent calledIntent)
    {
        Log.d("LOC_RECEIVER", "Location RECEIVED!");

        latitude = calledIntent.getDoubleExtra("latitude", -1);
        longitude = calledIntent.getDoubleExtra("longitude", -1);

        updateRemote(latitude, longitude);

    }

    private void updateRemote(final double latitude, final double longitude )
    {
        //HERE YOU CAN PUT YOUR ASYNCTASK TO UPDATE THE LOCATION ON YOUR SERVER
    }
}

アプリケーションクラス:

public class MyApplication extends Application {


    private static Context context;

    /* (non-Javadoc)
     * @see Android.app.Application#onCreate()
     */
    @Override
    public void onCreate() {            
        MyApplication.context=getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

また、マニフェストに両方を追加する必要があります。

<application
    Android:icon="@drawable/icon"
    Android:label="@string/app_name"
    Android:name=".MyApplication" >

    //YOUR ACTIVITIES HERE...

    <service
        Android:enabled="true"
        Android:name=".LocationService" >
    </service>

    <receiver
        Android:enabled="true"
        Android:name=".LocationReceiver" >
        <intent-filter >
            <action Android:name="xxx.yyy.intent.action.LOCATION" />
        </intent-filter>
    </receiver>
</application>

サービスが実行されているかどうかを検出する方法最初のアクティビティでこれを行います。

/**
 * Check location service.
 */
private void checkLocationService()
{
    Log.d("CHECK_SERVICE", "Service running: " + (settings.getBoolean("locationService", false)?"YES":"NO"));

    if(settings.getBoolean("locationService", false))
        return;

    Intent mServiceIntent = new Intent(this, LocationService.class);
    startService(mServiceIntent);
}

明らかに、サービスが実行されている場合は、SharedPreferences(settings)を制御してlocationService変数をtrue/falseに設定する必要があります( onStart)またはそうでない(onDestroy)。

34
SERPRO