2011-11-11 15 views
12

私のAndroidアプリケーションに問題があります。 10分ごとにサーバーにバックグラウンドのGPS位置情報を送信するアプリケーションが必要です(ここではWCFサービスが動作しています)。アプリケーションは、閉じていてもデータを送信する必要があります。だから私はサーバー上で時間を私に送るサービス(テスト目的のために)を作成しました。しかし、私のサービスにGPSの場所を取得するためのコードを挿入すると、すべてが失敗します(予期せず停止しました)。バックグラウンドサービスはサーバー上の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> 
+0

"私のサービスはすべて失敗します(予期せず停止しました)" - >あなたは何を得ていますか? – Hoff

+0

CatLogで私はこれを得る:11-11 15:25:49.541:E/AndroidRuntime(229):キャッチされていないハンドラ:キャッチされていない例外のためにメインスレッドが終了する –

答えて

33

私はアプリでこれと同じことをしました。

@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); 
    } 
} 

注:私のサービスで

は、私はこれを追加I)は(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 
    } 
} 

Applicationクラス:

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); 
} 

は明らかに、サービス(ONSTART)ないか(onDestroy)を実行している場合は真/偽にlocationService変数を設定するSharedPreferences(設定)を制御する必要があります。

+0

それは完璧に見えるが、まだ問題がある:このxxx.yyy.intent。 ..代わりに何を置き、私もそのMyApplication.getCOntext()に問題がある、他の方法はありますか? –

+0

私が言ったように、xxx.yyy.intent.action.LOCATIONは、あなたのパッケージの名前のように、intent.actionを追加することができます(アプリケーションから拡張するクラスを作成してマニフェストに追加する必要があります) .LOCATIONをもっと具体的にするにはアプリケーションクラスで私の答えを編集します – SERPRO

+0

今すぐ取得します:W/ActivityManager(51):サービスを開始できません。Intent {act = com.biromatik.GPS.MonitorService}:見つかりません。そのサービスを今すぐ開始する方法を教えてもらえますか? –

関連する問題